Vieeeeeelen Dank es funktionirt nun!
Für alle die das Programm auch mal verwenden wollen, aufpassen:
ich hab die beiden rotier Anweisungen vertauscht! -> der Roboter dreht sich in die falsche Richtung!
Grüße
Druckbare Version
Vieeeeeelen Dank es funktionirt nun!
Für alle die das Programm auch mal verwenden wollen, aufpassen:
ich hab die beiden rotier Anweisungen vertauscht! -> der Roboter dreht sich in die falsche Richtung!
Grüße
hallo, hab gerade ein ähnliches programm programmiert. bei mir sucht der roboter selbstständig in die hellste richtung. jetzt frag ich mich allerdings, warum die int_16t im programm nur die werte von -100 bis +100 annehmen kann, obwohl es ja ein 16 bit datentyp ist, der eigentlich von -32768 ... +32767 gehen sollte. ich hab es jetzt mal mit -200 und +200 ausprobiert, aber dann tut sich irgendwie gar nichts mehr. wer hat eine ahnung an was das liegt bzw. ich dieses problem lösen kann?
hier mein programm:
mfgCode:#include "RP6RobotBaseLib.h"
#define BATRANGE 500
#define RANGE 950
void task_LDRinfo(void)
{writeString_P("LDR_L: ");
writeIntegerLength(adcLSL,DEC,4);
writeChar('\n');
writeString_P("LDR_R: ");
writeIntegerLength(adcLSR,DEC,4);
writeChar('\n');
int16_t dif = ((int16_t)(adcLSL - adcLSR));
if(dif > 100) dif = 100;
if(dif < 100) dif = -100;
if(dif==100)
{setLEDs(0b000001);
moveAtSpeed(20,50);}
else if(dif==-100)
{setLEDs(0b000010);
moveAtSpeed(50,20);}
else{setLEDs(0b000000);
moveAtSpeed(0,0);}
}
void bumpersStateChanged(void)
{if(bumper_left)
{move(60,BWD,DIST_MM(150),true);
rotate(50,RIGHT,90,true);
changeDirection(FWD);
}
if(bumper_right)
{move(60,BWD,DIST_MM(150),true);
rotate(50,LEFT,90,true);
changeDirection(FWD);}
}
int main(void)
{initRobotBase();
powerON();
BUMPERS_setStateChangedHandler(bumpersStateChanged);
while(true)
{task_LDRinfo();
task_RP6System();
task_ADC();
}
return 0;
}
Was macht das Programm bei z.B. 95, oder -43, oder ...?Code:
if(dif > 100) dif = 100; /* Obergrenze 100*/
if(dif < 100) dif = -100; /* Untergrenze -100*/
/* Wertebereich nun -100 ... 100 !!*/
if(dif==100) /* genau gleich 100 ?*/
...
else if(dif== -100) /* genau gleich -100?*/
...
else
/*tue nichts*/
Es ist doch seeehhhr unwahrscheinlich das die Werte genau erreicht werden. Ueberpruefe Deine Abfragen nochmal und sei nicht ganz so strikt mit den Forderungen.
Edit: ich sehe gerade, das Du ja nur die zwei Werte erreichen kannst. Ich sehs mir nochmal genauer an...
Edit2: RP6 dreht also immer entweder rechts oder links und findet nie eine Ruheposition...
hthCode:if(dif < -100) dif = -100; /*so waers wohl besser*/
Kay
hallo, verstehe jetzt leider nicht was du mir mit deinem post sagen willst.
meiner meinung nach ist dein verbesserungsvorschlag doch genau das, wie ich es programmiert habe.
mit +100 und -100 funktioniert das programm ja.
aber wenn ich diese werte mal mit +200 bzw. -200 ersetze geht nichts mehr.
mfg
Steht oben - da fehlt das Minus in der zweiten Abfrage.Zitat:
if(dif > 100) dif = 100;
if(dif < 100 ) dif = -100;
Bei sowas rate ich immer: ALLE Zwischenergebnisse in einzelne Schritte aufdröseln und alles mit writeInteger ausgeben lassen! So lässt sich schnell feststellen wo es hakt.
MfG,
SlyD
macht es dann einen unterschied ob ich in meinem programm if(dif==100){} oder if(dif=100) {} schreibe?
mfg
Das macht einen gewaltigen Unterschied!
"==" ist eine Abfrage auf Gleichheit (kann wahr oder falsch sein)
"=" ist eine Zuweisung (veraendert Deine Variable!)
Das Problem war/ist nur das fehlende "-" in Deiner zweiten Abfrage.
ok, ja stimmt hab ich vorher übersehen. du hast natürlich recht gehabt.
danke nochmal
so, jetzt ist mein programm fertig. funktioniert einwandfrei. der rp6 findet nun jede lichtquelle zuverlässig.
die werte sind auf einen schwach beleuchteten raum ausgelegt, nur für den fall, dass es jemand ausprobieren will.Code:#include "RP6RobotBaseLib.h"
#define BATRANGE 500
#define RANGE 1005
void task_LDRinfo(void)
{writeString_P("LDR_L: ");
writeIntegerLength(adcLSL,DEC,4);
writeString_P(" ; LDR_R: ");
writeIntegerLength(adcLSR,DEC,4);
writeChar('\n');
int16_t dif = ((int16_t)(adcLSL - adcLSR));
if(dif > 50) dif = 50;
if(dif < -50) dif = -50;
if(dif==50 && adcLSL<1005 & adcLSR<1005)
{setLEDs(0b000001);
moveAtSpeed(20,50);}
else if(dif==-50 && adcLSL<1005 & adcLSR<1005)
{setLEDs(0b000010);
moveAtSpeed(50,20);}
else if(adcLSL>1005 || adcLSR>1005)
{moveAtSpeed(0,0);
setLEDs(0b111111);
writeString_P("Lichtquelle gefunden");}
else{setLEDs(0b000000);
moveAtSpeed(50,50);}
}
void bumpersStateChanged(void)
{if(bumper_left)
{move(60,BWD,DIST_MM(150),true);
rotate(50,RIGHT,90,true);
changeDirection(FWD);
}
if(bumper_right)
{move(60,BWD,DIST_MM(150),true);
rotate(50,LEFT,90,true);
changeDirection(FWD);}
}
int main(void)
{initRobotBase();
powerON();
BUMPERS_setStateChangedHandler(bumpersStateChanged);
while(true)
{task_LDRinfo();
task_RP6System();
task_ADC();
}
return 0;
}
mfg
mein Edit zu Drivers ursprünglicher Variante
grussCode:else if ((Licht_L + 1 <= Licht_R) && (Licht_L - 1 >= Licht_R)) //wenn Licht auf beiden Sensoren gleich ist...