PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fahren im kreis



inka
07.01.2007, 15:23
hi allerseits,
nun habe ich schon den halben tag mit diesem progrämmchen verbracht, es mit kommentaren versehen um es zu verstehen - sind die richtig?

#include "asuro.h"
#define SPEED 200
int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;
void LineLeft (void) //fahre nach rechts zu linie
{
speedRight -=2; //rechts bremsen
if (speedRight < 100) speedRight = 100; //min speed rechts
}
void LineRight (void) //fahre nach links zu linie
{
speedLeft -=2; //links bremsen
if (speedLeft < 100) speedLeft = 100; //min speed links
}
void LineDemo(void)
{
int i;
unsigned char j;
FrontLED(ON);
for (j = 0; j < 255; j++) LineData(lineData); //differenzberechnung li-re
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
MotorSpeed(speedLeft,speedRight);
for(;;) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
SerWrite("\n\r i: ",9);
PrintInt(i);
if ( i > -50) {
//StatusLED(GREEN);
BackLED(OFF,ON); //blinker rechts
LineLeft(); //fahre nach rechts zu linie
}
else if ( i < 100) {
//StatusLED(RED);
BackLED(ON,OFF); //blinker links
LineRight(); //fahre nach links zu linie
}
else {
StatusLED(YELLOW);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
}
int main(void)
{
Init();
LineDemo ();
while(1);
return 0;
}


die "i" werte habe ich mir ausgeben lassen, sie verändern sich m.e. nach richtig (bzw. die reaktion des programms ist richtig), je nachdem ob ich beim aufgebockten asuro den schwarzen streifen unter den linken, oder rechten transistor drunterschiebe, die LED´s leuchten auf, die räder bremsen ab.
Komisch ist nur, dass nach dem abbremsen die geschwindigkeit niedrig bleibt und dass, wenn ich den asuro auf dem testblatt fahren lasse diese nur rechtsherum im kreis fährt. Woran kann das liegen?
Hängt es vielleicht von den am anfang (beim starten des asuro) eingelesenen 255 werten ab? Ob überm weissen hintergrund, oder ein sensor schwarz, der andere weiss?

gruß inka

radbruch
07.01.2007, 17:36
Hallo

Mit etwas Glück und gleichmässiger Raumbeleuchtung fährt mein asuro nun mit deinem leicht geänderten Programm nach dunklen Fliesenfugen:


#include "asuro.h"
#define SPEED 200
int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;
void LineLeft (void) //fahre nach rechts zu linie
{
speedRight -=2; //rechts bremsen
if (speedRight < 100) speedRight = 100; //min speed rechts
}
void LineRight (void) //fahre nach links zu linie
{
speedLeft -=2; //links bremsen
if (speedLeft < 100) speedLeft = 100; //min speed links
}
void LineDemo(void)
{
int i;

unsigned char j;
FrontLED(ON);
// Die folgende Mehrfachabrage der LineDatas ist völlig sinnfrei!
for (j = 0; j < 255; j++) LineData(lineData); //differenzberechnung li-re
// Hier beginnt der Ernst des asurolebens
LineData(lineData);
// bei data[0]=data[1] ist adoffset=0 d.H. der Unterschied wird einmalig
// berechnet und als adoffset gespeichert das gibt Probleme bei
// Helligkeitsänderungen von der Seite bei der Fahrt.
// Es wird dann später auf grösser/kleiner null geprüft.
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
MotorSpeed(speedLeft,speedRight);
for(;;) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
SerWrite("\n\r i: ",9);
PrintInt(i);

/* dadurch muss auch darauf geprüft werden, also i<0 oder i>0
aber bei i==0 darf nichts passieren, sonst ewige Kurve!
deshalb vorsichtshalber 3 vollwertige ifs
*/
if ( i > 0 ) {
//StatusLED(GREEN);
BackLED(OFF,ON); //blinker rechts
LineLeft(); //fahre nach rechts zu linie
}
if ( i < 0) {
//StatusLED(RED);
BackLED(ON,OFF); //blinker links
LineRight(); //fahre nach links zu linie
}
if ( i == 0) {
StatusLED(YELLOW);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
}
int main(void)
{
Init();
LineDemo ();
while(1);
return 0;
}


Nachtrag: Mit einer Geschw. Korrektur von +-5 macht er's etwas besser! Ich setze den asuro beim Start ungefähr mittig in Fahrtrichtung auf die Linie.

Gruß

mic

inka
07.01.2007, 18:06
hi mic,
meiner fährt mit deinem programm geradeaus - aber sehr geradeaus!

gruß inka

radbruch
07.01.2007, 19:06
Klar, sobald er den Strich verlässt gilt Bedingung 3: Mit SPEED vorwärts.

Hier sind wir nun am Beginn eines tollen neuen Linienfolgeprogramms made by inka ...

Nachtrag: Das ist mir natürlich peinlich, aber man sollte immer die Version Posten die auch im asuro läuft. Es war oben ein Bug drin, bei i==0 wurde MotorSpeed erst nach der } gesetzt. Sorry. Hier das selbe mit Korrektur:
#include "asuro.h"
#define SPEED 200
int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;
void LineLeft (void) //fahre nach rechts zu linie
{
speedRight -=5; //rechts bremsen
if (speedRight < 100) speedRight = 100; //min speed rechts
}
void LineRight (void) //fahre nach links zu linie
{
speedLeft -=5; //links bremsen
if (speedLeft < 100) speedLeft = 100; //min speed links
}
void LineDemo(void)
{
int i;

unsigned char j;
FrontLED(ON);
// Die folgende Mehrfachabrage der LineDatas ist völlig sinnfrei!
for (j = 0; j < 255; j++) LineData(lineData); //differenzberechnung li-re
// Hier beginnt der Ernst des asurolebens
LineData(lineData);
// bei data[0]=data[1] ist adoffset=0 d.H. der Unterschied wird einmalig
// berechnet und als adoffset gespeichert das gibt Probleme bei
// Helligkeitsänderungen von der Seite bei der Fahrt.
// Es wird dann später auf grösser/kleiner null geprüft.
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
MotorSpeed(speedLeft,speedRight);
for(;;) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
SerWrite("\n\r i: ",9);
PrintInt(i);

/* dadurch muss auch darauf geprüft werden, also i<0 oder i>0
aber bei i==0 darf nichts passieren, sonst ewige Kurve!
deshalb vorsichtshalber 3 vollwertige ifs
*/
if ( i > 0 ) {
//StatusLED(GREEN);
BackLED(OFF,ON); //blinker rechts
LineLeft(); //fahre nach rechts zu linie
}
if ( i < 0) {
//StatusLED(RED);
BackLED(ON,OFF); //blinker links
LineRight(); //fahre nach links zu linie
}
if ( i == 0) {
StatusLED(YELLOW);
speedLeft = speedRight = SPEED;
MotorSpeed(speedLeft,speedRight);
}
}
}
int main(void)
{
Init();
LineDemo ();
while(1);
return 0;
}


Das ganze ist natürlich nicht optimal. Der in adoffset gespeicherte Wert gilt nur für den Startpunkt, wirkt sich aber immer aus! Wie geschrieben, viel Spass beim Entwickeln eines eigenen Programms.