Lego NXT per NXC: Arduino Daten über i2c auslesen/schreiben


hallo,
nachdem ich andernorts  nicht weiterkomme (weiß wohl keiner was) versuche ich mein glück jetzt auch mal hier, auch wenn die chance sicher nicht groß ist, dass ich hier einen kenner finde... aber wer weiß...:

ich möchte einen lego mindstorms nxt als i2c master mit einem arduino verbinden. programmiersprache: nxc.
für java/lejos gibt es eine lösung, die hilft mir aber nicht, weil java ein komplett anderes betriebssystem mit völlig anderen api-funktionen hat als nxc und die intern auch komplett anders arbeiten -  und ich java sowieso niemals nutzen werde.

was ich bisher habe:

a) arduino:

der arduino liest alle 20ms einen taster digital pin 2 aus (taster vcc über 100kohm gegen gnd)
value=digitalread(signalpin);
und gibt das ergebnis ledpin 13 (interne led) aus
digitalwrite(ledpin,value);

bis hierhin funktioniert es.

gleichzeitig wird er als devaddr 0x03 definiert
wire.begin(3);

und soll auf i2c-request den zustand des signalpins als byte den i2c-bus übergeben
void requestevent() {
  wire.write(signalpin); // respond message of 1 byte
}


code: [select]

// arduino slave
// touch sensor external pullup @ pin digital 2
// i2c slave, dev addr. 0x03

#include <wire.h> // serial lib

int  ledpin=13;  
byte signalpin=12;  
byte value=0;  

//*************************************************************************  
void setup()  
{  
 pinmode(ledpin,output);    
 pinmode(signalpin,input);
 
 wire.begin(3);                // join i2c bus dev address 0x03
 wire.onrequest(requestevent); // register event
}  

//*************************************************************************  
 
void requestevent() {
   wire.write(signalpin);         // respond message of 1 byte
}

//*************************************************************************

void loop()  
{  
 value=digitalread(signalpin);    
 digitalwrite(ledpin,value);

 delay(20);  
}                            


b) nxt:

code: [select]

// nxt i2c master

int arduinoreadi2c(byte port, byte devaddr, byte cnt, byte &values[]){

 byte i2cmsg[];
 byte nbyteready = 0;
 int  result = 0;

 // enable / disable address shift:
 // devaddr=devaddr<<1; // ???  arduino uses upper 7 of 8  bits  ???
 
 arraybuild(i2cmsg, devaddr);

 while (i2cstatus(port, nbyteready) == stat_comm_pending){ yield(); }

 result=i2cbytes(port, i2cmsg, cnt, values);
 
 if(!result){
    playtone(100,500);
    wait(750);
    clearscreen();
 }
 return result;
}




task main() {
 int i2cresult;

 byte arduinoport=s4,
      arduinoaddr=0x03,
      i2creply[1],
      cnt=1;
 int  value;


 setsleeptime(0);
 setsensorlowspeed(s4);

 while(true) {

   i2cresult=arduinoreadi2c(arduinoport, arduinoaddr, cnt, i2creply);  // arduino 1 byte
   textout(0,lcd_line1,"i2cresult= ");
   numout(60,lcd_line1, i2cresult, draw_opt_clear_eol );
   
   value=i2creply[0];
   textout(0,lcd_line2,"value0= ");
   numout(48,lcd_line2, value);

   wait(50);
 }

}


leider funktioniert es nicht mit dem nxt-master und dem arduino-slave, der nxt meldet immer einen i2c-verbindungsfehler.

i2c pullups sind 2x4.7k (laut einem lejos-beispiel), scl analog4, sda analog5, alle gnds sind verbunden (arduino analoggnd + arduino digitalgnd + nxt_rot ).

also wo steckt der fehler?

ich nehme mal du hast einen arduino uno:

du hast sda und scl vertauscht.

quote from: http://arduino.cc/en/main/arduinoboarduno
twi: a4 or sda pin , a5 or scl pin. support twi communication using wire library.


grüße uwe


Arduino Forum > International > Deutsch (Moderator: uwefed) > Lego NXT per NXC: Arduino Daten über i2c auslesen/schreiben


arduino

Comments

Popular posts from this blog

opencv3, tbb and rasp pi 2 - Raspberry Pi Forums

small ethernet problem - Raspberry Pi Forums

Multithumb configuration params not working? - Joomla! Forum - community, help and support