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
Für eine Qualifikation bei Wettbewerben dürfte das ja noch nicht reichen, aber es ist mal ein Anfang.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; }
Gruß
mic







Zitieren

Lesezeichen