PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro's linker Motor erkennt Kollision?



mtzE
02.05.2010, 00:56
Halli Hallo liebes Roboternetz,
ich bin jetzt seit 2 Tagen stolzer Besitzer eines Asuro und habe diesen heute auch fertig gebracht :)
Alle Tests haben wunderbar funktioniert bis ich anfing meine eigenen Programme zu schreiben :-s
Ich wollte eigentlich ein Stückchen fahren und dann per PollSwitch eine Kollision erkennen lassen und er soll stoppen und rückwärts weg fahren..
Da fingen die Probleme auch schon an und zwar fuhr mein Asuro ein Stück und stockte immer und immer wieder.. (nur links). Hab daraufhin mal die Achsen überprüft und Zahnräder aber scheint alles sauber zu sein.
Hab n kleines Programm geschrieben das mir dann für jedes Rad einzeln ausgibt wenn es eine Kollision gibt:

#include "asuro.h"

int main(void)
{
Init();

MotorDir(FWD,BREAK);
MotorSpeed(150,0);
StatusLED(GREEN);
while (PollSwitch()==0){
}
MotorSpeed(0,0);
StatusLED(RED);
return 0;
}

(Scheint für manche vllt. ein bisschen komisch geschrieben aber bin neu in C sry =P~ )

So und nun ja wenn das Prog fürs rechte Rad geschrieben ist funktionierts, es läuft so lange bis ich einen Taster drücke...
Und wenn ich das ganze fürs linke Rad mache dann läuft das Rad wenns hoch kommt 2sec. (meist kürzer) und stoppt sofort ohne das ich einen Taster gedrückt habe..
Und ohne PollSwitch läuft das linke Rad ganz normal und durchgehend..

Hoffe mir kann jemand helfen :)

MfG. mtzE

Thund3r
02.05.2010, 01:16
Hallo

Ein viel besprochenes Problem ist dass die Taster beim Asuro nicht besonders zuverlässig sind. Aufgrund mehrerer Faktoren wird manchmal ein Wert ungleich 0 zurückgegeben obwohl nichts gedrückt wurde.

Um dies vorzubeugen gibt es mehrere Möglichkeiten wie mehrfache Abfragen:


...
int T,T1,T2;
T=PollSwitch();
T1=PollSwitch();
T2=PollSwitch();
if (T==0||T1==0||T2==0) { ... }
...

oder indem du einfach auf einen Taster verzichtest und sagst


...
if (Taster<2) { ... }
...

oder etwas ausgefallener:


...
while(1) {
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
while((PollSwitch()==0) || (PollSwitch()==0) || (PollSwitch()==0));
int I;
for (I=0;I<4000;I=I+1)
{ StatusLED(RED);
MotorDir(RWD,BREAK);
MotorSpeed(200,0);
}
}
...


Gruß Thund3r

mtzE
02.05.2010, 01:23
Hmm..
Vielen Dank für die schnelle und zugleich umfangreiche Antwort :)
auf die Ideen bin ich noch gar nicht gekommen :P
Werde das ganze gleich mal in die Tat umsetzen und mal posten ob es die Antwort für mein Problem war..
Aber ist es nicht wunderlich das es mit dem rechten Rad funktioniert und mit dem linken Rad nicht? Sonst müsste das ganze ja auch nach einiger Zeit mein rechten Rad erscheinen..

MfG. mtzE

Thund3r
02.05.2010, 01:28
Hallo

Die Sache ist das öfter mal ein Wert ungleich 0 (meistens 1) zurückgegeben wird was aber dann nur den linken Teil des Asuros betrifft.
Außerdem wird in deinem Programm "return 0;" ausgeführt obwohl das Programm noch nicht fertig ist.
return 0 darf nur nach dem Ende der Hauptschleife stehen.
Eine Hauptschleife ist in dem Programmteil auch nicht vorhanden

#include "asuro.h"


int main(void)
{
Init();
while(1) // Hauptschleife
{Hier das Programm...}
return 0;
}

Gruß Thund3r

mtzE
02.05.2010, 01:44
Habe es so eben ausprobiert :) Du hattest Recht..
War wohl immer ein Wert der gesendet wurde :)
Vielen Dank für die schnelle Hilfe
TOP! :cheesy:

Thund3r
02.05.2010, 01:51
Hallo

Kein Problem!
Und nun viel Spaß und Erfolg mit dem Robo ;)

Gruß Thund3r