Eine bestimmte Strecke soll mit dem ASURO zurückgelegt werden, Werte in odometrie.h Eintragen (grösse der Scheibe, Schwellwerte für links/rechts (aus 1. Programm Mittelwert) und die Anzahl Umdrehungen die das kleine Zahnrad machen soll)
odometrie.c
#include "asuro.h" #include "odometrie.h" int main(void) { /** flag für aktuellen zustand der farbe */ int Lnow = 0; int Rnow = 0; int Rold = 0; int Lold = 0; // haben sich die werte geändert unsigned int fl_Lch = 0; unsigned int fl_Rch = 0; /** zähler für farbwechsel */ unsigned int Count1 = 0; unsigned int Count2 = 0; int diff = 0; /** Geschwindigkeit */ int sl = 130; int sr = 130; /** Odometrie links/rechts */ unsigned int data[2]; Init(); GREEN_LED_ON; while(1) { MotorDir(FWD,FWD); MotorSpeed(sl,sr); OdometrieData(data); // 0. links, 1. rechts // Schwellwert für schwarz/weiss linke Seite if (data[0] > THRES_L) Lnow = 1; else Lnow = 0; // Schwellwert für schwarz/weiss rechte Seite if (data[1] > THRES_R) Rnow = 1; else Rnow = 0; // wenn sich der linke Wert geändert hat zähler ++ if (Lnow ^ Lold) { Count1++; fl_Lch = 1; } else { fl_Lch = 0; } // wenn sich der rechte Wert geändert hat zähler ++ if (Rnow ^ Rold) { Count2++; fl_Rch = 1; } else { fl_Rch = 0; } // hat sich der Asuro bewegt ? if (fl_Rch || fl_Lch) { // alte werte merken für nächsten schleifendurchlauf Lold = Lnow; Rold = Rnow; diff = Count2 - Count1; if (diff > 0) sr--; else if (diff < 0) sl--; else { sr = 130; sl = 130; } if (sr < 50) { sr = 0; } if (sl < 50) { sl = 0; } } // nach einer bistimmten Strecke stehenbleiben if (Count1 == WEITE ) { break; } } MotorDir(BREAK, BREAK); MotorSpeed(0, 0); RED_LED_ON; while(1) { } return 0; }
/******************************************************************************* * * File Name: odometrie.h * Project : ASURO * * * Ver. Date Author Comments * ------- ---------- -------------- ------------------------------ * 1.00 25.06.2005 Linux_80 */ #ifndef ODOMETRIE_H #define ODOMETRIE_H /** grösse der fächerscheibe 12 oder 8 */ #define ODOSIZE 8 // bei 5 dreht sich das Rad einmal -> 122mm ! #define UMDREH 15 #define WEITE ODOSIZE*UMDREH /** Schwellwert für schwarz/weiss (530) */ #define THRES_L 540 #define THRES_R 540 #define _CLI() do { __asm__ __volatile__ ("cli"); } while (0) #define _SEI() do { __asm__ __volatile__ ("sei"); } while (0) #define _NOP() do { __asm__ __volatile__ ("nop"); } while (0) #endif /* ODOMETRIE_H */