PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : In den Anfängen der Odomedrieauslesung



Nada
07.04.2007, 18:50
Hallo zusammen
Ich habe mich mal an die berühmt berüchtigte Odometrie gewagt. Und will einfach mal den Zustand der linken Schranke mit den LED's ausgeben.
#include "asuro.h"

int main(void)
{
unsigned int data[2]; // Speicher breitstellen
Init();
while(1)
{
OdometrieData(data); // Auslesen
if(data[0]>512) //Wenn links dunkel
{
BackLED(ON,OFF); //Linke LED on
}
else
{
BackLED(OFF,ON); //Wenn links hell , dann Rechte LED ON
}
}
while(1);
return 0;
}

Leider passiert überhaupt nichts....

Achja, schalten sich die Dioden D13 und 14 von selbst ein, oder muss ich die auch noch rumkommandieren.

Danke, im Voraus.

m1ch15inner
07.04.2007, 20:02
nix da.... die backleds und die odo liegen auf einem pin
lass die backLEDs aus ;)
und
Encoder_Init();
Encoder_Set(0,0);
sollte noch an den anfang nach Init();
um die encoder zu initalisieren

ach ja und Die encoder daten geben doch die ticks aus und nicht den helligkeitswert aus!? (ich weis bei der lib-doc stehts anders drin)

Nada
07.04.2007, 20:47
Cool, danke. Das mit den Back LED's wusste icht nicht.

Öhm kann es sein, dass das mit den Encoder Daten nur bei einer erweitertern "Asuro.h" funzt, beziehungsweise, dass er dann die Ticks direkt augibt?

m1ch15inner
07.04.2007, 20:52
ja... bei odometrie arbeitest du besser mit der erweiterten lib... obwohls bei mir auch nich richtig klappen will

radbruch
08.04.2007, 08:41
Hallo


Ich habe mich mal an die berühmt berüchtigte Odometrie gewagt. Sehr mutig. *lob*

Ich verwende die verschiedenen Farben der StatusLED zur Anzeige der Odometrie-Ergebnisse. Die BackLEDs werden nicht nur mit den selben Pins angesteuert, sie stören auch die Odometrie:


unsigned int data1[2], data2[2];

BackLED(OFF,OFF);
Sleep(200);

LineData(data1);
LineData(data2);

SerWrite("\n\r",2);
PrintInt(data1[0];
Serwrite(" - ",3);
PrintInt(data1[1];
SerWrite("\n\r",2);
PrintInt(data2[0];
Serwrite(" - ",3);
PrintInt(data2[1];

BackLED(ON,ON);
Sleep(200);

LineData(data1);
LineData(data2);

SerWrite("\n\r",2);
PrintInt(data1[0];
Serwrite(" - ",3);
PrintInt(data1[1];
SerWrite("\n\r",2);
PrintInt(data2[0];
Serwrite(" - ",3);
PrintInt(data2[1];


Um die Odometrie zu verstehen, sollte man nicht mit den Funktionen der erweiterten Libs beginnen. *tippgibt*

Gruß

mic

Nada
08.04.2007, 14:02
Hey, habe gerade mal dein Programm studiert. Damit willst du beweisen, dass die Back LED's die Resultate verfälschen? Bzw. dass dann nicht zweimal der gleiche Wert herauskommt?

Öhm, hast du LineData mit OdometrieData verwechelt oder klemmts bei mir?

Und noch eine Frage, warum lässt du den Asuro schlafen vor dem Auslesen der Daten?

Ich versuche mal mein Asuro ein paar Ticks weit fahren zu lassen, vorerst ohne die erweiterte LIB ;)
Mein Ansatz: Wenn die Differenz zwischen einem alten Wert und dem aktuell ausgelesenen Wert genügend gross (denke so 200) , dann ist der wechsel passiert.

@ m1ch15inner
Ich habe mir trotztem einmal die erweiterte Lib heruntergeladen. Bin aber noch nicht ganz schlau geworden was ich mit den Funktionen alles Anfangen kann.
Habe mir mal die Go() und die Turn() Funktion angeschaut in deinem Thread ;)

radbruch
08.04.2007, 14:53
oder klemmts bei mir?
Ne, bei mir klemmts, ich bin noch voll im Liniensuchwahn. Es soll selbstverständlich OdometrieData() heisen, alles andere hat hier keinen echten Sinn. Sowas passiert, wenn man den Code ungetestet auf die Reise schickt...

Also ich habe bei meinen Odo-Spielereien unter anderem festgestellt, dass wenn man die BackLEDs anhat und dann mehrfach den Odo-Wert ausliest, sich bei der ersten Lesung Fehler ergeben. Ich weis nicht, ob das Licht der LED oder das automatische Umschalten der BackLEDs auf die ODO-LEDs den Effekt verursacht. Der Sleep() wartet bis die LED richtig brennt bzw. aus ist. Hier nun der bearbeitete Code:


#include "../inc/asuro.h"
#include "../inc/asuro.c"

int main(void) {
unsigned int data1[2], data2[2], data3[2];

Init();
do{

BackLED(OFF,OFF);
Sleep(200);

OdometrieData(data1);
OdometrieData(data2);

SerWrite("\n\n\rBackLEDs(OFF,OFF)",20);
SerWrite("\n\rErste Messung: ",18);
PrintInt(data1[0]);
SerWrite(" - ",3);
PrintInt(data1[1]);
SerWrite("\n\rZweite Messung: ",18);
PrintInt(data2[0]);
SerWrite(" - ",3);
PrintInt(data2[1]);

BackLED(ON,ON);
Sleep(200);

OdometrieData(data1);
OdometrieData(data2);
OdometrieData(data3);

SerWrite("\n\rBackLEDs(ON,ON)",17);
SerWrite("\n\rErste Messung: ",18);
PrintInt(data1[0]);
SerWrite(" - ",3);
PrintInt(data1[1]);
SerWrite("\n\rZweite Messung: ",18);
PrintInt(data2[0]);
SerWrite(" - ",3);
PrintInt(data2[1]);
SerWrite("\n\rDritte Messung: ",18);
PrintInt(data3[0]);
SerWrite(" - ",3);
PrintInt(data3[1]);

}while (1);
return 0;
}

Entschuldigung nochmals für den schludrigen ersten Code.

Der "Fehler" tritt offensichtlich nur bei der ersten linken Lesung auf. Rechts ist der Effekt fast nicht zu erkennen (wenn man davon absieht, dass sich die Pegel insgesamt erhöhen!):



BackLEDs(OFF,OFF)
Erste Messung: 494 - 219
Zweite Messung: 494 - 219
BackLEDs(ON,ON)
Erste Messung: 783 - 366
Zweite Messung: 558 - 363
Dritte Messung: 558 - 363


Unerwarteterweise erhalte ich direkt nach dem Einschalten folgende Ausgabe:



BackLEDs(OFF,OFF)
Erste Messung: 267 - 663
Zweite Messung: 505 - 668
BackLEDs(ON,ON)
Erste Messung: 750 - 713
Zweite Messung: 569 - 712
Dritte Messung: 569 - 712

BackLEDs(OFF,OFF)
Erste Messung: 509 - 670
Zweite Messung: 509 - 670
BackLEDs(ON,ON)
Erste Messung: 751 - 713
Zweite Messung: 569 - 712
Dritte Messung: 569 - 712

BackLEDs(OFF,OFF)
Erste Messung: 508 - 670
Zweite Messung: 508 - 670
BackLEDs(ON,ON)
Erste Messung: 751 - 713
Zweite Messung: 570 - 712
Dritte Messung: 570 - 712

Wenn die Wertänderung größer als z.b. 200 ist sollte funktionieren solange keine "Ausrutscher" auftauchen.

Schönes Ostern-WE noch

mic

Nada
08.04.2007, 16:00
Cool, danke für deinen Code.

Meine Tickzählung will noch nicht so recht funktionieren...

radbruch
08.04.2007, 16:46
Ein kleines Beispiel, hier wird die StatusLED mit der Raddrehung geschaltet:



#include "../inc/asuro.h"
#include "../inc/asuro.c"

/* Pegel fuer low und high */
/* (mein asuro hat grad keine Abdeckungen ueber den Sensoren) */
#define schwelle0 400
#define schwelle1 600

int main(void) {
unsigned int odo_data[2];
unsigned char odo_status[2];


Init();
/* Vorsichtshalber erst eine Dummy-Messung */
OdometrieData(odo_data);
OdometrieData(odo_data);
/* Startwerte setzen*/
odo_status[0] = odo_data[0] > (schwelle0+schwelle1)/2;
odo_status[1] = odo_data[1] > (schwelle0+schwelle1)/2;

do{
OdometrieData(odo_data);
if ((odo_status[0]) && (odo_data[0] < schwelle0)) {
odo_status[0] = !odo_status[0];
StatusLED(OFF);
}
if ((!odo_status[0]) && (odo_data[0] > schwelle1)) {
odo_status[0] = !odo_status[0];
StatusLED(RED);
}
if ((odo_status[1]) && (odo_data[1] < schwelle0)) {
odo_status[1] = !odo_status[1];
StatusLED(OFF);
}
if ((!odo_status[1]) && (odo_data[1] > schwelle1)) {
odo_status[1] = !odo_status[1];
StatusLED(YELLOW);
}

}while (1);
return 0;
}
Nur als Anregung, viele Wege führen hier zum Ziel. Ich hoffe, diesmal funzt es auf Anhieb...

Gruß

mic

damaltor
08.04.2007, 23:15
warum includierst du die .c? die .h sollte reichen

radbruch
09.04.2007, 10:38
Wird sonst nicht eingebunden, dass liegt wohl an meinen Projekteinstellungen (KamAVR).

Sternthaler
10.09.2007, 02:19
Hallo zusammen,
2 kleine Anmerkungen:
- Nach dem Einschalten der LED's im Asuro sind die 'Lampen' nicht sofort hell. Sie benötigen noch recht viel Zeit, bis sie ihre volle Helligkeit erreicht haben. Ich habe in meinen interruptbetriebenen Funktionen für die ODO-Messung noch 135 us Wartezeit vor dem Starten des ADC's. Hiermit habe ich dann immer eine 'konstante' LED-Beleuchtung.
- Wenn bei künstlicher Beleuchtung gemessen wird, bekommt man auch noch die 50 Hz vom Umgebungslicht in die Messdaten.

farratt
10.09.2007, 14:54
Ich möchte dann auch mal noch einen Tipp geben:
Ich arbeite bei der Tick-Zählung nicht mit einem Schwellenwert, weil dieser vom Umgebungslicht abhängt.

Schreibe dir am besten ein Programm, dass Asuro ein Stückchen (also paar cm) fahren lässt und die Odowerte abspeichert. Lass dir die Odowerte dann an den Rechner schicken und kopiere sie in Excel. Mach ein Diagramm und du wirst feststellen, dass die Odowerte eine Sinuskurve annehmen. Ich benutze die Extrema der Sinuskurve, um einen Tick zu detektieren, denn das klappt bei (fast) jedem Umgebungslicht...

Lunarman
10.09.2007, 15:00
Ich hab das über Live-Durchschnittswerte gelöst. hab das programm nicht, aber ich hab ihn einfach ein paar Werte messen lassen (während der Fahrt) und dann hab ich ih nerstmal rausfinden lassen, was hell und was dunkel war, dann hab ich ihn einfach Durchschnittswerte für Hell und Dunkel erstellen lassen und dann die Mitte als entscheidend genommen. Das heißt, wenn der Raum hell ist, ist die Mitte höher als wenn der Raum dunkler ist. Eine einfache Detektion nur über Differenzen ist schlecht. Dann dreht sich der Asuro einmal und man hat anderes Licht...