Achte darauf das odometrie nicht gleichzeitig benutzt werden kan mit leuchten von den backleds. Die odometriescheiben beleuchtung geht dan aus und die swärz/weiss ubergangen werden dan möglich niet richtig erkannt.Zitat:
Zitat von isor
Druckbare Version
Achte darauf das odometrie nicht gleichzeitig benutzt werden kan mit leuchten von den backleds. Die odometriescheiben beleuchtung geht dan aus und die swärz/weiss ubergangen werden dan möglich niet richtig erkannt.Zitat:
Zitat von isor
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:
mein veränderter Quellcode: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;
}
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;
}
deine code:
Hier passiert nichts! Dort wird nur eine summe/differenz gemacht. Aber die iSpeed_left und iSpeed_right variabelen werden damit nicht geändert.Zitat:
// Z�ldifferenz passend auf die Motoren verteilen
if (difference>0) iSpeed_left-difference;
else iSpeed_right+difference;
Mache das mit:
iSpeed_left-=difference; /* nehm difference ab von iSpeed_left */
iSpeed_right+=difference; /* addiere difference zu iSpeed_right */
jo danke hab ich ganz vergessen