-
Im Moment ist bei meinem ASURO incl. US die Odometrie nicht kalibriert, aber probiere das mal so:
Code:
#include "asuro.h" //incl. US
int abstand=0;
int j=0;
void fahren (void)
{
//EncoderInit();
Go (200,150);
Msleep(1000);
Turn (85,150);
Msleep(1000);
}
void entfernung(void)
{
SerWrite("\r\n --- ultrasonic test ---",29);
Msleep(1000);
do
{
abstand=Chirp();
SerWrite("\r\n distanz in cm ",16);
Msleep(500);
PrintInt(abstand);
if(abstand > 25)
{
StatusLED(GREEN);
Msleep(500);
fahren();
}
else
{
StatusLED(RED);
Msleep(500);
Turn(180,200);
}
}
while(1);
}
int main(void)
{
Init();
EncoderInit ();
for (j = 0; j < 8; j++)
{
entfernung();
StatusLED(YELLOW);
Msleep(500);
}
while(1);
return 0;
}
Damit läuft er mal in den if- und mal in den else-Zweig, und er schickt ständig Werte auf das Hyperterminal. Damit kommst Du weiter.
Die for-Schleife in main() wird übrigens nur einmal ausgeführt, weil er sich ja in entfernung() in der do/while-Schleife fängt. Das macht bezüglich der Ablauflogik keinen Sinn. Das solltest Du ändern.
-
hi ehenkes,
ich musste vorher noch die ionka.h includen, ohne die dort vorhadenen funktionen für die US-erweiterung kam asuro gleich in den "turn.
bei diesem code:
Code:
#include "asuro.h" //incl. US
#include "inka.h"
int abstand=0;
int j=0;
void fahren (void)
{
//EncoderInit();
Go (200,150);
Msleep(1000);
Turn (85,150);
Msleep(1000);
}
void entfernung(void)
{
SerWrite("\r\n --- ultrasonic test ---",29);
Msleep(1000);
do
{
abstand=Chirp();
SerWrite("\r\n distanz in cm ",16);
Msleep(500);
PrintInt(abstand);
if(abstand > 25)
{
StatusLED(GREEN);
Msleep(500);
fahren();
}
else
{
StatusLED(RED);
Msleep(500);
Turn(180,200);
}
}
while(1);
}
int main(void)
{
Init();
EncoderInit ();
for (j = 0; j < 8; j++)
{
entfernung();
StatusLED(YELLOW);
Msleep(500);
}
while(1);
return 0;
}
geht er aber auch sofort in die drehung, an das terminal wird ebenfalls nichts gesendet...
-
ach jetzt versteh ich das while... ](*,) ...hatte vergessen dass das zu do gehört, sorry
-
So ich habe jetzt die Odometrie in Ordnung gebracht und Dein Programm - wie von mir geändert - nochmals getestet. Bei mir klappt das prinzipiell gut. Allerdings reagiert er noch nicht schnell genug auf Hindernisse. Er rennt dagegen. Das lässt sich aber leicht optimieren.
Dies heißt nun aber, dass bei Dir irgendwo an anderer Stelle im Programmgerüst etwas nicht stimmt. Klappt das bei Dir mit der Status-LED? Geht die auf rot, wenn Du etwas davor hälst, und dann wieder auf grün, wenn alles frei ist?
-
ich habe auch überlegt und herumgespielt, ich denke es liegt am vorgegebenem abstand >25, das muss ich ändern, weil es bei der messung bei mir aussreiser nach oben wie auch nach unten gibt. Vielleich würde es reichen 2-3mal zu messen, also eine for schleife statt dem do/while und mitteln, ähnlich wie bei den tasterabfragen? Was hälst du davon? Würde das helfen?
Momentan muss ich opfer bringen, komme nicht an "meinen" rechner, meiner tochter hat ferien und spielt simms :-(
-
Ausreißer sind ein Problem. Ich habe dafür an anderer Stelle mal Folgendes entwickelt, aber das geht sicher noch raffinierter:
Code:
#include "asuro.h"
#define MAXDIFF 90
int main(void)
{
int abstand, abstand_alt, diff, zaehler=0;
Init();
abstand = Chirp();
while(TRUE)
{
abstand_alt = abstand;
abstand = Chirp(); ++zaehler;
diff = abstand - abstand_alt;
if( (abstand>15) && (abs(diff)<MAXDIFF) )
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(150, 150);
}
else if( (abstand>10) && (abstand<=15) && (abs(diff)<MAXDIFF) )
{
StatusLED(YELLOW);
MotorDir(FWD, FWD);
MotorSpeed(150, 100);
Msleep(10);
}
else
{
StatusLED(RED);
MotorDir(RWD, RWD);
MotorSpeed(150, 100);
Msleep(10);
}
if (zaehler > 800)
{
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD, RWD);
MotorSpeed(200, 250);
Msleep(10);
BackLED(OFF,OFF);
}
if (zaehler > 810)
{
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD, RWD);
MotorSpeed(250, 200);
Msleep(10);
BackLED(OFF,OFF);
if(zaehler > 820)
zaehler = 0;
}
}
return 0;
}