4.6
Vor allem bei Heimautomatisierungsprojekten kann es sinnvoll sein, zwischen mehreren Geräten zu kommunizieren. Eine der am häufigsten verwendeten Techniken ist das I2C (oder TWI) Protokoll. Das I2C-Protokoll ist eine Methode, die es ermöglicht, mehrere „Master“-Karten und mehrere „Slave“-Karten zu verbinden und mit bis zu 128 Geräten zu kommunizieren. Es ermöglicht asynchrone Verbindungen zwischen mehreren Komponenten, um Informationen über einen „gemeinsamen Bus“ auszutauschen. Wir hatten die Kommunikation über die serielle Schnittstelle (UART genannt) gesehen, die verwendet wird, um den Code über einen Computer an den Arduino zu senden oder um zwei Geräte insbesondere über Bluetooth zu verbinden.
Ausrüstung
- Computer
- Arduino UNO x2 oder mehr
- Jumperkabel M / M x3 mal die Anzahl der Karten
Verbindungsschema des I2C-Busses zwischen Arduino-Boards
Mit dem I2C-Protokoll ist es auch möglich, zwischen verschiedenen Systemen (Sensoren, LCD-Bildschirm, Raspberry Pi, etc.) zu kommunizieren. Ein interessantes Beispiel ist die Kommunikation zwischen mehreren Arduino-Boards. Dafür müssen wir mindestens zwei Programme schreiben, eines für die „Mistress“-Karte (Master) und das andere für die „Slaves“-Karten.
Eine I2C-Kommunikation wird durch einen Zweidraht-Bus (manchmal TWI, Two Wire Interface genannt) und eine Adresse definiert. Die von der I2C-Kommunikation verwendeten Pins sind normalerweise für jedes Gerät festgelegt. Einer, auf dem die Daten gesendet werden (SDA Serial Data Line) und auf dem anderen der Synchronisationstakt (SLC Serial Clock Line).
I2C / TWI Pins:
- Uno, Ethernet A4 (SDA), A5 (SCL)
- Mega2560 20 (SDA), 21 (SCL)
- Leonardo 2 (SDA), 3 (SCL)
- Due 20 (SDA), 21 (SCL), SDA1, SCL1
In diesem Beispiel verwenden wir ein Arduino Uno Board, also die Pins A4 und A5.
Damit die beiden Karten miteinander kommunizieren können, müssen sie korrekt verbunden werden (A4 mit A4 und A5 mit A5) und man darf nicht vergessen, die Masse (GND) wie im folgenden Diagramm zu verbinden.
Achtung: Wenn die Pins A4 und A5 mit den Pins einer nicht mit Strom versorgten Karte verbunden werden, friert der Code bei der Übertragung ein.
Im Allgemeinen sendet eine Karte Informationen (Writer) und eine andere empfängt sie (Reader).
I2C-Bus-Konfigurationscode
Mit der Bibliothek Wire.h lässt sich die serielle Kommunikation auf dem I2C-Bus einfach definieren. Die Funktionen sind ähnlich wie in der Serial-Bibliothek.
- Wire.begin () initialisiert die Geräteadresse. Function argument may be empty for master devices
- Wire.write () allows you to send bytes.
- Wire.requestFrom () handles the request receive function
- Wire.beginTransmission () starts transmitting data and defines the receiver.
- Wire.endTransmission ends data transmission
- Wire.onRequest () handles the request receive function
- Wire.onRecieve () manages the data reception function
Code of the „Master“ card
„Slave“ card code
Open the slave card serial monitor before the master card monitor.
In the serial monitor of the „Master“ card:
In the serial monitor of the „Slave 1“ card:
We can see that the two cards are exchanging information. Es ist sehr einfach, dieses Beispiel auf mehrere Arduino-Boards (Leonardo, Mini, etc.) zu erweitern, indem man die Verdrahtung und die Adresse der Komponenten im „Slave“-Code anpasst.
Code zur Identifizierung der an den I2C-Bus angeschlossenen Geräte
Ein guter Test, um zu wissen, ob Ihre Geräte gut miteinander kommunizieren, ist der untenstehende Code (I2CScanner) ), der alle Adressen der an die Master-Karte angeschlossenen Geräte zurückgibt.