Den Odo Test hatte ich vorher durchgeführt, meine
http://roboter.net-con.net/asuro/source/ododemo1.html
Hier aber mal der quelltext, fehlt nur die kollisionsabfrage da das ne ewig lange case abfrage ist für die möglichen tast ereignisse und rückwärtsfahren usw.
ps: habs nur schnell wieder zusammen gefriemelt ohne meine eigenen verbesserungen.. aber da eh der selbe fehler auftritt ist das ja egal.. habs jetzt so nochmal getestet und in 90% aller fälle denkt asuro er steht und fährt halt rückwärts.. ganz selten fährt er mal normal gerade aus und reagiert dann auf linienerkennung und taster.
Code:
#include "asuro.h"
#define SPEED_L 110
#define SPEED_R 110
unsigned int lineData[2];
/** Odometrie links/rechts */
unsigned int data[2];
/** flag für aktuellen zustand der farbe */
int Lnow = 0;
int Rnow = 0;
int Rold = 0;
int Lold = 0;
// haben sich die werte geändert
unsigned int fl_Lch = 0;
unsigned int fl_Rch = 0;
/** zähler für farbwechsel */
unsigned int Count1 = 0;
unsigned int Count2 = 0;
int j = 0;
int k = 0;
void Msleep(int dauer) {.....
void drive_back(void) {.....
void drive_back_bit(void) {.....
void drive_left(void) {.....
void drive_right(void) {
Msleep(30);
MotorSpeed(150, 0);
BackLED(ON, OFF);
Msleep(1000);
MotorSpeed(0, 0);
Msleep(10);
}
void kollisions_abfrage(void){
..
..
switch (k) {
case 1:
drive_back_bit();
drive_left(); //K6
break;
case 2:
..
..
default:
MotorSpeed(SPEED_L, SPEED_R);
}
}
void odoabfrage(void){
for (j = 0; j < 30; j++) {
OdometrieData(data); //werte stabilisieren
}
OdometrieData(data); // 0. links, 1. rechts
// Schwellwert für schwarz/weiss linke Seite
if (data[0] > 550)
Lnow = 1;
else
Lnow = 0;
// Schwellwert für schwarz/weiss rechte Seite
if (data[1] > 550)
Rnow = 1;
else
Rnow = 0;
if (Lnow ^ Lold) {
fl_Lch = 1;
}
else {
fl_Lch = 0;
}
if (Rnow ^ Rold) {
fl_Rch = 1;
}
else {
fl_Rch = 0;
}
// hat sich der Asuro bewegt ?
if (fl_Rch || fl_Lch) {
// alte werte merken für nächsten schleifendurchlauf
Lold = Lnow;
Rold = Rnow;
}else{ //Asuro hat sich nicht bewegt
Lold = Lnow;
Rold = Rnow;
drive_back();
drive_left();
}
}
int main(void) {
/*START*/
Init();
MotorDir(FWD, FWD);
StatusLED(YELLOW);
FrontLED(ON);
SerPrint("ASURO Bereit!.. ");
/*WARTEN*/
while (PollSwitch() != 1) {
BackLED(ON, OFF);
Msleep(300);
BackLED(OFF, ON);
Msleep(300);
}
Msleep(1000); //1 sekunde warten
BackLED(OFF, OFF);
StatusLED(GREEN);
SerPrint("Fahre los.. ");
MotorSpeed(SPEED_L, SPEED_R);
while (1) {
//Kollisionsabfrage
kollisions_abfrage();
//Linienabfrage
LineData(lineData);
if (lineData[LEFT] < 20 && lineData[RIGHT] < 20) {
drive_back();
drive_left();
} else if (lineData[RIGHT] < 20) {
drive_left();
} else if (lineData[LEFT] < 20) {
drive_right();
}
//bis hier klappt alles, jetzt die neue odo abfrage falls asuro mal hängen bleibt
//Odometrieabfrage
odoabfrage();
MotorSpeed(SPEED_L, SPEED_R);
BackLED(ON, ON);
}
SerPrint(" Fehler! ");
StatusLED(RED);
BackLED(OFF, OFF);
MotorSpeed(0, 0);
while (1) { }
return 0;
}
Lesezeichen