Hallo
Fast auf den Tag genau bin ich nun seit zwei Monaten stolzer Besitzer eines asuros. Ich bin immer noch von ihm begeistert, viel Spass und Funktion für wenig Geld.
Hier möchte ich euch mal meinen ersten (ernsthaften) Versuch eines Linienfolgers präsentieren, kombiniert mit einem einfachen Rechtabbieger auf Basis meiner IR-Minimallösung . Der Umbau beschränkt sich auf eine Variante des Dickmann-Reflektors und eine Abschirmung der Liniensensoren:
Bild hier Bild hier Bild hier
Bild hier
Video2
Code:
/* asuro folgt einer Linie (graue Fuge zwischen hellen Fliesen) mit IR-Rechtabbieger
24.2.2007
mic
Die "Linie" darf nicht zu dick sein, denn der asuro versucht
die Linie zwischen den Sensoren zu behalten.
Beim Start sollte der asuro genau auf der Linie stehen.
Wenn er sich "verirrt" hat und die StatusLED gelb leuchtet,
sollte man ihn leicht nach links versetzt neben die Linie stellen.
*/
#include "../inc/ir-asuro.h" // eine Lib mit IR-Erweiterung ab ca. Ver. 2.1
#include "../inc/ir-asuro.c"
unsigned int data[2]; // Speicher fuer die Line-Daten
int main(void) {
Init();
StatusLED(RED); Msleep(1000); StatusLED(GREEN); // kurze Startverzoegerung
FrontLED(ON);
MotorDir(FWD,FWD);
// IR-Abstandsmessung nach waste
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0x90; // maximaler Abstand
do{ // Hauptschleife
if (PIND & (1 << PD0)) { // Echo pruefen
StatusLED(GREEN); // keine Echo = freie Fahrt
LineData(data); // Liniensensoren einlesen
MotorSpeed(data[0]*4, data[1]*4); // Faktor bestimmt die Geschwindigkeit (Minimalregelung)
//MotorSpeed(255-data[0], 255-data[1]);
if (data[0] > data[1]) BackLED(ON,OFF); else BackLED(OFF,ON); // Showeffekt
} else {
StatusLED(RED); // Hindernis erkannt
MotorSpeed(100,100); // zurückstossen bis kein Echo
MotorDir(RWD,RWD);
while (!(PIND & (1 << PD0))); // warten bis kein Echo
Msleep(150); // und noch ein bisschen zurueck
MotorDir(FWD,RWD);
Msleep(600); // zeitgesteuert 38,231 Grad nach rechts drehen
MotorDir(BREAK,BREAK);
MotorSpeed(200,200); // weitersteppen bis zur naechsten Linie
StatusLED(YELLOW);
do {
MotorDir(FWD,RWD); Sleep(127); // mit Puls zu Pause-Verhaeltniss moeglichst langsam schleichen
MotorDir(BREAK,BREAK); Sleep(255);
LineData(data);
} while (!(data[0]-10 > data[1])); // rechter Sensor deutlich dunkler als Linker
MotorDir(FWD,FWD); // d.h. Linie erreicht
MotorSpeed(0,0); // weiter mit Linienfolgen
}
} while (1); // Ende Hauptschleife, ausfuehren bis der Akku leer ist
return 0;
}
Für eine Qualifikation bei Wettbewerben dürfte das ja noch nicht reichen, aber es ist mal ein Anfang.
Gruß
mic
Lesezeichen