Arduino cursus/i2c

Uit Lab
Naar navigatie springen Naar zoeken springen

I2C library (Wire)

I2C is een protocol om microcontrollers en andere onderdelen aan elkaar te verbinden, via een "bus" met 2 draden: SDA (serial data) en SCL (serial clock).

De I2C-bus heeft een master-slave opzet: dit betekent dat er altijd 1 van de apparaten op de bus als master fungeert, en de rest als slave. In de Arduino-voorbeelden is de Arduino de master, en zijn de andere apparaten slave.

Dit serie-protocol is indertijd door Philips bedacht voor communicatie tussen ic's, met minder aansluitingen en minder draden dan de parallelle communicatie die tot dan toe gebruikelijk was. Het wordt inmiddels voor heel veel onderdelen gebruikt, van geheugens tot sensoren en actuatoren.

Je kunt een Arduino ook als slave laten functioneren: dan kun je twee Arduino's via I2C laten communiceren.

I2C-adres; I2C-scanner

Om een I2C-apparaat (device) vanuit de Arduino te kunnen gebruiken, moet je het I2C-adres van dit device weten. Dit staat vaak in de documentatie van het device. Als je het niet weet, kan de I2C-scanner helpen: deze zoekt alle (slave)devices op de I2C-bus.

Gebruik van de I2C-library: Wire

De I2C-library heet in de Arduino-IDE: Wire, zie: https://www.arduino.cc/en/Reference/Wire

De Arduino-pinnen voor de I2C bus zijn:

  • A4 - SDA
  • A5 - SCL

Andere microcontrollers hebben soms meerdere pinnen die als I2C-bus gebruikt kunnen worden.

Importeren van de library:

  • #include <Wire.h>

Voor het verdere functies en het gebruik daarvan, zie de Arduino-referentie: https://www.arduino.cc/en/Reference/Wire. In veel gevallen heb je die functies niet direct nodig: deze worden gebruikt in de library voor het device. Zie bijvoorbeeld de LiquidCrystal_I2C-library hieronder.

Instellen van I2C adres

Bij sommige devices kun je 1 of meer bits van het I2C-adres instellen. (P.M. voorbeelden)

Hardware: gebruik van pull-up weerstanden

De I2C-bus vereist pull-up weerstanden op de bus (SDA en SCL). Soms zijn deze ingebouwd in de microcontroller en/of in de andere devices. Als dat niet het geval is, of als de ingebouwde pull-up weerstanden te zwak zijn, kan het nodig zijn om extra pull-up weerstanden aan SDA en SCL te verbinden.

  • (P.M. verder uitwerken, voorbeelden)

LiquidCrystal I2C library

Voor het aansturen van een LCD_display heb je gewoonlijk veel aansluitingen nodig. Je kunt ook een I2C-interface op een dergelijk display monteren: je hebt dan nog maar 2 pinnen van de Arduino nodig, die je bovendien kunt combineren met andere I2C-devices. Gebruikte hardware:

Voor dit I2C-interface heb je een speciale versie van de LiquidCrystal library nodig: LiquidCrystal_I2C

Installeren van deze library in de Arduino IDE:

  • ga in de IDE naar Schets->Bibliotheek gebruiken->Bibliotheken beheren
  • zoek naar de genoemde library (versie van Frank den Brabander)
  • klik op "More info" en installeer de nieuwste versie

Na het installeren vind je deze library via het Schets->Bibliotheek gebruiken menu. Voorbeeld-programma's vind je via Bestand->Voorbeelden->LiquidCrystal I2C.

Gebruik van deze library:

  • importeren (via Schets->Bibliotheek gebruiken)
  • declareren van display-object: LiquidCrystal_I2C lcd(0x27,16,2);
    • 0x27 is het i2c-adres van het display, in hexadecimale notatie;
    • 16,2 zijn de afmetingen van het display: 16 tekens breed, 2 regels diep.
  • Setup: lcd.init();
    • en eventueel lcd.backlight(), om het backlight aan te zetten.
  • Loop-functies:
    • lcd.setCursor(col, row): plaats de cursor op regel row en kolom col
    • lcd.print(...): afdrukken van tekst naar het display; de cursor wordt bijgewerkt.

Zie voor de andere functies: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

Opmerking: als het display wel verlicht is, maar er is geen tekst te lezen, dan kun je via de regelaar achterop het I2C-interface het contrast bijstellen totdat de tekst wel leesbaar is.

Voorbeeld-opdracht: Arduino cursus/I2C-LCD display

I2C: BMP280

De BMP280-sensor voor luchtdruk en temperatuur kun je uitlezen via het I2C-protocol. (Dit kan ook via het SPI-protocol.)

Gebruik hiervoor de Adafruit BMP280 library.