Irgendwie bekomm ich das nicht hin...
Hier mal alle Möglichkeiten die ich ausprobiert habe...
1) while-Schleife
Code:
#include "asuro.h"
//Schwellwert für die Hell/Dunkel-Unterscheidung
//Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1
int main(void)
{
unsigned int data [2];
signed int status [2]={0,0};
unsigned int speed=255;
//Startwert für halbe Motorgeschwindigkeit
signed int difference=0;
unsigned int distance=0;
int i;
int zaehler=0;
Init();
MotorDir(FWD,FWD);
BackLED(OFF,OFF);
while (zaehler<4)
{
zaehler++;
switch(distance) {
//Am Anfang der Strecke Vollgas
case 0:MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
//Am Ende langsamer werden...
case 215:speed=200;
break;
case 230:speed=150;
break;
//...und stehen bleiben
case 251:MotorDir(BREAK,BREAK);
//etwas warten, bis der Roboter wirklich steht
for (i=0; i<100; i++)
{
Sleep(255); }
//auf der Stelle nach links drehen
MotorDir(RWD,FWD);
speed=255;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
distance=252;
break;
case 282: speed=200;
break;
case 288: speed=150;
break;
case 292: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255); }
MotorDir(FWD,FWD);
speed=255;
distance=0;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
break;
}
//Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
//Wechsel linker Sensor von niedrig auf hoch?
if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
distance++; }
//Wechsel linker Sensor von hoch auf niedrig?
if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
distance++; }
//Wechsel rechter Sensor von niedrig auf hoch?
if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--; }
//Wechsel rechter Sensor von hoch auf niedrig?
if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--; }
//zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
//Wertebereich verlässt
if(difference<-155) difference=-155;
if(difference>155) difference=155;
//StatusLED noch entsprechend der erkannten Segmente aufleuchten
//lassen, grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);
//Zähldifferenz passemd auf die Motoren verteilen
if(difference>0) MotorSpeed(155-difference,155);
else MotorSpeed(155,155+difference);
}
return 0;
}
Hier fährt ASURO nur geradeaus...
2) for-Schleife
Code:
#include "asuro.h"
//Schwellwert für die Hell/Dunkel-Unterscheidung
//Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1
int main(void)
{
unsigned int data [2];
signed int status [2]={0,0};
unsigned int speed=255;
//Startwert für halbe Motorgeschwindigkeit
signed int difference=0;
unsigned int distance=0;
int i;
int zaehler;
Init();
MotorDir(FWD,FWD);
BackLED(OFF,OFF);
while (1)
{
for(zaehler=0; zaehler<4; zaehler++)
{
switch(distance) {
//Am Anfang der Strecke Vollgas
case 0:MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
//Am Ende langsamer werden...
case 215:speed=200;
break;
case 230:speed=150;
break;
//...und stehen bleiben
case 251:MotorDir(BREAK,BREAK);
//etwas warten, bis der Roboter wirklich steht
for (i=0; i<100; i++)
{
Sleep(255); }
//auf der Stelle nach links drehen
MotorDir(RWD,FWD);
speed=255;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
distance=252;
break;
case 282: speed=200;
break;
case 288: speed=150;
break;
case 292: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255); }
MotorDir(FWD,FWD);
speed=255;
distance=0;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
break;
}
//Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
//Wechsel linker Sensor von niedrig auf hoch?
if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
distance++; }
//Wechsel linker Sensor von hoch auf niedrig?
if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
distance++; }
//Wechsel rechter Sensor von niedrig auf hoch?
if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--; }
//Wechsel rechter Sensor von hoch auf niedrig?
if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--; }
//zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
//Wertebereich verlässt
if(difference<-155) difference=-155;
if(difference>155) difference=155;
//StatusLED noch entsprechend der erkannten Segmente aufleuchten
//lassen, grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);
//Zähldifferenz passemd auf die Motoren verteilen
if(difference>0) MotorSpeed(155-difference,155);
else MotorSpeed(155,155+difference);
}
}
return 0;
}
Hier fährt ASURO immer wieder das Quadrat und hört nicht mehr auf.
3) if-Anweisung
Code:
#include "asuro.h"
//Schwellwert für die Hell/Dunkel-Unterscheidung
//Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1
int main(void)
{
unsigned int data [2];
signed int status [2]={0,0};
unsigned int speed=255;
//Startwert für halbe Motorgeschwindigkeit
signed int difference=0;
unsigned int distance=0;
int i;
int zaehler=0;
Init();
MotorDir(FWD,FWD);
BackLED(OFF,OFF);
while (1)
{
if (zaehler<4)
{
zaehler++;
switch(distance) {
//Am Anfang der Strecke Vollgas
case 0:MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
//Am Ende langsamer werden...
case 215:speed=200;
break;
case 230:speed=150;
break;
//...und stehen bleiben
case 251:MotorDir(BREAK,BREAK);
//etwas warten, bis der Roboter wirklich steht
for (i=0; i<100; i++)
{
Sleep(255); }
//auf der Stelle nach links drehen
MotorDir(RWD,FWD);
speed=255;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
distance=252;
break;
case 282: speed=200;
break;
case 288: speed=150;
break;
case 292: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255); }
MotorDir(FWD,FWD);
speed=255;
distance=0;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
break;
}
//Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
//Wechsel linker Sensor von niedrig auf hoch?
if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
distance++; }
//Wechsel linker Sensor von hoch auf niedrig?
if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
distance++; }
//Wechsel rechter Sensor von niedrig auf hoch?
if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--; }
//Wechsel rechter Sensor von hoch auf niedrig?
if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--; }
//zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
//Wertebereich verlässt
if(difference<-155) difference=-155;
if(difference>155) difference=155;
//StatusLED noch entsprechend der erkannten Segmente aufleuchten
//lassen, grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);
//Zähldifferenz passemd auf die Motoren verteilen
if(difference>0) MotorSpeed(155-difference,155);
else MotorSpeed(155,155+difference);
}
}
return 0;
}
Nun fährt ASURO im Kreis.
4) if-else-Anweisung
Code:
#include "asuro.h"
//Schwellwert für die Hell/Dunkel-Unterscheidung
//Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1
int main(void)
{
unsigned int data [2];
signed int status [2]={0,0};
unsigned int speed=255;
//Startwert für halbe Motorgeschwindigkeit
signed int difference=0;
unsigned int distance=0;
int i;
int zaehler=0;
Init();
MotorDir(FWD,FWD);
BackLED(OFF,OFF);
while (1)
{
if (zaehler<4)
{
zaehler++;
switch(distance) {
//Am Anfang der Strecke Vollgas
case 0:MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
//Am Ende langsamer werden...
case 215:speed=200;
break;
case 230:speed=150;
break;
//...und stehen bleiben
case 251:MotorDir(BREAK,BREAK);
//etwas warten, bis der Roboter wirklich steht
for (i=0; i<100; i++)
{
Sleep(255); }
//auf der Stelle nach links drehen
MotorDir(RWD,FWD);
speed=255;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
distance=252;
break;
case 282: speed=200;
break;
case 288: speed=150;
break;
case 292: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255); }
MotorDir(FWD,FWD);
speed=255;
distance=0;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
break;
}
//Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
//Wechsel linker Sensor von niedrig auf hoch?
if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
distance++; }
//Wechsel linker Sensor von hoch auf niedrig?
if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
distance++; }
//Wechsel rechter Sensor von niedrig auf hoch?
if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--; }
//Wechsel rechter Sensor von hoch auf niedrig?
if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--; }
//zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
//Wertebereich verlässt
if(difference<-155) difference=-155;
if(difference>155) difference=155;
//StatusLED noch entsprechend der erkannten Segmente aufleuchten
//lassen, grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);
//Zähldifferenz passemd auf die Motoren verteilen
if(difference>0) MotorSpeed(155-difference,155);
else MotorSpeed(155,155+difference);
}
else MotorDir(BREAK,BREAK);
}
return 0;
}
Hier springt er sofort in else, da er stehen bleibt.
5) do-while-Schleife
Code:
#include "asuro.h"
//Schwellwert für die Hell/Dunkel-Unterscheidung
//Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1
int main(void)
{
unsigned int data [2];
signed int status [2]={0,0};
unsigned int speed=255;
//Startwert für halbe Motorgeschwindigkeit
signed int difference=0;
unsigned int distance=0;
int i;
int zaehler=0;
Init();
MotorDir(FWD,FWD);
BackLED(OFF,OFF);
while (1)
{
do
{
zaehler++;
switch(distance) {
//Am Anfang der Strecke Vollgas
case 0:MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
//Am Ende langsamer werden...
case 215:speed=200;
break;
case 230:speed=150;
break;
//...und stehen bleiben
case 251:MotorDir(BREAK,BREAK);
//etwas warten, bis der Roboter wirklich steht
for (i=0; i<100; i++)
{
Sleep(255); }
//auf der Stelle nach links drehen
MotorDir(RWD,FWD);
speed=255;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
distance=252;
break;
case 282: speed=200;
break;
case 288: speed=150;
break;
case 292: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255); }
MotorDir(FWD,FWD);
speed=255;
distance=0;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
break;
}
//Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
//Wechsel linker Sensor von niedrig auf hoch?
if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
distance++; }
//Wechsel linker Sensor von hoch auf niedrig?
if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
distance++; }
//Wechsel rechter Sensor von niedrig auf hoch?
if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--; }
//Wechsel rechter Sensor von hoch auf niedrig?
if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--; }
//zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
//Wertebereich verlässt
if(difference<-155) difference=-155;
if(difference>155) difference=155;
//StatusLED noch entsprechend der erkannten Segmente aufleuchten
//lassen, grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);
//Zähldifferenz passemd auf die Motoren verteilen
if(difference>0) MotorSpeed(155-difference,155);
else MotorSpeed(155,155+difference);
}
while (zaehler<4);
}
return 0;
}
Auch hier fährt ASURO unendlich Quadrate.
Ich bin der Meinung, dass ich die Schleifen irgendwie falsch setze, sonst müsste ja eine funktionieren.
Oder mein Zähler funktioniert nicht....
Er muss ja aber sowohl die Differenz und die Odometrie 4mal ausführen, also muss ich die Schleifen in die while setzen. Ich kann ja die Schleifen nicht vor der Odometrie enden lassen, oder?
Lesezeichen