Mit Ultraschallecholot funktioniert das auch recht gut:
Code:#include "asuro.h" typedef int (*FunctionPointer) (int); FunctionPointer actionList[]; int slow=60; int fast=80; unsigned char currentTask; int wait(int msTime) { long t1=Gettime()+msTime; unsigned char newTask, savedTask=currentTask; int sensor, action=0; do { for(newTask=0; newTask<savedTask; ) { sensor=(*actionList[2*newTask])(newTask); if(sensor) { currentTask=newTask; action|=(*actionList[2*newTask+1])(sensor); newTask=0; } else ++newTask; } } while(t1 > Gettime()); currentTask=savedTask; return action; } void drive(int leftSpeed_, int rightSpeed_) { SetMotorPower(leftSpeed_, rightSpeed_); } int blink_SecTimer(int idx) { static int t1=0; int t0=t1; t1=(Gettime()/1000)&0x1; return t0^t1; // bei Sekundenwechsel ==> 1 sonst 0 } int blink_Action(int sensor) { static int led=GREEN; if(led==GREEN) led=RED; else led=GREEN; StatusLED(led); return 0x0; } int avoid_Obstacle(int idx) { int abstand = Chirp(); if (abstand<10) { BackLED(ON,ON); return abstand; } else { BackLED(OFF,OFF); return 0; } } int avoid_Action(int sensor) { static int flag; drive(-slow, -slow); // 0,5 sec zurueck wait(500); if(flag) { drive(-slow, 0); flag=0; } else { drive(0, -slow); flag=1; } wait(1000); // 1 sec Rückwaertskurve (abwechselnd links und rechts) return 0x1; } int cruise_Forever(int idx) { return 1; } int cruise_Action(int sensor) { drive(fast, fast); // fahr rum return 0x8; } FunctionPointer actionList[] = { /* sense , action */ //motor_Awake, motor_Control, blink_SecTimer, blink_Action, avoid_Obstacle, avoid_Action, cruise_Forever, cruise_Action, }; int main(void) { Init(); EncoderInit(); EncoderStart(); drive(0,0); Msleep(1000); currentTask=sizeof(actionList)/sizeof(FunctionPointer)/2; return wait(0); }







Zitieren

Lesezeichen