Pages: [1] 2   Go Down
Author Topic: Roboter prog. funktioniert nicht  (Read 917 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo
Ich hbae mir einen roboter selbst gebaut, die Hardware funktioniert (mehrmals getestet). Ich habeals Motor treiber schaltung einfach die von dem robot rover von robotschop.com abgekupfert. Alls abstandssensoren habe ich den GP2Y0D810ZOF (digitaler ir entfernungsmesser von sharp) genommen. Ansosten habe ich noch den Arduino Uno in verwendung. Die aufgabe von dem Programme ist: durch die Gegend zu fahren ohne anzustoßen. Doch es funktioniert einfach nicht! Ich habe alles mögliche ausprobiert aber es wiel nicht. Kann mir vielleicht jemand helfen?
Der MotorSpeed gibt an wie schnel der Motor sich drehen soll. Wenn MotorControll LOW ist dreht sich der Motor vorwährts, bei HIGH ist das gegenteil.

Dies ist eine vereinfachte Version von dem fertigen Programm:

Der Roboter fehrt und fert einfach und reagiert nicht. Die LED leute die ganze zeit.

 
Code:
 
  int MotorSpeedL = 5;
  int MotorSpeedR = 6;
  int MotorControlL = 7;
  int MotorControlR = 4;
  
  volatile boolean Gegenstand_links;
  volatile boolean Gegenstand_rechts;
  
  int led = 13;
  volatile int state = LOW;

void setup()
{
  pinMode(led, OUTPUT);
  attachInterrupt(0, setze_status_Gegenstand_links, FALLING);
  attachInterrupt(1, setze_status_Gegenstand_rechts, FALLING);
  Gegenstand_links  = false;
  Gegenstand_rechts = false;
}

void loop()
{

  if(Gegenstand_rechts == true);{
      digitalWrite (MotorControlL, LOW);
      digitalWrite (MotorControlR, LOW);
      digitalWrite (MotorSpeedL, 200);
      digitalWrite (MotorSpeedR, 200);
      delay(600);
      digitalWrite (MotorSpeedL, 0);
      digitalWrite (MotorSpeedR, 0);
      Gegenstand_rechts = false;
      Gegenstand_links = false;
      digitalWrite(led, LOW);
  }
   if(Gegenstand_links == true);{
      digitalWrite (MotorControlL, LOW);
      digitalWrite (MotorControlR, LOW);
      digitalWrite (MotorSpeedL, 200);
      digitalWrite (MotorSpeedR, 200);
      delay(600);
      digitalWrite (MotorSpeedL, 0);
      digitalWrite (MotorSpeedR, 0);
      Gegenstand_rechts = false;
      Gegenstand_links = false;
      digitalWrite(led, LOW);
  }
}

 void setze_status_Gegenstand_links(){
    digitalWrite(led, HIGH);
     Gegenstand_links = true;
  }
 
  void setze_status_Gegenstand_rechts(){
    digitalWrite(led, HIGH);
    Gegenstand_rechts = true;
  }

Dies ist das eig. fertige Programm:
Der Roboter fährt immer gerade aus und reagiert nicht.

Code:
 int led = 13;  
  int MotorSpeedL = 5;  
  int MotorSpeedR = 6;  
  int MotorControlL = 7;  
  int MotorControlR = 4;
  
  int sensorLinks = 3;
  int sensorRinks = 2;
  
  volatile boolean Gegenstand_links;
  volatile boolean Gegenstand_rechts;  
  
  void setup(){
    pinMode (MotorSpeedL, OUTPUT);
    pinMode (MotorSpeedR, OUTPUT);
    pinMode (MotorControlL, OUTPUT);
    pinMode (MotorControlR, OUTPUT);
    attachInterrupt(0,setze_status_Gegenstand_rechts, CHANGE);
    attachInterrupt(1,setze_status_Gegenstand_links, CHANGE);
    Gegenstand_links  = false;
    Gegenstand_rechts = false;
  }
  
  
  void loop(){    
    vorwaerts_fahren(100, 255);    
      if(Gegenstand_links == true){
        zurueck_fahren(300, 200);
        rechts_schwenk(2500, 200);
        Gegenstand_links = false;
        digitalWrite(led, LOW);
      }
      if(Gegenstand_rechts == true){
        zurueck_fahren(300, 200);
        links_schwenk(2500, 200);
        Gegenstand_rechts = false;        
        digitalWrite(led, LOW);
      }
  }
  
   int zurueck_fahren(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, HIGH);
      digitalWrite (MotorControlR, HIGH);
      digitalWrite (MotorSpeedL, geschwindigkeit);
      digitalWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      digitalWrite (MotorSpeedL, 0);
      digitalWrite (MotorSpeedR, 0);
      return 0;
  }
  
  int vorwaerts_fahren(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, LOW);
      digitalWrite (MotorControlR, LOW);
      digitalWrite (MotorSpeedL, geschwindigkeit);
      digitalWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      digitalWrite (MotorSpeedL, 0);
      digitalWrite (MotorSpeedR, 0);
      return 0;
  }

 int rechts_schwenk(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, HIGH);
      digitalWrite (MotorControlR, LOW);
      digitalWrite (MotorSpeedL, geschwindigkeit);
      digitalWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      digitalWrite (MotorSpeedL, 0);
      digitalWrite (MotorSpeedR, 0);
      return 0;
  }
  
  int links_schwenk(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, LOW);
      digitalWrite (MotorControlR, HIGH);
      digitalWrite (MotorSpeedL, geschwindigkeit);
      digitalWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      digitalWrite (MotorSpeedL, 0);
      digitalWrite (MotorSpeedR, 0);
      return 0;
  }
  
  void setze_status_Gegenstand_links(){
    digitalWrite(led, HIGH);
    //Gegenstand_links = true;
  }
 
  void setze_status_Gegenstand_rechts(){
    digitalWrite(led, HIGH);
    //Gegenstand_rechts = true;
  }

Hoffe jemand hat eine Idee was das Problemm sein könnte. Freue und bedanke mich jetzt schon für und auf die Antworten   LG Seykool
« Last Edit: January 14, 2012, 02:54:09 pm by uwefed » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20182
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Außer, daß es nicht schlecht wäre, wenn Du ein paar Worte verlieren würdest, wie Dein Robotter aussieht und wie Du ihn ansteuerst:
Ich nehme mal an er hat 2 Motore und wird über 2 H-Brücken angesteuert.

Das erste Sketch, richtig geschrieben, kann eigentlich gar nicht funktionieren, da sich die Motore nur drehen, wenn ein Sensor ein Hindernis erfaßt. Aber Du hast einen Fehler gemacht:
Code:
if(Gegenstand_rechts == true);{
      ...
  }
Da darf kein Strichpunkt nach dem if sein, da dieser die if-Bedingung beendet. Alle Funktionen in den geschwungenen Klammern werden ausgeführt, da sie nicht an die if-Bedingung geknüpft sind.

Ich würde auf keinen Fall die Sensoren durch Interruptaufrufe abfragen, sonder einfach in der if Bedingung (ich glaube zu verstehen daß der Sensor LOW gibt wenn er einen Gegenstand erfaßt):
Code:
if(sensorLinks == LOW){
      ...
  }

Zum 2. Sketch:
In den Interruptroutinen setzt Du ja keine Variable, die Du dann, kontrollierst um eine Kurve zu fahren darum fährt der Roboter geradeaus.
Code:
void setze_status_Gegenstand_links(){
    digitalWrite(led, HIGH);
    //Gegenstand_links = true;
  }
Außerdem fehlt die Funktion pinMode() für das LED.

Grüße Uwe
« Last Edit: January 14, 2012, 04:59:23 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Srry wegen den fehlenden angaben  smiley-confuse ich war in zeit druck wollte den post aber noch machen bevor ich weg fahre   smiley-small.
Also der Roboter hat 2 Motoren und 2 Ketten, dazwischen ist ein zahnrad getriebe. Er ist in etwa ab gesehen von material und auch ein wenig der Masse, der selbe wie dieser hir: http://www.robotshop.com/eu/dfrobotshop-rover-tracked-robot-basic-kit-15.html
Auserdem muss ich leider korigieren bei dem 2. sktech fährt er einfach immer 180C nach rechts dan nach links dan nach recht.....
Mein handy kann irgent wie keine verbindung zum PC herstelllen sonst hätte ich auch bilder reingestellt smiley-yell
okay das im ersten sketch war echt dumm  heit von mir smiley-eek-blue doch erfunktioniert jetzt auch schon mal herzlichen danke smiley
Doch der andere Sketch funktioniert einfach nicht smiley-yell, er fährt einfach immer 180C nach rechts dan nach links dan nach recht..... Ich verstehe einfach nicht warum ?? trotz korektur...
Vielleicht hat ja jemand eine Idee was mein Problem ist.

Würde mich sehr freuhen

LG Seykool
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eine Sache die mir aufgefallen ist, wäre das setzen der Geschwindigkeit.
z.B.
Code:
   int zurueck_fahren(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, HIGH);
      digitalWrite (MotorControlR, HIGH);
      digitalWrite (MotorSpeedL, geschwindigkeit);
      digitalWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      digitalWrite (MotorSpeedL, 0);
      digitalWrite (MotorSpeedR, 0);
      return 0;
  }
digitalWrite() schreibt entweder HIGH oder LOW auf einen Ausgang. Ist das so gewollt, das die Motoren immer 100% drehen oder gar nicht? Sollte das per PWM gemacht werden, hast Du leider die falsche Funktion genutzt. "analogWrite()" ist da dein Freund. Die Pins die verwendet werden sind zumindest schonmal PWM Ausgänge.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

mal was generelles: Wenn du von einer Funktion keinen Rückgabewert verlangst (also eine reine Subroutine ansprichst), dann benutze einfach "void das_ist_mein_funktionsname(int mein_parameter){} und lass das "return 0;" weg. 1. ist es gut sich anzugewöhnen zwischen Funktionen und Subroutinen zu unterscheiden und 2. sparst du dir immer ein paar Byte an Speicherplatz.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Okay herzlichen danke für diese Grundkenntnise. Hab halt mit der Arduino sache neben der schule leider noch nicht so viel gemacht  smiley-red
Ich habe das Programm jetzt dem entsprechend umgeschrieben doch es funktioniert immer noch nicht. Also der roboter fährt 1 sec. nach hinten dan dreht er sich ímmer nach rechts dan ach links usw. bei jedem richtung wechsel fährt er noch mal 1 sec rückwährts.... Die LED leuchtet nicht.

Freundliche Grüße Seykool
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann poste doch das angepasste Programm nochmal. Fehler in einer Software zu finden ist keine einmalige Sache, sondern ein kontinuierlicher Prozess. Schritt für Schritt werden Fehler gefunden und verbessert. Irgendwann geht es dann.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Okay danke für den tipp:D

Also der Robter fährt immer rechtes rum dan kurtz nach hinten dan links rum dan wider kurtz nach hinten und immer  so weiter smiley-sad

Liebe grüße Seykool



  int led = 13;
 
  int MotorSpeedL = 5;
 
  int MotorSpeedR = 6;
 
  int MotorControlL = 7;
 
  int MotorControlR = 4;
 
  int sensorLinks = 3;
  int sensorRinks = 2;
 
  volatile boolean Gegenstand_links;
  volatile boolean Gegenstand_rechts;
 
 
 
 
  void setup(){
    pinMode (MotorSpeedL, OUTPUT);
    pinMode (MotorSpeedR, OUTPUT);
    pinMode (MotorControlL, OUTPUT);
    pinMode (MotorControlR, OUTPUT);
    attachInterrupt(0,setze_status_Gegenstand_rechts, CHANGE);
    attachInterrupt(1,setze_status_Gegenstand_links, CHANGE);
    Gegenstand_links  = false;
    Gegenstand_rechts = false;
  }
 
 
  void loop(){
   
    vorwaerts_fahren(100, 255);
   
      if(Gegenstand_links == true){
        zurueck_fahren(300, 200);
        rechts_schwenk(2500, 200);
        Gegenstand_links = false;
        digitalWrite(led, LOW);
      }
      if(Gegenstand_rechts == true){
        zurueck_fahren(300, 200);
        links_schwenk(2500, 200);
        Gegenstand_rechts = false;       
        digitalWrite(led, LOW);
      }
  }
 
   void zurueck_fahren(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, HIGH);
      digitalWrite (MotorControlR, HIGH);
      analogWrite (MotorSpeedL, geschwindigkeit);
      analogWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      analogWrite (MotorSpeedL, 0);
      analogWrite (MotorSpeedR, 0);

  }
 
  void vorwaerts_fahren(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, LOW);
      digitalWrite (MotorControlR, LOW);
      analogWrite (MotorSpeedL, geschwindigkeit);
      analogWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      analogWrite (MotorSpeedL, 0);
      analogWrite (MotorSpeedR, 0);

  }

 void rechts_schwenk(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, HIGH);
      digitalWrite (MotorControlR, LOW);
      analogWrite (MotorSpeedL, geschwindigkeit);
      analogWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      analogWrite (MotorSpeedL, 0);
      analogWrite (MotorSpeedR, 0);
     
  }
 
  void links_schwenk(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, LOW);
      digitalWrite (MotorControlR, HIGH);
      analogWrite (MotorSpeedL, geschwindigkeit);
      analogWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      analogWrite (MotorSpeedL, 0);
      analogWrite (MotorSpeedR, 0);
     
  }
 
  void setze_status_Gegenstand_links(){
    digitalWrite(led, HIGH);
    Gegenstand_links = true;
  }
 
  void setze_status_Gegenstand_rechts(){
    digitalWrite(led, HIGH);
    Gegenstand_rechts = true;
  }
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bitte beim nächsten Posten die "code" Tags verwenden. Das macht das Lesen einfacher.
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Du hast noch immer nicht beachtet, was Uwe bereits sagte: Verzichte doch bitte auf die Interruptroutinen! Ein einfaches Pollen (Abfrage nach hindernissen in der loop) ist hier wohl angebrachter. Der Grund: Dir fehlt schlichtweg die Programmiererfahrung, um abzuschätzen, was du mit den Interrupten eigentlich bewirkst. Beispielsweise sind diese auf CHANGE gesetzt, soll das tatsächlich so sein? Wenn ja, warum?
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, ich würde erstmal schrittweise vorgehen.

1. Schritt: keine Gegenstandserkennung. "Nur" ein dummes Sketch, das die Funktionen "vorwärts fahren", "rückwärts fahren", "links rum" und "rechts rum" testet. Damit kannst Du schon mal ausschliessen, das hier ein Fehler drin steckt.

2. Schritt: keine Bewegung. Nur die Sensoren per Interrupt abfragen und den Status in der Loop nach serial ausgeben. Damit kannst Du prüfen, ob die Sensoren so arbeiten wie Du es erwartest.

Danach kann dann wieder alles zusammengebaut werden.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wegen den Interrupt: das Programm soll ja später noch vil mehr machen und wen es dan gerade in void loop an einer anderen stelle ist fährt er gegen die wand. Also fals das net stimmt das hat mir mein Vatter so beschrieben.
Wie verwende ich die code tags? bin nen neuling was forem angehen smiley-sad

Und mit dem einzelen testen das habe ich alles schon gemacht jede funktion vorwährts rückwährst rechts rum links rum.... wenn der Interrupt nur ne LED an machen soll und dan wider aus macht er das auch, Nur wen  er auch noch fahren soll dan irgent wie nicht.

Freundliche grüße Seykool
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ob Du nun per Interrupt speicherst, ob ein Hinderniss erkannt wurde und das nur einmal im Loop auswertest, oder ob du an der entsprechenden Stelle prüfst, ob ein Hindernis da ist, ist egal. Durch die Interrupt Routine reagierst Du ja trotzdem nicht schneller.
Du kannst im übrigen den Roboter auch so stellen, das die Räder "in der Luft" hängen und nur drehen, ohne das eine Bewegung stattfindet. Dann kannst du den Arduino per USB Kabel an die serielle Konsole stecken und einfach mal debugausgaben der einzelnen Variablen und Zustände deines Programms ausgeben.Hindernisse kannst du an den Sensoren mit der Hand simulieren.
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Klar soll der Roboter später mal mehr können, trotzdem solltest du so programmieren, dass die loop möglichst schnell abgearbeitet werden kann. Und das Pollen kostet kaum Zeit. Wenn du denkst, damit irgendwann eine unsaubere Programmierung ausgleichen zu können, wenn du jetzt für solch trivialen Sachen Interrupte verwendest (die du evtl. später für wirklich komplizierte Dinge brauchen könntest smiley-wink), dann liegst du komplett falsch.
Und eine Frage bist du mir schuldig geblieben: Warum CHANGE?
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

okay also Mit dem CHANGE hat es auf sich das mein Vatter mel versucht hat es zu machen. Und ich wusste nicht das es noch auf CHANGE ist aber das tut eig auch nicht zur Sache den es reagiert ja so oder so nicht.
Mit dem seriall dings debug geht nicht weil die Motoren bis zu 800ma ziehen und durch USB nur 500 gehen können.Deshalb mache ich das immer mir einer speciellen strom versorgung.Und selbst wenn damit hab ich noch nie was gemacht und dan würde es erst recht nicht funktionieren, den ich bin im arduino buch noch net so weit smiley-grin.

Ich habe das Programm jetzt ohne Interrupts mal getestet jetzt fährt der Roboter nur grade aus reagiert aber immer noch nicht egal wie lange ich die hand vor den Sensorhalt smiley-sad

Code:
  int led = 13;
 
  int MotorSpeedL = 5;
 
  int MotorSpeedR = 6;
 
  int MotorControlL = 7;
 
  int MotorControlR = 4;
 
  int sensorLinks = 3;
  int sensorRinks = 2;
 
 
  void setup(){
    pinMode (MotorSpeedL, OUTPUT);
    pinMode (MotorSpeedR, OUTPUT);
    pinMode (MotorControlL, OUTPUT);
    pinMode (MotorControlR, OUTPUT);
    pinMode (sensorRinks, INPUT);
    pinMode (sensorLinks, INPUT);
  }
 
 
  void loop(){
   
    vorwaerts_fahren(100, 255);
   
   
      if(sensorLinks == LOW){
        zurueck_fahren(300, 200);
        rechts_schwenk(2500, 200);
        digitalWrite(led, LOW);
      }
      if(sensorRinks == LOW){
        zurueck_fahren(300, 200);
        links_schwenk(2500, 200);
        digitalWrite(led, LOW);
      }
  }
 
   void zurueck_fahren(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, HIGH);
      digitalWrite (MotorControlR, HIGH);
      analogWrite (MotorSpeedL, geschwindigkeit);
      analogWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      analogWrite (MotorSpeedL, 0);
      analogWrite (MotorSpeedR, 0);

  }
 
  void vorwaerts_fahren(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, LOW);
      digitalWrite (MotorControlR, LOW);
      analogWrite (MotorSpeedL, geschwindigkeit);
      analogWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      analogWrite (MotorSpeedL, 0);
      analogWrite (MotorSpeedR, 0);

  }

 void rechts_schwenk(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, HIGH);
      digitalWrite (MotorControlR, LOW);
      analogWrite (MotorSpeedL, geschwindigkeit);
      analogWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      analogWrite (MotorSpeedL, 0);
      analogWrite (MotorSpeedR, 0);
     
  }
 
  void links_schwenk(int dauer, int geschwindigkeit)
  {
      digitalWrite (MotorControlL, LOW);
      digitalWrite (MotorControlR, HIGH);
      analogWrite (MotorSpeedL, geschwindigkeit);
      analogWrite (MotorSpeedR, geschwindigkeit);
      delay(dauer);
      analogWrite (MotorSpeedL, 0);
      analogWrite (MotorSpeedR, 0);
     
  }
Logged

Pages: [1] 2   Go Up
Jump to: