-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Arduino meets Roomba

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2012
    Beiträge
    9

    Unglücklich Arduino meets Roomba

    Anzeige

    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

  2. #2
    RN-Premium User Roboter Genie Avatar von 5Volt-Junkie
    Registriert seit
    06.03.2008
    Alter
    30
    Beiträge
    946
    Kannst Du Dein Problem etwas genauer schildern? Kein Erfolg kann vieles bedeuten

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2012
    Beiträge
    9
    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.

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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)?
    Geändert von m.a.r.v.i.n (20.05.2012 um 12:30 Uhr)

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2012
    Beiträge
    9
    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

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2012
    Beiträge
    9
    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

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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).

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2012
    Beiträge
    9
    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

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo mike10,
    So was in der Art, direkt hinter die Lese Funktion:
    Code:
    int c = Serial.read();
    Serial.println(c, HEX);

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] [ARDUINO] 2 Motoren + Servo mit dem Arduino Uno steuern
    Von Torrentula im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 31.08.2011, 17:31
  2. ARDUINO ARDUINO l293D + MegaservoLib
    Von m1ch15inner im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 11.07.2011, 12:50
  3. Akku für Roomba
    Von goara im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 1
    Letzter Beitrag: 12.05.2010, 17:05
  4. Abstandssensoren Roomba
    Von mr.mike im Forum Sensoren / Sensorik
    Antworten: 0
    Letzter Beitrag: 08.03.2009, 16:22
  5. [ERLEDIGT] Roomba Pro Elite Bedienungsanleitung
    Von Andy007007 im Forum Staubsaugerroboter / Reinigungs- und Rasenmähroboter
    Antworten: 0
    Letzter Beitrag: 10.06.2004, 20:15

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •