Wie mache ich das nu genau mit den Odometrie Sensoren? Kann mir mir einer helfen?
Druckbare Version
Wie mache ich das nu genau mit den Odometrie Sensoren? Kann mir mir einer helfen?
hast du vor der go funktioin Encoder_Init() aufgerufen.
sonszt geht das ganze nicht, weil dann die go funktion glaubt, der asuro würde stillstehen obwohl er fährt
mfg EDH
Du kannst auch einfach folgende go-Funtkion verwenden. Als Input parameter wird die Distanz in "mm" angegeben. Funktioniert je nach Bodenbeschaffenheit relativ genau.
Gruss,
stochri
Code:/***************************************************************************
*
* void Go(int distance, int power = 150)
*
* Go distance in mm. Attention: Encoder_Init() has to be called first.
*
* the driven distance depends a little bit from the floor friction
* limitations: maximum distance +-32m
* possible problems: in full sunlight the encoder sensors may be disturbed
*
* input
* distance: postiv->go forward ; negativ-> go backward
* power: sets motorpower
*
* example:
*
* Encoder_Init();
* Msleep(5000);
* Go(200,150); // move 20cm vorward
* Msleep(2000);
* Go(-200,150); // move 20cm backward
* Msleep(2000);
*
*
* last modification:
* Ver. Date Author Comments
* ------- ---------- -------------- ---------------------------------
* sto1 29.07.2005 stochri motorfunction
* And1 31.07.2005 Andun added speed and Odometrie
* sto1 31.10.2006 stochri distance in mm
* ------- ---------- -------------- ---------------------------------
*
***************************************************************************/
void Go(int distance, int power)
{
uint32_t enc_count;
int tot_count = 0;
int diff = 0;
int l_speed = power, r_speed = power;
// calculation tics/mm
enc_count=abs(distance)*10000L;
enc_count/=19363L;
Encoder_Set(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
if(distance<0) MotorDir(RWD,RWD);
else MotorDir(FWD,FWD);
while(tot_count<enc_count) {
tot_count += encoder[LEFT];
diff = encoder[LEFT] - encoder[RIGHT];
if (diff > 0) { //Left faster than right
if ((l_speed > power) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
}
if (diff < 0) { //Right faster than left
if ((r_speed > power) || (l_speed > 244)) r_speed -= 10;
else l_speed += 10;
}
Encoder_Set(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
Msleep(1);
}
MotorDir(BREAK,BREAK);
Msleep(200);
}
Ja Go Funktion funktioniert nun, ist aber leider fehleranfällig...
bereits hier macht er fehler:
#include "asuro.h"
int main(void)
{
Init();
BackLED(ON,ON);
Encoder_Init();
Go(2000,140,130); Msleep(200);
BackLED(OFF,OFF);
while(1);
return 0;
}
Fährt durch BackLED unendlich lang , hört nicht mehr auf zu leuchten...
Ist das die Rechnungsformel ?
was passiert hier? Kann ich die Übergänge der Odometrie (...wegL++, ...wegR++;...) lesen, dann diese Formel einsetzen?Zitat:
uint32_t enc_count;
int tot_count = 0;
...
enc_count=abs(distance)*10000L;
enc_count/=19363L;
Wenn der ASURO unendlich lange fährt, könnte das an einer Fehlfunktion Deiner Odometriesensoren liegen. Probiere das Programm mal in einm dunklen Raum aus. Oder besser: probiere ein Programm das Du nicht selbst geschrieben hast und sicher funktioniert aus. Je nach ASURO können die Schaltschwellen für die Sensoren anders liegen.
Die Rechnung oben( ohne abs() ) stellt eine Division durch 1,9363 dar. Die Zahl wird zuerst mit 10000 multiplieziert und dann durch 19363 dividiert damit man keine Fließkommazahlen braucht.
Gruss,
stochri