Problem mit der Odometrie Hardwarefehler? [gelöst]
Hallo Leute ich hab ein Problem mit der Odometrie. Wenn ich follgendes Programm flash, aus Mehr Spaß mit ASURO Band II etwas modofieziert:
Code:
#include "asuro.h"
/*Schwellwert für die Hell-/Dunkel-Unterscheidung. Eventuell muss damit etwas variiert werden.*/
#define TRIGGERLEVEL 600
#define HYSTERSIS 10
#define LOW 0
#define HIGH 1
#define SPEED 255
int main(void)
{
unsigned int data[2];
signed int status[2] = {0, 0};
signed int difference = 0;
Init();
MotorDir(FWD, FWD);
MotorSpeed(SPEED, SPEED);
while(1)
{
OdometrieData(data);
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERSIS)) /*Wenn linker Sensor von niedrig auf hoch wechselt*/
{
status[0]=HIGH;
difference++;
}
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERSIS)) /*Wenn linker Sensor von hoch auf niedrig wechselt*/
{
status[0]=LOW;
difference++;
}
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERSIS)) /*Wenn rechter Sensor von niedrig auf hoch wechselt*/
{
status[1]=HIGH;
difference--;
}
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERSIS)) /*Wenn rechter Sensor von hoch auf neidrig wechselt*/
{
status[1]=LOW;
difference--;
}
PrintInt (difference);
if (difference<-SPEED) /*Sicherheitsabfragen*/
{
difference=-SPEED;
}
if (difference>SPEED)
{
difference=SPEED;
}
if (difference>0)
{
MotorSpeed(SPEED-difference, SPEED); /*Motoren einstellen*/
}
else if (difference<0)
{
MotorSpeed(SPEED, SPEED+difference);
}
if (SPEED-difference<=100)
{
difference=0;
}
}
}
Wenn ich dann die Daten abfrage kommt folgendes:
Code:
00000011111.....206206206206.......
und wenn 206 kommt bleibt das rechte Rad stehen. Könnte es ein Hardwaredefekt sein oder ist im Programm ein Fehler?
Vielen Dank im vorraus.
Liste der Anhänge anzeigen (Anzahl: 1)
Lass dir zuerst mal deine Werte für die Odometrie ausgeben.
Im Anhang als Beispiel meine Werte.
Du brauchst dir nur in Excel von beiden Odometriereihen den Mittelwert bilden lassen und fertig.
Die Hysterese kannst du dir sparen da es sich ja eh nur um ungefähre Mittelwerte handelt. Außerdem sind die Amplituden der Sinuswellen so groß dass die +-10 der Hysterese nicht ins Gewicht fällt.
Hier ein Beispiel wie du den links und rechts zurückgelegten Weg bekommst. Die von dir gewünschte Differenz ist halt dann einfach counter_l-counter_r
Übrigens entspricht 1 Tick 3mm Fahrstrecke bei der 8er Odometriescheibe.
Code:
//alle folgenden Variablen sind vom typ int
OdometrieData(odata);
if(odata[0]<ODOMETRIE_L && flag_l==0)
{
counter_l++;
flag_l=1;
}
else if(odata[0]>ODOMETRIE_L && flag_l==1)
{
counter_l++;
flag_l=0;
}
if(odata[1]<ODOMETRIE_R && flag_r==0)
{
counter_r++;
flag_r=1;
}
else if(odata[1]>ODOMETRIE_R && flag_r==1)
{
counter_r++;
flag_r=0;
}
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo harry3,
schade, ich kann hier aber noch das Programm, leider nur *.hex, anbieten, das über den Beitrag
https://www.roboternetz.de/phpBB2/ze...=292879#292879 von ehenkes zu erreichen ist.
- Programm in den Asuro laden.
- Asuro aus- / einschalten ==> Er fährt dann los
- Asuro unter empfangsbereiten IR-Empfänger halten
- Irgendeine Asuro-Taste drücken ==> Messdaten werden übertragen.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo und danke für die bisherige Hilfe. Ich konnte leidern nicht früher antworten. Ich hab das Programm von Sternthaler mal aus probierte und aus gewertet, dass kam dabei raus:
Code:
LoggingOdometers V1.0 (2006-05-21, Arexx-Henk)
Left Odometer
+00154
+00154
+00156
+00177
+00183
+00201
+00204
+00207
+00198
+00186
+00169
+00160
+00158
+00167
+00178
+00184
+00198
+00206
+00198
+00183
+00172
+00157
+00149
+00156
+00161
+00179
+00190
+00204
+00206
+00201
+00189
+00182
+00162
+00155
+00158
+00168
+00179
+00187
+00202
+00206
+00200
+00186
+00175
+00157
+00152
+00152
+00160
+00176
+00184
+00196
+00201
+00203
+00194
+00185
+00171
+00163
+00147
+00159
+00163
+00184
+00195
+00206
+00207
+00203
+00192
+00184
+00161
+00159
+00150
+00161
+00169
+00183
+00197
+00204
+00207
+00200
+00191
+00179
+00158
+00155
+00155
+00158
+00176
+00179
+00194
+00207
+00203
+00190
+00178
+00183
+00198
+00206
+00206
+00197
+00183
+00170
+00151
+00159
+00157
+00172
+00179
+00193
+00205
+00204
+00195
+00184
+00171
+00159
+00145
+00157
+00159
+00182
+00189
+00199
+00201
+00202
+00191
+00182
+00165
+00160
+00147
+00159
+00168
+00185
+00199
+00206
+00206
+00201
+00190
+00182
+00163
+00152
+00155
+00163
+00177
+00185
+00201
+00204
+00205
+00196
+00183
+00171
+00155
+00154
+00150
+00167
+00171
+00184
+00199
+00206
+00201
+00190
+00179
+00159
+00156
+00143
+00163
+00171
+00188
+00200
+00206
+00201
+00190
+00169
+00186
+00199
+00206
+00200
+00193
+00177
+00171
+00146
+00151
+00153
+00173
+00183
+00195
+00200
+00201
+00195
+00186
+00174
+00156
+00150
+00148
+00169
+00179
+00195
+00205
+00206
+00204
+00195
+00180
+00170
+00152
+00150
+00153
+00164
+00186
+00197
+00206
+00204
+00200
+00188
+00177
+00166
+00147
+00154
+00155
+00175
+00176
+00197
+00203
+00205
+00190
+00180
+00159
+00156
+00142
+00156
+00169
+00182
+00199
+00205
+00203
+00195
+00184
+00160
+00158
+00150
+00162
+00173
+00182
+00199
+00204
+00205
+00192
Right Odometer
+00213
+00193
+00171
+00161
+00149
+00140
+00147
+00166
+00183
+00192
+00196
+00217
+00201
+00184
+00166
+00145
+00141
+00149
+00166
+00179
+00198
+00208
+00207
+00197
+00180
+00160
+00143
+00141
+00156
+00172
+00188
+00206
+00213
+00210
+00200
+00169
+00150
+00138
+00138
+00147
+00167
+00181
+00197
+00204
+00199
+00199
+00186
+00167
+00147
+00134
+00136
+00152
+00171
+00180
+00199
+00210
+00209
+00198
+00179
+00164
+00146
+00135
+00139
+00153
+00175
+00188
+00210
+00215
+00215
+00198
+00173
+00157
+00139
+00131
+00138
+00192
+00213
+00203
+00184
+00166
+00147
+00138
+00143
+00160
+00178
+00195
+00207
+00209
+00199
+00182
+00167
+00150
+00139
+00145
+00167
+00184
+00200
+00211
+00211
+00204
+00173
+00153
+00139
+00140
+00147
+00163
+00180
+00195
+00203
+00201
+00196
+00187
+00169
+00152
+00140
+00140
+00145
+00157
+00175
+00193
+00208
+00208
+00200
+00183
+00164
+00148
+00133
+00131
+00142
+00162
+00179
+00199
+00215
+00216
+00207
+00184
+00163
+00148
+00136
+00137
+00154
+00172
+00185
+00193
+00200
+00216
+00195
+00177
+00156
+00139
+00203
+00207
+00202
+00187
+00169
+00152
+00139
+00138
+00153
+00174
+00191
+00208
+00212
+00209
+00193
+00168
+00152
+00144
+00146
+00156
+00172
+00186
+00199
+00204
+00199
+00199
+00185
+00169
+00149
+00136
+00135
+00150
+00172
+00182
+00200
+00211
+00210
+00196
+00173
+00156
+00137
+00129
+00136
+00152
+00171
+00188
+00209
+00214
+00214
+00195
+00172
+00160
+00147
+00139
+00144
+00162
+00180
+00193
+00195
+00215
+00208
+00190
+00172
+00156
+00140
+00138
+00153
+00172
+00192
+00206
+00209
+00199
+00183
+00166
+00146
+00212
+00212
+00205
+00177
+00154
+00135
+00137
+00150
+00161
+00174
+00191
+00202
+00201
Left min/max, right min/max values
+00142
+00207
+00129
+00217
Also jetzt meine Frage:
Gibt das Programm die Helligkeit nicht zwichen 0 und irgendwas um 1000 aus? Wenn ja, ist es schlimm oder gar ein Problem, dass bei mir die Daten um ca. 180 penndel?
Danke
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liggi, hi damaltor.
Ich würde darauf tippen, dass die Messwerte nur mit 8 Bit erfasst wurden. (P.S.: Das Programm ist nicht von mir, sonst könnte ich das ja mit Sicherheit sagen.)
Ein Beispiel von mir erfasster Daten bei 'normaler' Schreibtischbeleuchtung und definitive 10 Bit mal als Bild unten.
Wenn du liggi deine Daten bei vollem Sonnenschein aufgenommen hast, dann könnten die Messwerte allerdings locker in den unteren Bereich rutschen. Aber im Moment ist ja keine Sonne da.
Im übrigen kommen bei meinem (funktionierenden) Asuro mit dem Programm zum Schluß folgende Daten raus:
Left min/max, right min/max values
+00097
+00182
+00067
+00171
Das sind nur 8-Bit-Messwerte!
Für 8 Bit spricht auch noch die Überlegung, dass 2 * 237 Daten übertragen wurden. Als INT-Variable gesammelt kämen wir da auf 2 * 237 * 2 Byte Speicher = 948 Byte. Passt zwar noch in den Asuro, aber halte ich für recht hochgegriffen, da ja auch noch Stack und bestimmt ein paar weitere Variablen Platz finden wollen.
Somit sind deine Messdaten im grünen Bereich.
@liggi
Jetzt habe ich dein Programm mal gerade ausproblert. (Besser spät als nie ;-) )
Der Asuro fährt bei mir wunderbar geradeaus und folgende Daten werden übertragen:
1 2 2 2 2 1 2 1 1 1 1 2 2 2 2 2 2 3 3 2 3 4 4 3 3 3 4 4 4 4 4 4 5 6 6 6 7 7 7 6 7 7 7 8 9 9 9 9 10 11 11 11 10 10 10 11 11 11 12 12 13 13 13 13 12 13 12 13 13 13 13 13 13 14 14 14 15 15 15 14 14 14 15 15 15 15 15 15 15 15 14 14 14 13 12 12 12 12 11 12 12 13 12 12 13 12 13
Egal wie ich an den Rädern bremse, bleibt der Wert immer unter 25.
Das hilft dir zwar im Moment nicht weiter, aber unabhängig von irgend einer Übertragungsgeschwindigkeit, ist das Programm funktionsfähig.
Aber folgendes: Multipliziere doch mal den Output deiner Messdaten mit 4:
Left min/max, right min/max values
+00142 * 4 = 568
+00207 * 4 = 828 -- Mittelwert der beiden : 698
+00129 * 4 = 516
+00217 * 4 = 868 -- Mittelwert der beiden : 692
Da in deinem Programm mit:
#define TRIGGERLEVEL 600
#define HYSTERSIS 10
die Werte eigendlich passen könnten, ist das Verhalten deines Asuros zwar 'merkwürdig', aber wie damaltor schon als erstes sagte: "Anpassen vom Triggerlevel" hier wohl sinnvollerweise auf 700, solltest du probieren. Da du bei deinen Werten genügend 'Luft' nach oben und unten hast, darf auch der Wert für HYSTERSIS ruhig auf 20 oder 30 erhöht werden. (Reduziert Fehlauswertungen.)