BattleBot
09.02.2014, 00:56
Hallo Liebe Roboter-Community,
ich arbeite an einer I2C-Kommunikation zwischen Arduino als Master und RP6-Base als Slave. Da dies für meine Ultraschall/Servo-Anwendung nicht funktioniert, habe ich zwei sehr einfache Programme für den Arduino und den RP6 geschrieben um mit dem Debuggen anzufangen.
Die vereinfachte Anwendung ist wie folgt:
1. Arduino generiert variable x
2. Arduino schreibt sie über I2C in einem RP6-Register
3. RP6 liest Register und kommuniziert diese Variable über USB zum PC-Display
4. Variable wird im Arduino inkrementiert und alles fängt von vorne wieder an.
Leider ist es so, dass den RP6 immer nur die initialisierte Variable wiedergibt (in diesem Fall = 0), so dass ich davon ausgehe, dass der Arduino entweder gar nichts oder an die falsche Stelle im RP6 schreibt. Es ist mir schon klar, dass ich nicht unbeding eine Serie {1, 2, 3, 4, 5, ...} auf dem PC-Dsiplay aufgrund der eingestellten Delays haben werde, aber wenn die Kommunikation funktionieren würde, würde sich die Variable x_arduino auf dem PC-Display zumdindest ändern!
Ich habe mal den Arduino-Sketch und den RP6-C-Code beigefügt. Wenn Ihr irgendeine Idee habt, weshalb das nicht funktioniert, dann wäre ich Euch sehr dankbar!!! (Als RP6-Adresse habe ich 10 verwendet und da Arduino mit dem 7-Bit-Format arbeitet, habe ich dort die Adresse 5 angegeben).
RP6-slave:
#include "RP6RobotBaseLib.h"
#include "RP6I2CslaveTWI.h" // I2C Library Datei einbinden (!!!)
// ACHTUNG: Das muss auch im Makefile eingetragen werden (!!!)
int main(void)
{
initRobotBase();
I2CTWI_initSlave(10); // TWI initialisieren und Adresse 10 einstellen
uint8_t x_arduino = 0;
powerON();
while(true)
{
// irgendein Kommando empfangen und KEIN Schreibzugriff aktiv?
if(I2CTWI_writeRegisters[0] && !I2CTWI_writeBusy)
{
// Register speichern:
x_arduino = I2CTWI_writeRegisters[0];
mSleep(150);
}
writeString("x_arduino = ");
writeInteger(x_arduino, DEC);
writeChar('\n');
mSleep(150);}
return 0;
}
Arduino Master:
#include <Wire.h>
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
}
byte x = 0;
void loop()
{
Wire.beginTransmission(5); // transmit to device #5 in 7Bit-Format, #10 in 8Bit-Format
Wire.write(x); // sends one byte
Wire.endTransmission(); // stop transmitting
x++;
delay(50);
}
ich arbeite an einer I2C-Kommunikation zwischen Arduino als Master und RP6-Base als Slave. Da dies für meine Ultraschall/Servo-Anwendung nicht funktioniert, habe ich zwei sehr einfache Programme für den Arduino und den RP6 geschrieben um mit dem Debuggen anzufangen.
Die vereinfachte Anwendung ist wie folgt:
1. Arduino generiert variable x
2. Arduino schreibt sie über I2C in einem RP6-Register
3. RP6 liest Register und kommuniziert diese Variable über USB zum PC-Display
4. Variable wird im Arduino inkrementiert und alles fängt von vorne wieder an.
Leider ist es so, dass den RP6 immer nur die initialisierte Variable wiedergibt (in diesem Fall = 0), so dass ich davon ausgehe, dass der Arduino entweder gar nichts oder an die falsche Stelle im RP6 schreibt. Es ist mir schon klar, dass ich nicht unbeding eine Serie {1, 2, 3, 4, 5, ...} auf dem PC-Dsiplay aufgrund der eingestellten Delays haben werde, aber wenn die Kommunikation funktionieren würde, würde sich die Variable x_arduino auf dem PC-Display zumdindest ändern!
Ich habe mal den Arduino-Sketch und den RP6-C-Code beigefügt. Wenn Ihr irgendeine Idee habt, weshalb das nicht funktioniert, dann wäre ich Euch sehr dankbar!!! (Als RP6-Adresse habe ich 10 verwendet und da Arduino mit dem 7-Bit-Format arbeitet, habe ich dort die Adresse 5 angegeben).
RP6-slave:
#include "RP6RobotBaseLib.h"
#include "RP6I2CslaveTWI.h" // I2C Library Datei einbinden (!!!)
// ACHTUNG: Das muss auch im Makefile eingetragen werden (!!!)
int main(void)
{
initRobotBase();
I2CTWI_initSlave(10); // TWI initialisieren und Adresse 10 einstellen
uint8_t x_arduino = 0;
powerON();
while(true)
{
// irgendein Kommando empfangen und KEIN Schreibzugriff aktiv?
if(I2CTWI_writeRegisters[0] && !I2CTWI_writeBusy)
{
// Register speichern:
x_arduino = I2CTWI_writeRegisters[0];
mSleep(150);
}
writeString("x_arduino = ");
writeInteger(x_arduino, DEC);
writeChar('\n');
mSleep(150);}
return 0;
}
Arduino Master:
#include <Wire.h>
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
}
byte x = 0;
void loop()
{
Wire.beginTransmission(5); // transmit to device #5 in 7Bit-Format, #10 in 8Bit-Format
Wire.write(x); // sends one byte
Wire.endTransmission(); // stop transmitting
x++;
delay(50);
}