hey junges ihr könnt mir doch garantiert helfen, also wie bereits beschrieben versuche ich mich grade an Odometrie.
dazu hab ich mir nenn Quellcode aus dem netzt geholt, der funktioniert auch aber wenn ich denn so veränder das ich den als extra Funktion verwenden kann (func Drehzahl) fährt der asuro nicht mehr grade aus sonder so wie immer im Kreis.
Ich hätte den Quellcode auch eig. lieber ohne globale variablen aber ich weis nicht mehr wie man 2 Werte aus einer Funktion zurück gibt, also wen das schon mal jemand weiß würde ich mich auch schon freuen.
ich hoffe ihr könnt mir weiter helfen.^^
Quellcode aus dem netzt:
Code:
#include "asuro.h"
// Schwellwert für die Hell/Dunkel-Unterscheidung
// Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
int main(void)
{
int iSpeed = 120;
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
Init();
MotorDir(FWD, FWD);
while(1) {
// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
// Wechsel rechter Sensor von niedrig auf hoch?
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--;
}
// Wechsel rechter Sensor von hoch auf niedrig?
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--;
}
// zur Sicherheit: verhindern, dass der Differenzz�ler
// den erlaubten Wertebereich verl�st
if (difference<-iSpeed) difference=-iSpeed;
if (difference>iSpeed) difference=iSpeed;
// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
StatusLED(status[0]+status[1]*2);
// Z�ldifferenz passend auf die Motoren verteilen
if (difference>0) MotorSpeed(iSpeed-difference,iSpeed);
else MotorSpeed(iSpeed,iSpeed+difference);
}
return 0;
}
mein veränderter Quellcode:
Code:
#include "asuro.h"
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
int iaSpeed[2]={120,120};
int main()
{
BackLED(OFF,OFF);
Init();
while(1)
{
MotorFWD();
}
}
void MotorFWD(void)
{
MotorDir(FWD,FWD);
drehzahl(120,120);
MotorSpeed(iaSpeed[0],iaSpeed[1]);
FrontLED(ON);
return 0;
}
int drehzahl(int iSpeed_left,int iSpeed_right)
{
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
// Wechsel rechter Sensor von niedrig auf hoch?
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--;
}
// Wechsel rechter Sensor von hoch auf niedrig?
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--;
}
// zur Sicherheit: verhindern, dass der Differenzz�ler
// den erlaubten Wertebereich verl�st
if (difference<-255) difference=-255;
if (difference>255) difference=255;
// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
//StatusLED(status[0]+status[1]*2);
// Z�ldifferenz passend auf die Motoren verteilen
if (difference>0) iSpeed_left-difference;
else iSpeed_right+difference;
iaSpeed[0] = iSpeed_left;
iaSpeed[1] = iSpeed_right;
return 0;
}
Lesezeichen