Liste der Anhänge anzeigen (Anzahl: 1)
Linienfolger mit IR-Rechtsabbieger (1.Versuch)
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
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
Ohne IR-Messung mit selbstgemalten Linien sieht es nun so aus:
Bild hier Bild hier
Allerdings klappt es mit den "Weichen" noch nicht so recht:
Video3 Video4
Das Problem ist das permanente aktuallisieren der Min/Max-Linienwerte. Das muss ich noch mal überdenken...
Code:
#include "../inc/asuro.h"
#include "../inc/asuro.c"
#define schwelle 15
#define power 175
unsigned char pow_l, pow_r, dir_l, dir_r;
unsigned int data[2], suchen;
unsigned int h_l, h_r, d_l, d_r;
int main(void) {
Init();
FrontLED(ON);
dir_l=dir_r=FWD;
pow_l=pow_r=power;
d_l=d_r=0;
h_l=h_r=1023;
MotorDir(dir_l,dir_r);
MotorSpeed(pow_l,pow_r);
suchen=0;
do{
LineData(data);
BackLED(OFF,OFF);
if ((data[0]-schwelle < d_l) && (data[1]-schwelle < d_r)) {
dir_l=dir_r=FWD;
pow_l=255-data[0];
pow_r=255-data[1];
suchen=0;
StatusLED(GREEN);
BackLED(ON,ON);
} else {
if (data[1]-schwelle > data[0]) {
pow_l=0;
pow_r=power;
d_l=(d_l+data[0])/2;
h_r=(h_r+data[1])/2;
suchen=1;
StatusLED(YELLOW);
BackLED(OFF,ON);
}
if (data[0]-schwelle > data[1]) {
pow_l=power;
pow_r=0;
h_l=(h_l+data[0])/2;
d_r=(d_r+data[1])/2;
suchen=1;
StatusLED(YELLOW);
BackLED(ON,OFF);
}
if (suchen==1) {
if ((h_l-schwelle < data[0]) && (h_r-schwelle < data[1])) {
StatusLED(RED);
if (pow_l==0) { dir_l=RWD; pow_l=power; }
if (pow_r==0) { dir_r=RWD; pow_r=power; }
}
suchen=2;
}
}
MotorDir(dir_l,dir_r);
MotorSpeed(pow_l,pow_r);
}while (1);
return 0;
}
Gruß
mic
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Hermann,
da ist auf jeden Fall noch ein Tuning für den Asuro notwendig, wenn die letztes Jahr schon 71cm/s schnell waren. Das erreicht ein Standard-Asuro nicht einmal auf der Geraden.
Mich würde mal interessieren wie schnell mein Linienfolger ist. Falls dein Asuro noch mit den originalen Liniensensoren ausgerüstet ist, könntest du mal mein Programm laden und auf dem Testparcour laufen lassen? Die hex-Datei ist angehängt.
Gruß
Waste
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Hermann,
ich hab's an deine Sensoren angepasst, sollte eigentlich so laufen. Probier es mal aus.
Gruß Waste