-
Arduino meets Roomba
Hallo zusammen
Bin ein Neuling und ersuche euch um Rat
Es geht um die Kommunikation zwischen Arduino Uno und einem iRobot Roomba
Das Forum habe ich schon durchsucht, leider keine Infos gefunden.
Folgender Stand meiner Arbeit.
> Die Hardware steht und das Serielle Kabel, ist mit der DIN Buchse des Roomba aud die PINs 0(RX), 1(TX) und 2(Baud) überführt.
> Da dies alles neu für mich ist, habe ich mal gegoogelt und folgendes Demoprogramm auf hackingroomba.com gefunden:
Code:
int rxPin = 0;
int txPin = 1;
int ddPin = 2;
int ledPin = 13;
char sensorbytes[10];
#define bumpright (sensorbytes[0] & 0x01)
#define bumpleft (sensorbytes[0] & 0x02)
void setup() {
// pinMode(txPin, OUTPUT);
pinMode(ddPin, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(57600);
digitalWrite(ledPin, HIGH);
// startet den Roboter
digitalWrite(ddPin, HIGH);
delay(100);
digitalWrite(ddPin, LOW);
delay(500);
digitalWrite(ddPin, HIGH);
delay(2000);
// das ROI, Befehle zu empfangen
Serial.print(128, BYTE);
delay(50);
Serial.print(130, BYTE);
delay(50);
digitalWrite(ledPin, LOW);
}
void loop() {
digitalWrite(ledPin, HIGH);
updateSensors();
digitalWrite(ledPin, LOW);
if(bumpleft) {
spinRight();
delay(1000);
}
else if(bumpright) {
spinLeft();
delay(1000);
}
goForward();
}
void goForward() {
Serial.print(137, BYTE); // DRIVE
Serial.print(0x00,BYTE); // 0x00c8 == 200
Serial.print(0xc8,BYTE);
Serial.print(0x80,BYTE);
Serial.print(0x00,BYTE);
}
void goBackward() {
Serial.print(137, BYTE); // DRIVE
Serial.print(0xff,BYTE); // 0xff38 == -200
Serial.print(0x38,BYTE);
Serial.print(0x80,BYTE);
Serial.print(0x00,BYTE);
}
void spinLeft() {
Serial.print(137, BYTE); // DRIVE
Serial.print(0x00,BYTE); // 0x00c8 == 200
Serial.print(0xc8,BYTE);
Serial.print(0x00,BYTE);
Serial.print(0x01,BYTE); // 0x0001 == spin left
}
void spinRight() {
Serial.print(137, BYTE); // DRIVE
Serial.print(0x00,BYTE); // 0x00c8 == 200
Serial.print(0xc8,BYTE);
Serial.print(0xff,BYTE);
Serial.print(0xff,BYTE); // 0xffff == -1 == spin right
}
void updateSensors() {
Serial.print(142, BYTE);
Serial.print(1, BYTE);
delay(100); // wait for sensors
char i = 0;
while(Serial.available()) {
int c = Serial.read();
if( c==-1 ) {
for( int i=0; i<5; i ++ ) {
digitalWrite(ledPin, HIGH);
delay(50);
digitalWrite(ledPin, LOW);
delay(50);
}
}
sensorbytes[i++] = c;
}
}
Da aber die Bibliothek nicht mehr unterstützt wird, musste „ serial.print (var, BYTE);“ zu „serial.write (var);“ geändert werden. Zudem habe ich statt den Protokollen, Variabeln eingesetzt, das der Datentyp keine „=“ zulässt.
Hier die geänderte Version:
Code:
int rxPin = 0;
int txPin = 1;
int ddPin = 2;
int ledPin = 13;
char sensorbytes[10];
#define bumpright (sensorbytes[0] & 0x01)
#define bumpleft (sensorbytes[0] & 0x02)
void setup() {
//pinMode(txPin, OUTPUT);
pinMode(ddPin, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(57600);
digitalWrite(ledPin, HIGH);
// startet den Roboter
digitalWrite(ddPin, HIGH);
delay(100);
digitalWrite(ddPin, LOW);
delay(500);
digitalWrite(ddPin, HIGH);
delay(2000);
// das ROI, Befehle zu empfangen
Serial.write (128);
delay(50);
Serial.write(130);
delay(50);
digitalWrite(ledPin, LOW);
}
void loop() {
digitalWrite(ledPin, HIGH);
updateSensors();
digitalWrite(ledPin, LOW);
if(bumpleft) {
spinRight();
delay(1000);
}
else if(bumpright) {
spinLeft();
delay(1000);
}
goForward();
}
void goForward() {
int a=0x00;
int b=0xc8;
int c=0x80;
int d=0xff;
int e=0x38;
int f=0x01;
Serial.write(137); // DRIVE
Serial.write(a); // 0x00c8 == 200
Serial.write(b);
Serial.write(c);
Serial.write(a);
}
void goBackward() {
int a=0x00;
int b=0xc8;
int c=0x80;
int d=0xff;
int e=0x38;
int f=0x01;
Serial.write(137); // DRIVE
Serial.write(d); // 0xff38 == -200
Serial.write(e);
Serial.write(c);
Serial.write(a);
}
void spinLeft() {
int a=0x00;
int b=0xc8;
int c=0x80;
int d=0xff;
int e=0x38;
int f=0x01;
Serial.write(137); // DRIVE
Serial.write(a); // 0x00c8 == 200
Serial.write(b);
Serial.write(a);
Serial.write(f); // 0x0001 == spin left
}
void spinRight() {
int a=0x00;
int b=0xc8;
int c=0x80;
int d=0xff;
int e=0x38;
int f=0x01;
Serial.write(137); // DRIVE
Serial.write(a); // 0x00c8 == 200
Serial.write(b);
Serial.write(d);
Serial.write(d); // 0xffff == -1 == spin right
}
void updateSensors() {
Serial.write(142);
Serial.write(1); // sensor packet 1, 10 bytes
delay(100); // wait for sensors
char i = 0;
while(Serial.available()) {
int c = Serial.read();
if( c==-1 ) {
for( int i=0; i<5; i ++ ) {
digitalWrite(ledPin, HIGH);
delay(50);
digitalWrite(ledPin, LOW);
delay(50);
}
}
sensorbytes[i++] = c;
}
}
Leider habe ich noch keinen Erfolg damit
Kann mir da jemand Weiterhelfen?
Vielen Dank
Mike10
-
Kannst Du Dein Problem etwas genauer schildern? Kein Erfolg kann vieles bedeuten ;)
-
Hallo 5Volt-Junkie
Also mit diesen einfachen Befehlen sollte der Roomba geradeaus fahren und Hinternisse vermeiden. Das Problem ist, dass sich nach dem Arduino Upload nichts tut.
-
Hast du einen iRobot Create oder einen Roomba? Der Roomba verwendet ein ähnliches Protokoll aber eine andere Baudrate (115.2kBaud statt 56kBaud). Das Beispiel ist demnach für den Create geschrieben.
Eine gemeinsame GND Verbindung ist zudem notwendig. Die Baud Leitung wird nur benötigt, wenn man mit 19.2kBaud arbeiten will. Sind RX,TX über Kreuz angeschlossen (RX0 Arduino an TX4 Roomba und TX1 Arduino an RX3 Roomba)?
-
Hallo m.a.r.v.i.n
Habe ein Roomba, also die 115,2k. Demzufolge kann ich auf die Baud Leitung verzichten. Betr. GND heisst das, dass der gemeinsame GND vom PIN 6 oder 7 des Roomba auf einen der zwei GNG-PINs des Arduino zu überführen ist?
RX und TX sind nicht gekreuzt angeschlossen, also 3(R) auf 0(A) und 4(R) auf 1(A).
Gruss mike10
-
Hallo mike10,
demnach mußt du dein Programm auf 115.2kBaud anpassen. Die GND Leitung (Pin 6 und 7 vom Roomba) müssen mit GND am Arduino verbunden sein. RX und TX müssen über Kreuz verdrahtet werden, sonst ist Ausgang mit Ausgang verbunden. Im schlimmsten Fall kann dadurch der Roomba und/oder das Arduino board beschädigt werden.
-
Hallo m.a.r.v.i.n
Alle Änderungen sind vorgenommen und der kleine läuft:) Zumindest einmal geradeaus (im loop). Der Bumper spricht als Sensor leider noch nicht an. Gemäss Programm sollte dieser doch ausgewertet werden?
Gruss mike10
-
Hallo mike10,
könnte sein, das der Roomba TX Pin abgeraucht ist.
Ich spreche aus eigener leidvoller Erfahrung. Damals habe ich auf die Beschriftung der Controller Platine (Jeenode board) vertraut und brav RX und TX überkreuz verdrahtet. Leider war die Beschriftung bereits gedreht, mit dem Ergebnis das beim Roomba und dem Controller jeweils der TX Pin abgeraucht sind.
Teste mal ob der Arduino überhaupt etwas empfängt (Serial.write Ausgabe der empfangenen Zeichen).
-
Hallo m.a.r.v.i.n
Oh nein, hoffentlich nicht...das Arduino ist noch zu verkraften, aber nicht der Roomba:(
Bin mir nicht sicher, wie ich das mit dem testen des Arduino anstellen muss. Wird das mit dem Befehl Serial.write(incomingByte) gelöst?
Gruss mike10
-
Hallo mike10,
So was in der Art, direkt hinter die Lese Funktion:
Code:
int c = Serial.read();
Serial.println(c, HEX);