Die Kommunikation zwischen Arduino-Board und NXT über den I²C-Bus

Da die NXT-Ports auf vier beschränkt sind, ist ein Arduino-Board hilfreich, wenn mehr Sensoren angeschlossen werden sollen.

Hier wird die Kommunikation zwischen einem Arduino-Board und einem NXT erklärt und zwar über einen Sensoreingang des NXTs.

Man benötigt die folgende Kabelverbindung:
Anschluss Kabelfarbe (Foto) NXT-Farbe
5V Hellgrau Grün
GND (0V) Rot Rot
SCL Braun Orange
SDA Violett Blau


Man kann über diese Verbindung Informationsblöcke zwischen den beiden Systemen hin- und herschicken. Im u.g. Beispiel sendet der NXT den Wert 0 und das Arduinoboard zwei Werte (77 und den Lichtwert), was durch das Array "Daten[2]" im Arduino-Programm beliebig vergrößert werden kann.
Fast alle Erklärungen stehen als Bemerkungen im Programm.

Weitere Hinweise:
- die I²C-Adresse wird NXT-seitig ungewöhnlicherweise als 7-Bit-Adresse angegeben. Deshalb wird sie halbiert. Genaueres steht in der vierten Zeile der Arduinoprogramms.
- der I²C-Bus kommuniziert über die analogen Eingänge A4 und A5. Diese stehen deshalb nicht als Ports zur Verfügung.

Das NXT-Programm

//I2C Kommunikation zwischen NXT und Arduino

byte adresse = 0x18;                                                               // Arduino Adresse
byte anzahl_bytes = 10;                                                         // Anzahl der von Arduinoboard erwarteten Daten/Zahlen
byte gesendet[];                                                                     // Array für gesendete Daten
byte empfangen[];                                                                 // Array für empfangene Daten

int Lese_Arduino()
{
    ArrayBuild(gesendet, adresse, 0x00);                               // Sende den Wert 0 zum Arduinoboard
    I2CBytes(S1, gesendet, anzahl_bytes, empfangen);         // I2C-Kommunikation
    TextOut(10,30,"Arduinowerte: ");
    NumOut( 0,20,empfangen[0]);                                         // Die erste Zahl wird angezeigt
    NumOut(20,20,empfangen[1]);                                       // Die zweite Zahl wird angezeigt
    return(empfangen[0]);
}

task main()
{
    SetSensorLowspeed(IN_1);                                             // Die I2C-Kommunikation wird für Port 1 initialisiert.
    int daten=0;
    while(true)
    {
        daten = Lese_Arduino();                                             // Die Daten vom Arduinoboard werden abgefragt und durch die
                                                                                            // obige Methode Lese_Arduino angezeigt
        Wait(50);
        ClearScreen();
    }
}



Das Arduino-Programm

Die unten gezeigte Datei befindet sich hier.