Sonntag, 14. Juni 2015

Arduinos zusammenschalten über I2C

In diesem Artikel geht es darum, wie man mehrere Arduinos/Mikrocontroller zusammenschalten kann. Dadurch können einem nicht die Pins oder die Speicherkapazität ausgehen, da man theoretisch auch mehrere Dutzend zusammenschalten kann, da die Kommunikation jeweils nur 2 Kabel benötigt.

Zur Kommunikation zwischen Mikrocontrollern wurde in den 70er Jahren von Philips das I^2 Protokoll(sprich: I Quadrat C) entwickelt. Diese benötigt nur zwei Kabel zur Verbindung: SDA und SCL. Auf das SCL Kabel wird in regelmäßigen Abständen Spannung angelegt. Diese gibt den Takt an. Also jedes mal wenn die Spannung am SCL Pin auf HIGH gesetzt wird, wird die Spannung vom SDA, quasi dem Datenübertragungspin, genommen und gespeichert/weiterverarbeitet. Beim I^2C Protokoll gibt es einen oder mehrere Master und einen oder mehrere Slaves. Der Unterschied ist, dass ein Master immer senden kann und ein Slave nur, wenn der Master eine Anfrage gestartet hat. In unserem Beispiel wollen wir einfach einen Text versenden und ihn auf der seriellen Konsole ausgeben lassen. Deshalb muss der Mikrocontroller der Master sein und der Arduino der Slave.

Die Verkabelung

Für das I^2C Protokoll kann man normalerweise nicht jeden beliebigen Pin als SDA oder SCL Pin verwenden. Beim ATmega328, dem Kern des Arduino ist der SDA Pin der analog Eingang 4, und der SCL Pin der analog Eingang 5. Lustigerweise gibt es auch zwei extra SDA und SCL Steckplätze oberhalb von digital Pin 13.
Diese sind jedoch exakt die selben, wie analog Pin 4 und 5. Man muss sich also für eine der beiden Optionen entscheiden und dann jeweils den SCL Pin mit dem SCL Pin und den SDA Pin mit dem SDA Pin von Master bzw. Slave verbinden. Zusätzlich brauchen die kommunizierenden Geräte einen gemeinsamen Ground. Man muss also noch die Grounds miteinander verbinden. Wenn man, wie ich, seinen Mikrocontroller über den Arduino mit Strom versorgt geschieht das ja automatisch. Der SDA Pin am ATmega328 ist Pin 27 und der SCL Pin ist Pin 28. Solltest du nicht wissen, wie man einen Mikrocontroller über den Arduino programmiert, beziehungsweise korrekt anschließt empfehle ich dir meinen Post dazu

Der Sketch des Masters

Um das I^2C Protokoll überhaupt verwenden zu können, muss man die Wire Bibliothek nachladen. Diese ist bereits vorinstalliert, weshalb das Einfügen der Zeile #include <Wire.h> genügt. Über Wire.begin(Adresse) wird die I^2C Kommunikation gestartet, wobei jedes Gerät eine Adresse haben sollte. Wenn es nur einen Master gibt, braucht er keine Adresse, ein Slave braucht immer eine Adresse. Über Wire.beginTransmission(AdressedesZiels); wird ein "Gespräch" gestartet, über write(Text) etwas gesendet und über endTransmission(); das "Gespräch" beendet.

Der Sketch des Slaves

Das Neue beim Sketch des Slaves ist, dass im Setup Teil ein neuer Programmteil beim Empfangen einer Nachricht gestartet wird. Durch onReceive(NamedesauszuführendenAbschnitts); wird festgelegt, dass jedes mal wenn ein Gespräch mit dem Slave gestartet wird, der angegebene Programmteil ausgeführt wird. Dort wird über Wire.available geprüft ob noch etwas empfangen wurde und über Wire.read() das letzte Zeichen in einer Variable gespeichert. Wenn wir den oben geschickten Text jetzt empfangen wollen und über die serielle Konsole ausgeben lassen wollen, müssen wir immer zwischen Buchstabe und Zahl unterscheiden. Das geschieht durch die Festlegung des Datentyps der Variable zum Befehl Wire.read();. Der gesamte Sketch sieht dann so aus:
I2C ist eine gute Möglichkeit Geräte miteinander kommunizieren zu lassen, insbesondere, da die Kommunikation nur 2 Kabel/Pins benötigt. Man kann auch nicht nur Mikrocontroller kommunizieren lassen, sondern über I2C auch beispielsweise einen externen EEPROM(Speicher, dessen Inhalt auch ohne Strom gespeichert bleibt) ansteuern.

Keine Kommentare:

Kommentar veröffentlichen