Hey ihr ich hab mich mal rangesetzt um ein linienverfolgungsprogramm zu schreiben bei dem man auch abbiegen kann (sollte )
Ich hab mir echt mühe gegeben bin aber noch anfänger deswegen können und sind auch noch einige fehler drin
könnt ihr mir pls etwas helefn damit ich es zum laufen bekomme?
Ich erkläre mal kurz wie ich mir es vorgestellt habe:
Der asuro wird auf eine schwarze linie gesetzt, die er dann nachfährt bis er zu einer unterbrechung ,eine weiße fläche, der linie kommt.
Hier wartet er auf einen befehl entweder "a" oder "d".
bei a soll er sich links an der linie orientieren bei d dementsprechend rechts.
nun soll er also halb auf der linie fahren.
beim linksabbiegen sieht es also so aus, dass der linke sensor über weißem boden und der rechte über schwarzem ist.
falls der linke sensor zu dunkel wird gibt er rechts mehr gas und wenn der rechts sensor zu hell wird gibt er links mehr gas
das macht er nun bis er wieder zu einer unterbrechung kommt (noch nicht umgesetzt) und dann fährt er wieder normal auf der schwarzen linie.
hoffe ihr könnt meine gedanken nachvollziehen und mir tipss geben denn so wie das programm im moment ist, läuft es nicht bzw. kann ich es nicht in eine hex datei verwandeln
ich danke euch schonmal im vorraus
Code:
#include "asuro.h"
#define SPEED 0x8F
#define LEFT_KEY 'a' // a links abbiegen
#define RIGHT_KEY 'd' // d rechts abbiegen
int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;
void LineLeft (void) // Links von der Linie
{
speedLeft += 1; //dann links mehr Gas geben
if (speedLeft > 0xFE) speedLeft = 0xFF;
}
void LineRight (void) //Rechts von der Linie
{
speedRight += 1; //dann rechts mehr Gas geben
if (speedRight > 0xFE) speedRight = 0xFF;
}
void ASStop(void) // ASURO hält an
{
speedRight = speedLeft = 0;
FrontLED(OFF);
BackLED(OFF,OFF);
}
void TurnRight(void) // Asuro biegt rechts ab
{
GoTurn(4,0,100);
LineData(lineData);
if (lineData[0] > 200) // 200 ist geschätzt!!! ASURO ist zu weit rechts, also muss er rechts schneller
{
StatusLED(GREEN);
LineRight();
}
else if ( lineData[1] < 300) // 300 ist geschätzt!!! ASURO ist zu weit links er muss links schneller
{
StatusLED(RED);
LineLeft();
}
else
{
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
void TurnLeft(void) // Asuro biegt links ab
{
GoTurn(4,0,100);
LineData(lineData);
if (lineData[1] > 200) // 200 ist geschätzt!!! ASURO ist zu weit links, also muss er links schneller
{
StatusLED(GREEN);
LineLeft();
}
else if ( lineData[0] < 300) // 300 ist geschätzt!!! ASURO ist zu weit rechts er muss rechts schneller
{
StatusLED(RED);
LineRight();
}
else
{
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
int main(void)
{
Init();
// Variablen deklarieren
int i;
unsigned char j;
unsigned char cmd;
FrontLED(ON);
for (j = 0; j < 0xFF; j++) LineData(lineData);
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
while (1) // die ganze Zeit
{
LineData(lineData);
if (LineData[0] > 800 && LineData[1] > 800) // Wenn der ASURO über weißem Grund ist...
{
ASStop(); // ...dann anhalten und auf Knopfdruck warten...
// hier könnte ein Fehler sein, da der ASURO nur über weißem Boden kurz waretn würde und dann normal weiterläuft
cmd = 0;
switch (cmd)
{
case LEFT_KEY : TurnLeft(); break; // Wenn 4 dann links halten
case RIGHT_KEY : TurnRight(); break; // Wenn 6 dann rechts halten
}
}
else
{ // Normale Linienverfolgung
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4)
{
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4)
{
StatusLED(RED);
LineRight();
}
else
{
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
return 0;
}
Lesezeichen