Ich hab mir folgenden Code gebastelt.
Anders ist, dass der Mittelwert der Sensoren permanent der Umgebung angeglichen wird.
Mit dabei ist noch eine Abfrage der Taster, die den Asuro umkehren/ausweichen lassen. Nachteil dabei ist, dass er nach nem Richtungswechsel erstmal etwas unkontrolliert losrennt, weil er den Zähler während des Richtungswechsels nicht ausreichend hochzählt.
Fehlen tut noch ne Begrenzung der Maximalgescheindigkeit auf 255. Wenn ich ein Rad also nach und nach stärker blockiere, geht der Motor auf null und regelt sich dann wieder neu ein.
Aufgefallen ist mir, dass sich das linke Rad rückwärts langsamer dreht als vorwärts. Kann das mal jemand ausprobieren, obs bei anderen Asuros auch so ist?
Code:
#include "asuro.h"
int main(void) {
unsigned int odo_max_l,odo_max_r,odo_min_l,odo_min_r,odo_mitte_l,odo_mitte_r,data[2];
unsigned char auf_l,auf_r,speed,speed_wert,speed_l,speed_r,zaehler_l,zaehler_r,schwing,rueckw,dreh_l,dreh_r,taste;
unsigned long dauer1,dauer2;
Init();
MotorDir(FWD,FWD);
auf_r=auf_l=0;
zaehler_r=zaehler_l=rueckw=dreh_l=dreh_r=0;
odo_max_l=odo_max_r=odo_min_l=odo_min_r=300;
speed=120;
speed_l=speed_r=speed;
speed_wert=(speed/20);
MotorSpeed(speed_l,speed_r);
while(1) {
for(schwing=0;schwing<30;schwing++) {
dauer1=Gettime();
odo_max_l--;
odo_max_r--;
odo_min_l++;
odo_min_r++;
OdometrieData(data);
if (data[0]>odo_max_l) {odo_max_l=data[0];}
if (data[1]>odo_max_r) {odo_max_r=data[1];}
if (data[0]<odo_min_l) {odo_min_l=data[0];}
if (data[1]<odo_min_r) {odo_min_r=data[1];}
odo_mitte_l=(odo_max_l+odo_min_l)/2;
odo_mitte_r=(odo_max_r+odo_min_r)/2;
if ((auf_l==0) && (data[0]>(odo_mitte_l+5))) {
auf_l=1;
zaehler_l++;
}
else if ((auf_l==1) && (data[0]<(odo_mitte_l-5))) {
auf_l=0;
}
if ((auf_r==0) && (data[1]>(odo_mitte_r+5))) {
auf_r=1;
zaehler_r++;
}
else if ((auf_r==1) && (data[1]<(odo_mitte_r-5))) {
auf_r=0;
}
dauer2=Gettime();
while ((dauer1+5)>dauer2) {dauer2=Gettime();}
}
if (zaehler_l<speed_wert) {speed_l=speed_l+speed_wert;}
else if (zaehler_l>speed_wert) {speed_l=speed_l-speed_wert;}
if (zaehler_r<speed_wert) {speed_r=speed_r+speed_wert;}
else if (zaehler_r>speed_wert) {speed_r=speed_r-speed_wert;}
zaehler_l=zaehler_r=0;
if (PollSwitch()>0) {
taste=PollSwitch();
if (taste==1) {dreh_l=(800/speed);}
if ((taste==2) || (taste==4)) {dreh_r=(1200/speed);}
if (taste==31) {dreh_r=(800/speed);}
if ((taste==8) || (taste==16)) {dreh_l=(1200/speed);}
}
if (dreh_l>0) {
MotorDir(RWD,BREAK);
dreh_l--;
speed_r=speed_r-speed_wert;
}
else if (dreh_r>0) {
MotorDir(BREAK,RWD);
dreh_r--;
speed_l=speed_l-speed_wert;
}
else {
MotorDir(FWD,FWD);
}
MotorSpeed(speed_l,speed_r);
}
return 0;
Lesezeichen