#include "asuro.h"
#include "myasuro.h"
gehe zum Quellcode dieser Datei
Funktionen | |
void | GoTurn (int distance, int degree, int speed) |
Faehrt eine bestimmte Strecke mit einer bestimmten Geschwindigkeit. (Autor: stochri) ODER Dreht um einen bestimmten Winkel mit einer bestimmten Geschwindigkeit. (Autor: stochri) Benutzt die Odometrie Sensoren im Interrupt Betrieb. Vor dem ersten Aufruf muss deshalb EncoderInit() aufgerufen werden. |
V--- - bis zum 07.01.2007 -
Bitte in Datei CHANGELOG nachsehen.
Das Grundgeruest dieser Funktionen wurde von stochri erstellt.
V001 - 13.01.2007 - m.a.r.v.i.n
+++ Alle Funktionen
Zerlegte Sourcen in einzelne Dateien fuer eine echte Library.
V002 - 27.01.2007 - Sternthaler
+++ Alle Funktionen
Kommentierte Version (KEINE Funktionsaenderung)
V003 - 20.02.2007 - m.a.r.v.i.n
+++ GO()
+++ Turn()
Korrekturfakturen aus myasuro.h verwenden
V004 - 07.06.2007 - Sternthaler
+++ Go() Entfaellt
+++ Turn() Entfaellt
+++ GoTurn() NEU
Die Funktion GoTurn() ersetzt die Funktionen Go() und Turn() ersatzlos. Um allerdings bestehende Programme nicht umbauen zu muessen, gibt es Macros, die dann GoTurn() aufrufen in asuro.h
V005 - 27.06.2007 - Sternthaler
+++ GoTurn()
Im Beispiel zur Funktion die Variablendefinition in der for()-Schleife fuer i entfernt, da sie nicht immer uebersetzbar ist.
Definiert in Datei encoder.c.
void GoTurn | ( | int | distance, | |
int | degree, | |||
int | speed | |||
) |
Faehrt eine bestimmte Strecke mit einer bestimmten Geschwindigkeit. (Autor: stochri)
ODER
Dreht um einen bestimmten Winkel mit einer bestimmten Geschwindigkeit. (Autor: stochri)
Benutzt die Odometrie Sensoren im Interrupt Betrieb.
Vor dem ersten Aufruf muss deshalb EncoderInit() aufgerufen werden.
[in] | distance | Distanz in mm (- rueckwaerts, + = vorwaerts) Bei 0 wird degree fuer einen Turn benutzt. |
[in] | degree | Winkel (- rechts, + links) |
[in] | speed | Geschwindigkeit (Wertebereich 0...255) |
In der globale Variable encoder, werden die Hell-/Dunkelwechsel der
Encoderscheiben im Interruptbetrieb gezaehlt.
// Laesst den Asuro ein Quadrat von 200 mm fahren, // bei einer Geschwindigkeit von 150. EncoderInit (); for (i = 0; i < 4; i++) { GoTurn (200, 0, 150); // entspricht Go (200, 150) GoTurn ( 0, 90, 150); // entspricht Turn (90, 150) }
Definiert in Zeile 128 der Datei encoder.c.
00132 { 00133 unsigned long enc_count; 00134 int tot_count = 0; 00135 int diff = 0; 00136 int l_speed = speed, r_speed = speed; 00137 00138 /* stop the motors until the direction is set */ 00139 MotorSpeed (0, 0); 00140 00141 /* if distance is NOT zero, then take this value to go ... */ 00142 if (distance != 0) 00143 { 00144 /* calculate tics from mm */ 00145 enc_count = abs (distance) * 10000L; 00146 enc_count /= MY_GO_ENC_COUNT_VALUE; 00147 00148 if (distance < 0) 00149 MotorDir (RWD, RWD); 00150 else 00151 MotorDir (FWD, FWD); 00152 } 00153 /* ... else take the value degree for a turn */ 00154 else 00155 { 00156 /* calculate tics from degree */ 00157 enc_count = abs (degree) * MY_TURN_ENC_COUNT_VALUE; 00158 enc_count /= 360L; 00159 00160 if (degree < 0) 00161 MotorDir (RWD, FWD); 00162 else 00163 MotorDir (FWD, RWD); 00164 } 00165 00166 /* reset encoder */ 00167 EncoderSet (0, 0); 00168 00169 /* now start the machine */ 00170 MotorSpeed (l_speed, r_speed); 00171 00172 while (tot_count < enc_count) 00173 { 00174 tot_count += encoder [LEFT]; 00175 diff = encoder [LEFT] - encoder [RIGHT]; 00176 00177 if (diff > 0) 00178 { /* Left faster than right */ 00179 if ((l_speed > speed) || (r_speed > 244)) 00180 l_speed -= 10; 00181 else 00182 r_speed += 10; 00183 } 00184 00185 if (diff < 0) 00186 { /* Right faster than left */ 00187 if ((r_speed > speed) || (l_speed > 244)) 00188 r_speed -= 10; 00189 else 00190 l_speed += 10; 00191 } 00192 /* reset encoder */ 00193 EncoderSet (0, 0); 00194 00195 MotorSpeed (l_speed, r_speed); 00196 Msleep (1); 00197 } 00198 MotorDir (BREAK, BREAK); 00199 Msleep (200); 00200 }