Leider wie bei mir, er dreht immer nach links weg :-(
Druckbare Version
Leider wie bei mir, er dreht immer nach links weg :-(
oh ich seh grad beim asuro wird der timer 1 gar nicht benutzt
versuchs mal mit meinem code und TCNT2
Jetzt hat's geklappt, danke für deine Hilfe!
Projekt fertig: \:D/
US-Code für ASURO mit folgenden Extras:
- Geradeausfahrt mit Odometriezähler (Ausgleich Links, Rechts)
- Wegdrehen bei Tasterberührung von der Wand (T1,T2,T3 links - T4,T5,T6 rechts)
- bei Abstand < 15 cm wegdrehen von der Wand mittels Zufallsgenerator (Links oder Rechts mittels Timer TCNT2)
Mein ASURO verhält sich jetzt viel natürlicher (wie ein Hamster) :-)Code:
#include "asuro.h"
#include "ultrasonic.h"
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
int main(void)
{
int abstand, sw, sw0, sw1, sw2;
unsigned char ocr = 0;
unsigned char ocr1 = 0;
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
Init();
while(1)
{
sw0=PollSwitch();
sw1=PollSwitch();
sw2=PollSwitch();
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(150, 150);
}
abstand = Chirp();
StatusLED(YELLOW);
if (sw==32)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==16)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==8)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==1)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==2)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
if (sw==4)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
else if (abstand<15)
{
ocr = TCNT2;
ocr1 =ocr/2;
ocr1 *=2;
if (ocr == ocr1){
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(150, 150);
Msleep(600);
}
else
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
MotorDir(FWD,RWD);
MotorSpeed(150, 150);
Msleep(600);
}
}
else
{
OdometrieData(data);
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
}
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--;
}
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--;
}
if (difference<-155) difference=-155;
if (difference>155) difference=155;
StatusLED(status[0]+status[1]*2);
if (difference>0) MotorSpeed(155-difference,155);
else MotorSpeed(155,155+difference);
}
}
return 0;
}
Kopieren erlaubt, Verbesserungsvorschläge willkommen!
Danke an inka und MartinFunk für die Unterstützung!
hi pinsel,
gleich einen vereinfachungsvorschlag für die tasterabfrage:
abfrage für zusammengehörende taster zusammenfassen mit hilfe von:
if ((sw==1) || (sw==2) || (sw==3))
(k1, k2, k1+k2) - ich bin ziemlich sicher dass man die abfrage der innenliegenden taster nicht braucht...
wenn ich pinsles programm compilieren möchte, kommt diese Fehlermeldung:
J:\ASURO\Programme\asuro_libv271\examples\FirstTry/test.c:47: undefined reference to `Chirp'
das heißt doch, dass er "Chirp" nicht kennt oder? oder will er in den klammern ein wert haben?
mfg
Hi JensK,
guckst du hier: https://www.roboternetz.de/phpBB2/ze...=asc&start=103
oder in die ultrasonic.c aus der lib 2.7.1...
Hi Inka,
mit deiner Vereinfachung habe ich den Code von 42 auf 36 Pages reduziert.
Noch was - hast du schon Erfahrungen mit der Triangulation gemacht?
hi pinsel,
meinst du die sensoren aus dem asurobuch?