Ups, stimmt. Das habe ich völlig verdrängt. Ein einfacher Ansatz:allerdings fehlt jetzt komplett die komponente mit der konstanten Geschwindigkeit.
speedSoll wird gerecht zwischen beiden Motoren aufgeteilt. Ob das so funktioniert kann ich leider nicht feststellen. Eine ernsthaftere Lösung sollte die Wege über der Zeit messen und danach die Motoren regeln. Aber das kann man nicht so auf die Schnelle zusammenbasteln...Code:#include "asuro.h" //#include <stdlib.h> int main(void) { unsigned char flagl=0, flagr=0; unsigned int data[2]; //Speicher Bereitstellen int wegl, wegr, diff, time, timeb; int speed, speedLeft, speedRight; int speedSoll, speedDiff; Init(); MotorDir(RWD,RWD); StatusLED(GREEN); speedSoll=200; speedLeft = speedRight = speed = speedSoll; while(TRUE) { wegl=0; wegr=0; for(time=1; time<500; time++) // Zeitschleife 1 Sekunde { OdometrieData(data); if ((data[0] < 550) && (flagl == 1)) {flagl = 0; wegl++;} if ((data[0] > 650) && (flagl == 0)) {flagl = 1; wegl++;} if ((data[1] < 550) && (flagr == 1)) {flagr = 0; wegr++;} if ((data[1] > 650) && (flagr == 0)) {flagr = 1; wegr++;} diff=wegr-wegl; if (diff>0) speedRight--; // fahre geradeaus else if (diff<0) speedLeft--; else { speedRight=speed; speedLeft=speed; } // Summe links+rechts mit 2*soll vergleichen und die Differenz addieren speedDiff=(2*speedSoll-(speedLeft+speedRight))/2; speedLeft+=speedDiff; speedRight+=speedDiff; StatusLED(GREEN); // gelb=beschleunigen, rot=bremsen, gruen=sollspeed? if (speedDiff > 0) StatusLED(YELLOW); if (speedDiff < 0) StatusLED(RED); MotorSpeed(speedLeft,speedRight); //SerWrite(wegl, sizeof(wegl)); Sleep(76); // 1 Millisekunde pause } if(PollSwitch()>0) { for (timeb=1;timeb<500;timeb++) { if(PollSwitch()>0) { MotorDir(BREAK,BREAK); BackLED(ON,ON); Sleep(76); } } } } return 0; }
Eigentlich warte ich noch auf den unvermeidlichen(?) Hinweis auf die erweiterten Funktionen der aktuellen asuro-Lib. Damit gehts zwar auch, aber man lernt eben mehr, wenn man es selbst macht.
Gruß
mic







Zitieren

Lesezeichen