PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit encoder-funktion beim asuro



ölgötz
09.05.2006, 20:28
Moinsen zusammen,

ich hab' ein Problem mit der Odometrie-Funktion "encoder" aus der erweiterten asuro.c, wie sie hier herunterzuladen ist. Ich hab' mehrere asuros da (für ein Praktikum) und will die Odometrie einsetzen.
Aber weil von meinen Kleinen kaum einer eine gerade Linie fahren will, hab' ich mir jetzt mal ein kleines Progrämmchen geschrieben, das mir über PrintInt die mit encoder(LEFT) und encoder(RIGHT) abgefragten Werte ausgibt.
Dabei ist mir aufgefallen, dass nur bei einigen meiner asuros die Zähler stehen bleiben, wenn auch die Räder still stehen, bei den meisten laufen die Zähler einfach weiter, ich hab' den Eindruck, es passiert immer dann, wenn das Zahnrad genau auf dem Hell/Dunkel-Übergang vor der Lichtschranke zum stehen kommt, aber weil die Bauteile der Schranke und der Abstand zwischen Scheibe und Sender/Empfänger ja relativ gross sind, lässt sich das nicht so genau beurteilen.

Jetzt also drei bis vier Fragen an euch:

1. Hilft es etwas, die Aufkleber mit den 12 Hell/Dunkel-Segmenten gegen die mit 8 zu tauschen ?
2. Hilft es, den Fotottransistor und die LED abzuschirmen, ich hab' das gerade probeweise gemacht, aber hatte den Eindruck, dass es keinen Effekt hatte, im Dunklen rennen die Zähler ja auch manchmal einfach weiter ?
3. Weil ich mich bisher noch nicht in den Assembler des ATM eingearbeitet habe - kann mir jemand hier kurz erklären, was in der Interrupt-Routine der (erweiterten) asuro.c eigentlich passiert ?

Oder mache ich 4. noch irgend was anderes völlig verkehrt ?



/************************************************** *****************************
*
* Asuro IR-Detektor Testprogramm
*
* Es sind die Versionen der asuro.c und der asuro.h zu verwenden, wie sie bei
* https://www.roboternetz.de/phpBB2/viewtopic.php?t=11114
* herunterzuladen sind
************************************************** ***************************/

#include "asuro.h"
#include <stdlib.h>
#define avgspeed 120

void PrintStr(unsigned char *data) {
unsigned char i = 0;
while(data[i++]!=0x00);
SerWrite(data,i);
}

int main(void)
{

int el,er,diff,run = 0,sw = 0;
PrintStr("Programm ENCODERTEST\r\n");
Init();
Encoder_Init();
MotorDir(FWD,FWD);
MotorSpeed(0,0);

while(1) {
sw = PollSwitch();
if ((sw>0)&(run==0)) run=1;
if ((sw>0)&(run!=0)) run=0;
el = encoder[LEFT];
er = encoder[RIGHT];
diff = el - er;
if (run!=0) MotorSpeed(avgspeed-diff,avgspeed+diff); else MotorSpeed(0,0);
PrintInt(el);
PrintStr(" | ");
PrintInt(er);
PrintStr(" | ");
PrintInt(diff);
PrintStr(" | ");
PrintInt(run);
PrintStr("\r\n");

}
return 0;
}


Grüsse vom ölgötz

stochri
09.05.2006, 21:07
Hallo ölgotz,

1. Hilft es etwas, die Aufkleber mit den 12 Hell/Dunkel-Segmenten gegen die mit 8 zu tauschen ?

Zuverlässiger ist das auf jeden Fall.

2. Hilft es, den Fotottransistor und die LED abzuschirmen, ich hab' das gerade probeweise gemacht, aber hatte den Eindruck, dass es keinen Effekt hatte, im Dunklen rennen die Zähler ja auch manchmal einfach weiter ?

Wenn Du den ASURO bei starker Sonneneinstrahlung fahren läst, kannst Du unter umständen feststellen, dass die Odometrie gestört wird. Es gab hier schon Leute, die haben den ASURO in eine Dose eingebaut.

3. Weil ich mich bisher noch nicht in den Assembler des ATM eingearbeitet habe - kann mir jemand hier kurz erklären, was in der Interrupt-Routine der (erweiterten) asuro.c eigentlich passiert ?

Die Interruptroutine ist aber in C geschrieben. In einigen Verionen ist dort eine Hysterese eingebaut. Bei meinem ASURO musste ich die Grenzwerte für die Helligkeitswerte hell/dunkel anpassen. Es scheint bei den Odometriespannungswerten große Toleranzen zu geben.

Gruss,
stochri

ölgötz
10.05.2006, 08:15
Hallo Stochri,

...vielen Dank erstmal für Deine Antwort. Schwarze Pappe hab' ich schon gekauft, um die Optik abzuschirmen, werd' aber sicher erst am Nachmittag dazu kommen, die Dinger gemäss (1) und (2) zu ändern. Mit Frage 3 habe ich mich vielleicht falsch ausgedrückt:



Die Interruptroutine ist aber in C geschrieben. In einigen Verionen ist dort eine Hysterese eingebaut. Bei meinem ASURO musste ich die Grenzwerte für die Helligkeitswerte hell/dunkel anpassen. Es scheint bei den Odometriespannungswerten große Toleranzen zu geben.


ich weiss schon, dass das C ist, aber ich habe bisher nie so maschinennah programmiert und schrecke dann immer vor solchen Ausdrücken wie ADCH, ADMUX etc. zurück ... Hier ein Ausschnitt aus der asuro.c, von dem ich annehme, dass er die Werte für dei Helligkeitsunterschiede enthält, die du meinst, also die 140 und die 160? Und was verstehst du unter Hysterese, wie kann ich die ggf. ändern?



SIGNAL (SIG_ADC)
{
static unsigned char tmp[2],flag[2],toggle;
if (autoencode){
tmp[toggle]= ADCH;
if (toggle) ADMUX = (1 <<ADLAR) | (1 <<REFS0) | WHEEL_RIGHT;
else ADMUX = (1 <<ADLAR) | (1 <<REFS0) | WHEEL_LEFT;

if ( (tmp[toggle] < 140) && (flag[toggle] == TRUE)) {
encoder[toggle] ++;
flag[toggle] = FALSE;
}
if ( (tmp[toggle] > 160) && (flag[toggle] == FALSE)) {
encoder[toggle] ++;
flag[toggle] = TRUE;
}
toggle ^= 1;
}}



... einstweilen vielen Dank vom ölgötz

stochri
10.05.2006, 17:00
Ausdrücken wie ADCH, ADMUX etc. zurück ... Hier ein Ausschnitt aus der asuro.c, von dem ich annehme, dass er die Werte für dei Helligkeitsunterschiede enthält, die du meinst, also die 140 und die 160? Und was verstehst du unter Hysterese, wie kann ich die ggf. ändern?

Relevant ist ADCH ==> der Wert den der AD-Wandler zurückliefert.

Helligkeitswert 140: Übergang von hell nach dunkel
Helligkeitswert 160: Übergang von dunkel nach hell

Bei jedem Übergang wird der encoderwert um 1 erhöht.

Die Differenz zwischen den beiden Werten bezeichnet man als Hysterese und ist im Programm nicht als extra Variable implementiert.

Irgendwo im Forum gibt es ein kleines Programm, mit dem man die Helligkeitswerte über die serielle Schnittstelle auslesen kann. So ein Programm kannst Du verwenden um festzustellen, was die Fototranssitoren wirklich sehen und dann die beiden Schwellwerte entsprechend anpassen.

Gruss,
stochri

ölgötz
10.05.2006, 17:52
Irgendwo im Forum gibt es ein kleines Programm, mit dem man die Helligkeitswerte über die serielle Schnittstelle auslesen kann. So ein Programm kannst Du verwenden um festzustellen, was die Fototranssitoren wirklich sehen und dann die beiden Schwellwerte entsprechend anpassen.i

Hallo Storchi,

genau, da sitz' ich jetzt gerade drüber - hatte es gerade schon mal programmiert, bis mir aufgefallen ist, dass ich natürlich auf die Print-Befehle zwischen den Messungen verzichten muss, sonst kriegt er die Radumdrehungen ja gar nicht mit. Jetzt schreib' ich mir gerade eine neue version, die die Messwerte erst mal zwischenspeichert und sie dann an den PC überträgt.
Aber so, wie's aussieht, sind 140 und 160 viel zu niedrig, schätze mal, dass es bei dem asuro, den ich gerade teste, auf 500 und 700 'rausgeht. Und dann ist die grosse Frage, ob das dann für die anderen 6 in der Garage auch noch zutrifft.
Gibt's eigentlich einen Speicherbereich auf dem ATM, auf dern ich schützen kann, in dem z.B. so eine 'individuelle' Schwelle abgespeichert werden kann, die nicht jedesmal beim flashen überschrieben wird ?

Grüsse vöm ölgötz

PS: Schwarze Pappschächtelchen um die Sensoren und die 8er-Scheiben statt die 12er hat nur geringen Effekt gehabt ...

stochri
10.05.2006, 22:02
Schwelle abgespeichert werden kann, die nicht jedesmal beim flashen überschrieben wird ?

Klar, Du kannst ins EEPROM Daten schreiben, dazu ist es genau da. Das geht relativ einfach, wenn Du die entsprechenden Funktionen aus eeprom.h benutzt.

Gruss

sto - chri

ölgötz
11.05.2006, 16:36
eeprom.h ... danke für den Tipp! ...und wo krieg' ich die her ?

izaseba
11.05.2006, 16:50
Guckst Du (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM)

Gruß Sebastian

stochri
11.05.2006, 21:45
Hallo ölgötz,
der von Izsaseba gpostete Link ist eine gute Anleitung, hat es geklappt ?

Noch ein kleiner Tip: Für die Programmentwicklung ist es ziemlich sinnvoll, AVR-Studio zu benutzen, weil dort ein gut funktionierender Simulator für die Fehlersuche drin ist und man die Make-Files nicht von Hand erstellen muss.

Bevor Fragen entstehen ==> Bei Atmel downloaden, ist frei

Gruss,
stochri

Vogon
11.05.2006, 22:50
Irgendwo im Forum gibt es ein kleines Programm, mit dem man die Helligkeitswerte über die serielle Schnittstelle auslesen kann. So ein Programm kannst Du verwenden um festzustellen, was die Fototranssitoren wirklich sehen und dann die beiden Schwellwerte entsprechend anpassen.
Ich glaube ihr meint das:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=116847#116847

Arexx-Henk
12.05.2006, 08:00
Hallo,

ich mochte noch dazu sagen dass die vertikalen Position vom odometrie Fotodiode und Fototransistor ein ziemlich grossen einfluss haben auf die gemessene Wert.

Ich hab die gemessene odometrie Werte mit Hyperterminal angeschaut.
Wenn sich ein weisses teil vom odometrie Rad gegenuber den Diode/Transistor befindet soll die gemessene Wert am kleinsten sein. Dass heist maximale zuruck empfang vom ausgestrahlten IR-Licht.

Wenn man dann ein bischen experimentiert mit voruber beugen (Vorsicht...) vom Diode und Transistor wird die gemessene Wert erheblich verringert. Damit wird die minmalen/maximalen gemessene Wert bereich ziemlich grosser.

guss

Henk