Verbindung zwischen Arduino und Mindstorms NXT über I²C

Wie zuvor berichtet habe ich es geschafft eine Verbindung zwischen Arduino und NXT über I²C einzurichten. Der NXT ist der Master und der Arduino der Slave. Theoretisch könnte ich beliebig viel Arduinos an eine NXT Sensor Port anschließen und mit ihnen kommunizieren.

Der Aufbau ist spielend einfach, denn man braucht außer ein paar Kabeln noch zwei 47k Widerstände. Das schwerste ist, eine Vernünftige Buchse für das NXT-Kabel zu bauen. Man kann es natürlich auch gleich zerschneiden. Danach verbindet man ROT mit GND, GRÜN mit 5V, GELB mit A4 und BLAU mit A5. Zuletzt steckt man noch die beiden 47k Widerstände zwischen GELB und GRÜN und BLAU und GRÜN.

Schaltplan

Schaltplan

Ich habe erstmal die Programme von Adam Fourney für den NXT und Arduino benutzt.

Bald werde ich einen ArduinoSensor schreiben. Hier erstmal der Code von Adam Fourney (Lizenz: Creative Commons BY-SA):

Arduino

 /*
  * Adapted from Gatsu's post on Arduino's forums:
  * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1262353163
  */
#include <Wire.h>

int ADDRESS = 0x43;   // The Arduino's I2C Address

uint8_t SensorVersion[9]  = "V0.1    ";
uint8_t SensorName[9]     = "Arduino ";
uint8_t SensorType[9]     = "Exprmntl";

byte x = 0;
byte val = 0;
byte sendbuffer[] = {0};

void setup() {
    Wire.begin(ADDRESS);
    Wire.onReceive(receiveEvent);
    Wire.onRequest(requestEvent);
}

void loop() {
  // This could be any code used to read a sensor.
  // In this simple example, we just count up once a second
  val++;
  delay(1000);
}

void receiveEvent(int howMany) {
    if (Wire.available() >0 ) {
        x = Wire.read(); // receive register address (1 byte)
    }
}

void requestEvent() {
    if (x == 0x00) {
        Wire.write(SensorVersion, 8);
    }
    else if (x == 0x08) {
        Wire.write(SensorName, 8);
    }
    else if (x == 0x10) {
        Wire.write(SensorType, 8);
    }
    else if (x == 0x42) {
        sendbuffer[0] = val;
        Wire.write(sendbuffer, 1);
    }
}

Mindstorms NXT

import lejos.nxt.*;

public class TalkToArduino {

     /* The Lego/NXT uses 8-bit I2C addresses in the range 0x02-0xFE,
      * where the low bit is always zero. Many devices (like the Arduino)
      * use 7-bit addresses in the range 0x01-0x7F. To compensate, 7-bit
      * addresses must be shifted left one place (multiplied by 2).
      * This issue cost me hours of frustration.
      */
    private static int ARDUINO_ADDRESS = 0x43 << 1;

    public static void main (String[] args) {
        I2CSensor arduino = new I2CSensor(SensorPort.S1);
        arduino.setAddress(ARDUINO_ADDRESS);

        byte [] buf = new byte[1];
        buf[0] = 0;

        LCD.setAutoRefresh(false);

        while(!Button.ESCAPE.isPressed()){
            LCD.clear();
            int result = arduino.getData(0x42, buf, 1);

            if (result == -5) {
                LCD.drawString("Not connected", 0, 0);
            }
            else if (result == -3) {
                LCD.drawString("Bus error", 0, 0);
            }
            else {
                LCD.drawString("Name: " + arduino.getProductID(), 0, 0);

		// If LeJOS version 0.9, then use this line
                LCD.drawString("Type: " + arduino.getSensorType(), 0, 1);

                // Else if LeJOS version 0.9.1 and above, then use this line instead of the previous
                // LCD.drawString("Vendor: " + arduino.getVendorID(), 0, 1);

                LCD.drawString("Version: " + arduino.getVersion(), 0, 2);
                LCD.drawString("===============", 0, 3);
                LCD.drawString("Value: " + buf[0], 0, 4);
            }

            LCD.refresh();
            try{Thread.sleep(100);}catch(Exception e) {}
        }
    }
}

2 Gedanken zu „Verbindung zwischen Arduino und Mindstorms NXT über I²C

  1. Pingback: ArduinoLib für den Mindstorms NXT | backsite

  2. Vielleicht könntest du in deinem Beispiel noch die folgende Codezeile ergänzen.
    I2CSensor arduino = new I2CSensor(SensorPort.S1, ARDUINO_ADDRESS, I2CPort.LEGO_MODE, I2CPort.TYPE_LOWSPEED);

    LG aus Berlin

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s