Hallo INGatRexroth,
herzlich willkommen im besten Asuro-Forum unter der Sonne.
Hier mal eine Zusammenfassung, was bisher gemeint ist:
Code:
#include "asuro.h"
int main (void)
{
unsigned int data [2];
Init ();
FrontLED (ON);
MotorDir (FWD, FWD);
while (1)
{
OdometrieData (data); // Die Klammern und das Ergebnis
if (data [0] < data [1])
{
MotorSpeed (200, 150);
}
else
{
MotorSpeed (150, 200);
}
/*
Das hier alles weg, da dann nun OdometrieData() und PollSwitch()
immer nacheinander aufgerufen werden.
}
while (1)
{
weg bis hier hin
*/
if (PollSwitch () != 0)
{
MotorSpeed (255, 255);
BackLED (ON, ON);
}
}
while (1); // Ist dafür da, dass das Programm auf keinen Fall beendet wird.
// Sonst spinnt der Asuro.
return 0;
}
Es gibt aber noch ein paar Probleme.
- Wenn mit "PollSwitch() != 0" erkannt wird, dass ein Taster gedrückt wurde, dann schaltest du auf 'volle Pulle', ohne den Rückwärtsgang mit "MotorDir (RWD, RWD);" einzulegen.
- Aber, wenn du nun rückwärts fährst, gibt es keine Stelle mehr im Programm, die die Motoren dann wieder zum vorwärts Fahren umschalten.
- Also solltest du beim "if (PollSwitch() != 0)" noch einen else-Zweig spendieren, in dem wieder "MotorDir (FWD, FWD);" aufgerufen wird.
Tut mir leid, aber auch dass wird noch nicht ausreichen.
Was passiert, wenn die Wand erreicht wurde?
- Volle Pulle zurück.
- Taster wird nicht mehr von der Wand gedrückt.
- Vorwärtsgang wird eingelegt.
- Asuro fährt sofort wieder vor die Wand.
--- und so fort.
Hier kannst du am besten folgendes machen:
Code:
if (PollSwitch () != 0)
{
MotorDir (RWD, RWD);
MotorSpeed (255, 150); // Im BOGEN weg von der Wand !!!
BackLED (ON, ON);
for (i = 0; i < 200; i++) // 200 mal, i muss natuerlich definiert werden,
Sleep (72); // eine Millisekunde warten
// Anstatt der 200 musst du auch andere Werte
// probieren, bis der Bogen ausreicht um von der
// Wand weg zu kommen.
}
else
{
MotorDir (FWD, FWD);
BackLED (OFF, OFF);
}
Jetzt kommt aber leider noch etwas
Dein Programmteil zum Geradeausfahren mit OdometrieData() wird leider nicht funktionieren.
Die Funktion OdometrieData() holt von den Sensoren an den Rädern nur die Information, wie hell es dort gerade ist.
Wenn sich diese schwarz-/weiss-Scheibe also dreht, bekommst du die Helligkeitsänderungen geliefert. Du bekommst nicht die Anzahl der schwarz-/weiss-Wechsel mitgeteilt.
Somit wird das folgende "if (data [0] < data [1])" nicht die Raddrehung vergleichen, sondern nur die Helligkeit.
Zu diesem Thema solltest du mal hier nachlesen.
Becci hat dort ihr Programm vorgestellt. Darin ist direkt im ersten Code-Block ein Programm-Teil welches dir weiterhelfen kann.
Suche dort mal:
//Helligkeitswerte der Lichtschranken auslesen
bis
//zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
//Wertebereich verlässt
Nicht erschrecken, dazwischen ist der Programmteil, der aus den HELLIGKEITS-Änderungen ermittelt, wann sich das Rad weitergedreht hat.
Das ist die Information, die du benötigst. (Hier kannst du bei genauem Studium aber einiges lernen.)
(Der Programm-Teil ist im übrigen aus dem "Mehr Spaß mit Asuro II". Band I wurde dir ja schon von asuroer empfohlen. Da schliesse ich mich auf alle Fälle an.)
Ich hoffe, dass ich dich nicht zu doll frustriert habe, sondern dass du weiter mit den 'Problemen' beim Asuro bzw. beim Programmieren kämpfst und dem Ding die Stirn bietest. Genau dafür ist der Asuro geschaffen. Zu Anfang ein Berg von Problemen, und dann kommt mit einem mal der Ah-ha-Effekt. Spätestens dann wirst du ein Abhängiger. 
Viel Erfolg wünscht
Sternthaler
Lesezeichen