mike10
18.05.2012, 14:51
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:
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:
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
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:
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:
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