Wire.h (I²C)

Inhaltsverzeichnis

Vorweg

Beispiel

Software holen und installieren

Programmieren

EEPROM.h
Wire.h (I²C)

Servo.h

Links

Ergänzungen, Tipps und Tricks

Wire.h (I²C)

Was hier steht, bezieht sich auf Version 1.6.5 der IDE.

Die Wire-Bibliothek ermöglicht einem Arduino, mit Geräten zu kommunizieren, die das I²C-Protokoll verwenden. Der Vorteil gegenüber der Kommunikation über die serielle Schnittstelle ist, dass über den I²C-Bus mehr als zwei Geräte miteinander kommunizieren können.

Selbstverständlich kann man nicht nur spezielle I²C-Geräte, sondern auch mehrere Arduinos an den I²C-Bus anschließen. Jedes am Bus angeschlossene Gerät erhält eine eigene Adresse. Da die Adresse 7 Bit breit ist, können bis zu 112 Geräte an einen I²C-Bus angeschlossen werden (16 der 128 möglichen Adressen sind für Sonderzwecke reserviert).

Der I²C-Bus ist eine Entwicklung von Philips (heute NXP Semiconductors). Wer mehr darüber wissen möchte, sollte sich den entsprechenden Eintrag in der Wikipedia ansehen.

Ab und zu wird der I²C-Bus als Two-Wire-Interface oder TWI bezeichnet.

Ein I²C-Bus benötigt zwei Leitungen: SCL für ein Taktsignal und SDA für Daten. Da ältere Arduinos für diese beiden Leitungen keine separaten Anschlüsse haben, verwendet man bei diesen Boards die Leitungen A4 und A5:

A4=SDA
A5=SCL

Der Schaltplan eines aktuellen Arduinos zeigt, dass SDA- und SCL-Anschluss weitergeführte A4- bzw. A5-Anschlüsse sind.

Wenn ein Arduino an einen I²C-Bus angeschlossen ist, stehen die analogen Eingänge A4 und A5 nicht mehr für andere Dinge zur Verfügung.

Die Busleitungen müssen mit Pull-up-Widerständen ausgestattet werden. Schematische Darstellung eines I²C-Busses:

I2C-Bus

Um diese Bibliothek in eigenem Code zu verwenden, muss sie mittels

#include <Wire.h>

eingebunden werden. Wer das nicht eintippen möchte, wählt im Editor den Menüpunkt Sketch → Include Library … → Wire.

Die Wire-Bibliothek stellt folgende Befehle zur Verfügung:

Die Befehle sind mit der jeweiligen Seite der Referenz bei arduino.cc verknüpft. Dort finden sich häufig auch Codebeispiele.

Wire.begin(Adresse)
Initialisiert die Bibliothek und meldet den Arduino mit der angegebenen Adresse am I²C-Bus an. Soll der Arduino als Busmaster angemeldet werden, entfällt die Adresse.
Wire.requestFrom(Adresse, Anzahl[, stop])
Fordert vom angegebenen Gerät die angegebene Anzahl von Bytes an. Der dritte (optionale) Parameter gibt an, ob der I²C-Bus nach dem Senden der Anforderung wieder freigegeben wird: true (default) bedeutet, dass der Bus wieder freigegeben wird, false sorgt dafür, dass der Bus „besetzt“ bleibt. Sinnvoll ist zweiteres dann, wenn man mehrfach Daten abfragen und verhindern möchte, dass ein anderer Busteilnehmer „dazwischenfunkt“.
Wire.beginTransmission(Adresse)
Bereitet eine Datenübertragung an das Gerät mit der angegebenen Adresse vor. Anschließend werden die zu übertragenden Daten mit einem oder mehreren Wire.write()-Befehl(en) in einen Puffer geschrieben. Mit dem Aufruf von Wire.endTransmission() werden die Daten übertragen.
Wire.endTransmission()
Überträgt die gepufferten Daten an das mit Wire.beginTransmission() angegebene Gerät.
Wire.write()
Mit diesem Befehl befüllt man den Sendepuffer mit den Dingen, die beim Aufruf von Wire.endTransmittion() gesendet werden sollen. Beispiele:
Wire.write(5); schreibt die Zahl 5 in den Puffer.
Wire.write("Hallo"); schreibt „Hallo“ in den Puffer.
Wire.available()
Gibt die Anzahl der Bytes zurück, die sich im Empfangspuffer befinden. Man kann diesen Befehl zum Beispiel im Kopf einer while-Schleife benutzen. Die Schleife wird dann durchlaufen, so lange sich etwas im Empfangspuffer befindet. Beispiel:
while(Wire.available())
{ Serial.print(Wire.read()); }
Wire.read()
Liest ein Zeichen aus dem Empfangspuffer. Siehe das Beispiel bei Wire.available().
Wire.onReceive(Funktion)
Bestimmt die angegebene Funktion als diejenige Funktion, die aufgerufen wird, wenn Daten über den I²C-Bus empfangen wurden. Die Funktionsdefinition kann einen Parameter enthalten, mit dem die Zahl der eingetroffenen Bytes übergeben werden kann.
Beispiel: Wire.onReceive(I2C_receive);
Die Definition dieser Funktion beginnt dann beispielsweise mit void I2C_receive(int num_bytes) {…
Achtung: Der Typ des Parameters der Funktion muss int sein, sonst gibt es beim Compilieren eine Fehlermeldung.
Wire.onRequest(Funktion)
Bestimmt die angegebene Funktion als diejenige Funktion, die aufgerufen wird, wenn Daten angefordert werden (siehe Wire.requestFrom()). Diese Funktion erhält keine Daten und gibt auch nichts zurück.
Beispiel: Wire.onRequest(requestHandler);
Die Definition dieser Funktion sieht dann beispielsweise so aus:
void requesthandler() {…}

Möglicherweise irritiert, dass man bei Wire.requestFrom() zwar die Anzahl angeforderter Bytes angibt, die Funktion für Wire.onRequest() aber nichts davon erfährt. Grund ist die Art, wie diese Kommunikation abläuft: Der Adressat der Anfrage wird lediglich aufgefordert, mit dem Senden zu beginnen. Sobald genügend Bytes empfangen wurden, wird ihm wieder „das Wort entzogen“.

Weiter zu: Servo.h


Nach oben Inhaltsverzeichnis

Valid HTML 4.01 Transitional