Absolutes "No Go". Er hat doch noch Zeit, die Lösung umzusetzen! Also fangen wir mal an:"sorry Leute, ich krieg es nicht hin, ich habe versagt..."
Quelle: Gruber u. Hofmann, Mehr Spaß mit ASURO Band II, S.36/37.
Hierbei werden zwei Triangulationssensoren (Sharp GP2D12) eingesetzt. Das Prinzip ist "Rechte Hand an der Wand".Code:// ******************************************* // * Triangulation für ASURO * // * * // * Versucht, einen konstanten Abstand zur * // * rechten Wand einzuhalten * // * (c) 2007 Robin Gruber * // * Details zum Code in: * // * "Mehr Spaß mit ASURO, Band II" * // ******************************************* #include "asuro.h" #define DISTANCE 400 #define GAIN1 1 #define GAIN2 4 #define MAXSPEED 255 /* Funktion zum Auslesen der Abstandssensoren (links, rechts) */ void DistanceData(unsigned int *data) { // Prozessorinterne Referenz verwenden // Multiplexer auf linken Sensor schalten ADMUX = (1 << REFS0) | (1 << REFS1) | IR_LEFT; // Wandlung starten ADCSRA |= (1 << ADSC); // Warten, bis Wandlung beendet while (!(ADCSRA & (1 << ADIF))); // ADCIF zurücksetzen ADCSRA |= (1 << ADIF); // ADC-Wert auslesen data[0] = ADCL + (ADCH << 8); // normale Sensoranordnung // data[1] = ADCL + (ADCH << 8); // gekreuzte Sensoranordnung // Prozessorinterne Referenz verwenden // Multiplexer auf linken Sensor schalten ADMUX = (1 << REFS0) | (1 << REFS1) | IR_RIGHT; // Wandlung starten ADCSRA |= (1 << ADSC); // Warten, bis Wandlung beendet while (!(ADCSRA & (1 << ADIF))); // ADCIF zurücksetzen ADCSRA |= (1 << ADIF); // ADC-Wert auslesen data[1] = ADCL + (ADCH << 8); // normale Sensoranordnung // data[0] = ADCL + (ADCH << 8); // gekreuzte Sensoranordnung } int main(void) { unsigned int data[2]; signed int diff; Init(); MotorDir(FWD, FWD); MotorSpeed(MAXSPEED, MAXSPEED); while(1) { // Entfernungen einlesen DistanceData(data); // Differenz zum Sollwert ausrechnen und gewichten diff=(data[1]-DISTANCE)*GAIN1; // Drehen, falls der linke Sensor ein nahes Hindernis sieht if (data[0]>DISTANCE) diff+=(data[0]-DISTANCE)*GAIN2; // Wert nach oben und unten begrenzen if (diff>MAXSPEED) diff=MAXSPEED; if (diff<-MAXSPEED) diff=-MAXSPEED; // wenn zu nah, linken Motor langsamer, ... if (diff>0) MotorSpeed(MAXSPEED-diff,MAXSPEED); // ... sonst rechten Motor langsamer else MotorSpeed(MAXSPEED,MAXSPEED+diff); } return 0; }







Zitieren

Lesezeichen