PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO fährt nur Linkskurve



hansebanger
22.06.2009, 20:00
Hallo unser Projekt ist eigentlich soweit fertig allerdings macht unser ASURO jetzt nur noch Rückwärts Linkskurven am Stück. Bis wir dass Programm erweitert haben ging jedoch die Funktion mit den Kollisionstaster hervorragend.



Zur Erklärung :Der ASURO soll eine Kurve fahren, an die er im ersten Durchgang anstößt...im zweiten Durchgang soll er sie perfekt nehmen...
Dazu zählt er Linien bis er eine kurve erkennt und speichert diesen Wert ab. Beim nächsten Durchlauf macht er nach der abgespeicherten Anzahl an Linien eine Kurve.

Könnt ihr Erklären warum er jetzt plötzlich nur noch Rückwärtslinkskurven macht?

Vielen Dank

Lg
Hansebanger vs. Bangboy
#include "asuro.h"
void SleepEx(short);
#define STOP 250
int main(void)
{

unsigned char taste;
unsigned int data[2];
int i,S,DrehR,DrehL;

Init();
DrehL=0; // Werte auf null setzen
DrehR=0;
i=0;
S=0;

while (1==1)
{
FrontLED(ON);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
LineData(data);

if ((data[0]<STOP) && (data[1]<STOP))
{
i++;
BackLED(ON,ON);
SleepEx(1);
}

if (i>10)
{
MotorSpeed(0,0);
SleepEx(15);
S=1;
i=0;

}


taste=PollSwitch();

if (taste > 13)
{
DrehR=i;
MotorSpeed(0,0);
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(0,200);
SleepEx(15);
MotorSpeed(0,0);
SleepEx(10);
MotorDir(FWD,FWD);
MotorSpeed(210,200);
}
else if((taste < 13) && (taste >= 1) )
{
DrehL=i;
MotorSpeed(0,0);
StatusLED(YELLOW);
MotorDir(RWD,RWD);
MotorSpeed(200,0);
SleepEx(15);
MotorSpeed(0,0);
SleepEx(10);
MotorDir(FWD,FWD);
MotorSpeed(210,200);
}



if (S=1)
{

while (i<(DrehL))
{
MotorDir(FWD,FWD);
MotorSpeed(105,100);

}

if (i>=(DrehL))
{
MotorDir(FWD,FWD);
MotorSpeed(120,20);
StatusLED(GREEN);
}

}

}










//************************************************** ************************************
}

void SleepEx(short zsecnds)
{
int wdhlg=zsecnds/.03;
int i=0;
while (i<wdhlg)
{
Sleep(216);
i++;
}
}

Valen
23.06.2009, 22:34
Ich hab das program mal auf meiner asuro geflashed. Aber ich krieg gar keinen ruckwarts links kurven. Aber ich habe auch keinen schwarze strichen auf meinen boden.

Da ist aber ein fehler in dein program. Und den compiler muss ihr schon da uber gemeldet haben mit einer warnung im zeile 73:

if (S=1)
{

while (i<(DrehL))
Nur ein 'gleich-an' zeichen meint ein zuweisung von 1 and S. Einer doppelte gleich-an zeichen ist einer logische stellung, "ist S gleich 1?". Weil einer zuweisung als war gesehen wird hat das deine Asuro die falsche entscheidung machen lassen. Er ist dan gleich dammit von der meinung er ist den 10-en linie ubergegangen (weil S gleich 1 gemacht ist.) Er uberpruft den folgende while schleife aber das macht er nicht weil i nicht kleiner ist wie DrehL (das wird es aber auch nie, weil sie am anfang beiden gleich 0 sind, und nur i inkrementiert wird bei eine linie ubergang.) Beiseitens, DrehL zwischen runde klammern ist nicht notig. ;)

Den If nach dem While macht er aber sicher. Auch wenn keiner linie schon bemerkt ist, weil i und DrehL am anfang des programmes beiden 0 sind, und deshalb gleich (oder i grosser). Danach endet der grossen while schleife und geht von vorne wieder dran.

Wen er einer linie bemerkt hat nach dem linedata funktion wird er den i variabele hoch zahlen, den backleds anm und wartet einer sekunde. ABER HUUU!!!!, so lange mit laufende motoren! Wird er nicht den nächste linie vorbei gehen? Und wie bist du sicher das er ihn bemerkst hat. Den backleds bleiben an. Ich wurde sie nur ein augenblick leuchten lassen (nur einiger milisekunden) damit du wisst er hat was gesehen. Aber dan auch den backleds wieder aus. Sonnst wurde du sein bemerken der nachste linie nicht sehen. Und er wird es auch nicht blind vorbei gehen. Nur ist das problem er konnte die i variabele mehrfach hochzahlen bei dem selbte linie. Deshalb muss den blinkzeit auch nich zu kurz sein.


Ok Taster! Daruber muss auch nog etwas gesagt werden. Denn taster liefern meistens falsche werten. Sehr oft wegen motorstörung, oder weil er bewegt beim anstossen. Ein einfache lösung ist 2 mal den Pollswitch in 2 variabelen speichern und testen ob sie gleich sind. Dan konntest du diesen taster wert weiter analysieren fur den genaue tastern.

Weisst du aber welcher taster den wert 13 verursachen? 13=8+4+1, und das ist den meist rechter taster (K6=1, von hinten gesehen) mit den 2 inneren (K3=4,K4=8).

'<13' sind verschiedene combinationen, aber nicht alle von den 4 rechter taster. (weil 8+4+2 >13) Aber '>13' könnte ein kombination von fast alle taster sein. Wen du nur den linker oder rechter tasten wollte muss man nur diesen 3 bits testen an jeder seite. Das geht mit bit-maske und einer OR ('oder') operator.

(taste & 56) sind nur ein oder mehr der linker taster sind eingedruckt,

(taste & 7) sind nur ein oder mehr der rechter taster sind eingedruckt.(nochmal, nur von hinten gesehen)

Oder hattest du bestimte taster-eindruck-wunschen?

Ob das gesamt deine auftrag losst bin ich noch nicht sicher, von aber damit muss ihr schon weiter kommen.