Hallo
Da mein asuro nicht fahrbereit ist, und mein probot-asuro keine Kollisitionstaster besitzt, kann ich das überhaupt nicht testen:
PHP-Code:
// Linie folgen und bei Hinderniss ausweichen 11.6.2012 mic
// asuro weicht abhängig von den Kollisionstastern links oder rechts aus und
// fährt einen Bogen um das Hindreniss während er die Linie sucht.
// Bei einem frontalen Hinderniss ist der Radius des Ausweichbogen größer.
// https://www.roboternetz.de/community/threads/58073-Linie-verfolgen-plus-Gegenst%C3%A4nden-ausweichen-plus-Linie-wiederfinden-Hilfe
#include "asuro.h" /*Linienverfolgung*/
#define tol 15 /*Toleranz der Sensoren*/
#define FULL_L 120 /* Fullspeed linker Motot */
#define FULL_R 120 /* Fullspeed rechter Motor */
/* Motor vorwärts */
void MotorFwd(void)
{
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}
/* Motor rückwärts */
void MotorRwd(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}
void Msleep(int dauer)
{
int z;
for(z=0;z<dauer;z++) Sleep(72);
}
int main(void)
{
unsigned int data[2], keine_linie;
unsigned char t1, t2, ufs; // UmFahrSeite 0=links, 1=rechts, 2=links weit, 3=rechts weit
Init();
FrontLED(ON); // etwas verzögern weil a: die LED nicht schlagartig hell wird ...
LineData(data); // und b: der ADC bei der ersten Lesung gelegentlich spinnt
MotorDir(FWD,FWD);
while(1)
{
do // Linie folgen bis Hinderniss erkannt wird
{
LineData(data);
if (data [0] > data [1] + tol ) // Linie schwenkt nach rechts
{
MotorSpeed(FULL_L+20,FULL_R-40);
MotorDir(FWD,RWD);
}
else if (data [1] > data [0] + tol ) // Linie schwenkt nach links
{
MotorSpeed(FULL_L-40,FULL_R+20);
MotorDir(RWD,FWD);
}
else // auf der Linie (immer inclusive tol)
{
MotorSpeed(FULL_L,FULL_R);
MotorDir(FWD,FWD);
}
t1 = PollSwitch();
t2 = PollSwitch();
}while((t1!=t2) || (t1==0)); // nur wenn t1 gleich t2 ist der Tastenwert gülig
StatusLED(RED);
MotorDir(BREAK,BREAK); // Notstopp
MotorSpeed(0,0);
Msleep(500); // durchatmen
if((t1 & 0b000111) && !(t1 & 0b111000)) // k4 bis k6 Hinderniss auf der rechten Seite
{
ufs=0;
MotorDir(RWD,FWD); // 90° nach links schwenken
MotorSpeed(FULL_L,FULL_R);
Msleep(500); // Zeit muss angepasst werden für ca. 90°
}
else if((t1 & 0b111000) && !(t1 & 0b000111)) // k1 bis k3 Hinderniss auf der linken Seite
{
ufs=1;
MotorDir(FWD,RWD); // 90° nach rechts schwenken
MotorSpeed(FULL_L,FULL_R);
Msleep(500); // Zeit muss angepasst werden für ca. 90°
}
else
{
if(data[0] & 1) // 90° nach Zufall schwenken
{
ufs=2; // großer Bogen nach links
MotorDir(RWD,FWD);
}
else
{
ufs=3; // großer Bogen nach rechts
MotorDir(FWD,RWD);
}
MotorSpeed(FULL_L,FULL_R);
Msleep(500); // Zeit muss angepasst werden für ca. 90°
}
MotorSpeed(0,0); // anhalten
Msleep(500);
LineData(data); // Aktuelle Helligkeit messen da hier wohl keine Linie ist
keine_linie=data[0]+data[1];
LineData(data); // Durchschnitt von zwei Messungen
keine_linie=(keine_linie+data[0]+data[1])/2;
keine_linie=keine_linie-tol*2; // irgendwie den Schwellwert für die Linie berechnen
StatusLED(YELLOW);
MotorDir(FWD,FWD); // Umfahrbogen festlegen und Linie suchen
if(ufs & 1) // bit 0 ist links oder rechtskurve
if(ufs & 2) // bit 1 gesetzt bedeutet weite Kurve (ufs ist 2 oder 3)
MotorDir(FULL_L-20,FULL_R); // rechts ausweichen, Linksbogen fahren weit
else
MotorDir(FULL_L-30,FULL_R); // rechts ausweichen, Linksbogen fahren eng
else
if(ufs & 2)
MotorDir(FULL_L,FULL_R-20); // links ausweichen, Rechtsbogen fahren weit
else
MotorDir(FULL_L,FULL_R-30); // links ausweichen, Rechtsbogen fahren eng
do // Kurve fahren und dabei die Linie suchen
LineData(data);
while(keine_linie > (data[0]+data[1])); // solange die Linienwerte nicht klein genug sind
StatusLED(GREEN); // Linie gefunden, folgen
MotorSpeed(FULL_L,FULL_R);
}
return 0;
}
(ungetestet)
Wenn davon irgendetwas funktioniert, wäre es nett, wenn du ein Filmchen machen würdest.
Genauere Angaben zur Linie, dem Kurs und dem Hinderniss wären echt hilfreich.
Gruß
mic
Lesezeichen