-
Probleme mit Odometrie
Hi,
ich habe ein Problem mit der Auswertung der Odometriesensorik.
Die Sensoren gehen doch auf einen AD Wandler!? und nehmen Spannungswerte zwischen 0 und 1024 an wobe 0 [Ein] und 1 [Aus] darstellt.
Ich wollte den Asuro dazu bringen, dass er wenn er gegen ein Hinderniss prallt den Rückwärtsgang einlegt und einen vorher definierten Kurvenradius fährt. Bsp. Asuro fährt frontal auf eine Wand (also K3 und K4) aktiv. Nun ist z.B. im Program eine 90 Grad Kurve vorgesehen. Jetzt soll er sich parallel zur wand (also 90 Grad zum Aufprallwinkel) ausrichten und weiterfahren.
Leider scheitere ich schon bei der Auswertung der Sensoren.
Um die Odometrie zu Testen fährt mein Roboter einfach gerade aus.
Jetzt soll er mir bei jedem Hell-. Dunkelwechsel des linken Rades die Status LED umschalten und beim rechten Rad die FrontLED An und Aus.
Allerdings geht lediglich die StatusLED auf Rot.
Code:
#include "asuro.h"
// Bit 0 ( 1) -> K6 rechts außen
// Bit 0 ( 2) -> K5 rechts mitte
// Bit 0 ( 4) -> K4 rechts innen
// Bit 0 ( 8) -> K3 links innen
// Bit 0 (16) -> K2 links mitte
// Bit 0 (32) -> K1 links außen
int main(void)
{
int zaehler; //ausweichzeit nach kollision
unsigned int data [2]; //Array erstellen mit 2 speicherzellen für Odometriedaten
//data [0] links T11
//data [1] rechts T12
Init();
while(1)
{
//-----------------------------------------------
if (PollSwitch() >= 1)
{
if(PollSwitch()==1)
{
if(PollSwitch()==1)
{
StatusLED (RED);
MotorDir(RWD,RWD);
MotorSpeed(0,200);
for(zaehler=0; zaehler < 500; zaehler++)
{
Sleep(255);
}
}}}
//-----------------------------------------------
if (PollSwitch() >= 2)
{
if(PollSwitch()==2)
{
if(PollSwitch()==2)
{
StatusLED (YELLOW);
MotorDir(RWD,RWD);
MotorSpeed(0,100);
for(zaehler=0; zaehler < 500; zaehler++)
{
Sleep(255);
}
}}}
//-----------------------------------------------
if (PollSwitch() >= 4)
{
if(PollSwitch()==4)
{
if(PollSwitch()==4)
{
StatusLED (GREEN);
MotorDir(RWD,RWD);
MotorSpeed(100,0);
for(zaehler=0; zaehler < 500; zaehler++)
{
Sleep(255);
}
}}}
//-----------------------------------------------
if (PollSwitch() >= 8)
{
if(PollSwitch()==8)
{
if(PollSwitch()==8)
{
StatusLED (GREEN);
MotorDir(RWD,RWD);
MotorSpeed(200,0);
for(zaehler=0; zaehler < 500; zaehler++)
{
Sleep(255);
}
}}}
//-----------------------------------------------
if (PollSwitch() >= 16)
{
if(PollSwitch()==16)
{
if(PollSwitch()==16)
{
StatusLED (YELLOW);
MotorDir(RWD,RWD);
MotorSpeed(100,0);
for(zaehler=0; zaehler < 500; zaehler++)
{
Sleep(255);
}
}}}
//-----------------------------------------------
if (PollSwitch() >= 32)
{
if(PollSwitch()==32)
{
if(PollSwitch()==32)
{
StatusLED (RED);
MotorDir(RWD,RWD);
MotorSpeed(100,0);
for(zaehler=0; zaehler < 500; zaehler++)
{
Sleep(255);
}
}}}
//-----------------------------------------------
else
{
MotorDir(FWD,FWD);
MotorSpeed(100,100);
StatusLED(RED);
BackLED(OFF,OFF);
OdometrieData(data);
if(data [0] < 512){
StatusLED(YELLOW);
StatusLED(OFF);}
if(data [0] > 512){
StatusLED(GREEN);
StatusLED(OFF);}
if(data [1] < 512)
FrontLED(ON);
if(data [1] > 512)
FrontLED(OFF);
}}
return 0;
}
Allerdings gibts es auch sonst Effekte die ich mir nicht erklären kann.
Bsp. im Programm wird die StatusLED anstat von Gelb zu Grün von Rot zu Grün gewechselt. Und plötzlich geht nix mehr. Genauso wenn ich am am Anfang des Programmes die Status LED auf Rot setze. Warum ?
Außerdem glimmen die BackLED´s immer mit. Liegt wahrscheinlich an der Verschaltung!
Und wenn jemand gerade dabei ist meine fragen zu beantworten!
Wie kann ich die AD Wandlerwerte der Odometrie per IR an das Hyperterminal senden? Ich würde einfach gerne sehen welche Werte der AD Wandler so ausgibt!
Auch wenn mir gerade noch etliche fragen einfallen belasse ich es erstmals dabei.
Ich bin jedem dankbar der mir hielft.
Gruß
Simon
-
der adc nimmt werte von 0 bis 1023 an, wobei 0=Masse und 1024=Referenzspannung (bei der odometrie: =VCC).
0 und 1 als ein und aus hat was mit infrarot zu tun.
-
ich beschäftige mich auch gerade mit den odometriesensoren und habe ein kleines programm geschrieben das mir den wert ausgeben soll. funktioniert aber nicht richtig.
Code:
#include <stdlib.h>
#include "asuro.h"
#define taste (!(PINC & (1<<PC4))) // Tastenabfrage
#define keine_taste (PINC & (1<<PC4))
int main(void){
Init();
int a=1;
MotorDir(FWD,FWD);
MotorSpeed(120,120);
while(a=1){
unsigned int data[2]; //Speicher bereitstellen
OdometrieData(data);
SerWrite(data[0],20);
}
}
gibt im hyperterminal folgendes aus:
Code:
5&_X/4EBuHN1N"r'(C"dbX0/bXICRgB &_Xd;A9r h i m!\I5-
'!7AFRX"=!U@Dd0\!Y@ \)xY1#gB &_uHN1N"r'(CH@t !hZ0p1 J
'!7AF@HE5[*t#SUQ5"=!U@Dd0&_X/4EB@ L'@Q,[P. &_X/4E'(C"d;A9rJ;EgBxY1#[tbiL 5
`~,\%@)@tL !hZ0p-[x@/4EB \.Y@ \)xY(C"d;A9r h/4EB Y1#[tbA DI(YB'Aq)v 0(t(&_X
`~, h@ LEB ,[P. Qd;A9r hHUQ'!7AFR%@)@"e!Sa@t !hZ0/4EB \.p-[x@)1B J
;EgB &_X;A9r h@(1bKF i J
`~,\%@)@#SUQ, &_X/4LU 5"=
%Eh8Lt !hZ0p-[x;A9r h@)@"e<t !hZ0p-[x;i
%EhZ0p
'!7;iAq)uHN1N"rHN1N"r'(C"d(YB'Aq)ugB &_X &_X/4EB L'@!BiLt !hZ0p-1x
% J
;EEh8LH '
(C"d;A9r )@"e<D@gB &_X/0/bXICRv#[tbX0/EB \. !hZ0p-[x@)1 5"=!U@DdF:Xo@dB"
'!7AF!hZ0p-[x@)1B DI(YB'Aq)B'Aq)uHN1N"!7AFR} L'@!BiL@ L'@BiL 5"h8LH :
Xo@dB"I(YB'Aq)AFR}AFR}!7AFR}AFR}AFR}!7AFR
-
Hallo damaltor,
mit 0 und 1 meinte das min bzw. max.
Sorry ist bissl doof erklärt.
Ich habe mir gerade die ADC Werte ausgeben lassen.
Allerdings na ja ohne erfolg.
Ich habe das Programm von:
https://www.roboternetz.de/phpBB2/ze...suro+odometrie
genutzt. Also das zum Auslesen der Ordometrie.
Eigentlich sollte das Ergebniss im Hyperterminal so aussehen:
LoggingOdometers V1.0 (2006-05-21, Arexx-Henk)
Code:
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
(oder ähnlich)
bei mir kommt lediglich
LoggingOdometers V1.0 (2006-05-21, Arexx-Henk)
Wenn du dir den else Teil des Programmes anschaust (ganz unten der obere Code ist irrelevant) siehst du das ich die Werte auf > bzw< 512 abfragen lasse. Aber das geht nicht.[/code]
-
Habe deinen beitrag mal mit dem code-button etwas übersichtlicher gemacht... =)
dein Problem bei dem Programm von Weiti ist, dass nicht die zahl gesendet wird, sondern der ascii character. die zahl 32 wird zB nicht als "3" und "2" gesendet, sondern als ascii 32. das ist das leerzeichen =)
-
Hi damaltor,
ich habe das Programm von Arexx-Henk benutzt https://www.roboternetz.de/phpBB2/download.php?id=11451
(ganzes Thema unter:
https://www.roboternetz.de/phpBB2/ze...suro+odometrie)
ja ich habe vorhin vergessen die Ausgabe also code zu posten
wusste aber nicht wie ichs korrigiere.
Langsam werde ich kirre es will net gehn
-
oh gott *rot werd* das habe ich sogar vorher in nem c tutorial gelesen, das man damit nur ascii ausgibt, und habs trotzdem falsch gemacht.
ich habe jetzt das programm aus der anderen diskusion laufen lassen und bekomme folgendes ergebnis:
Code:
Left min/max, right min/max values
+00013
+00184
+00252
+00255
-Finished-
folglich ist mein rechter odometer kaputt!?
-
oder es ist ein übertragungsfehler!? Hast du es noch einmal durch laufen lassen?
mfg liggi
-
Flashe einfach nochmal den Selbsttest. Dann kannst du sehen, ob die Odometrie funzt oder nicht. Gruß farratt
-
woran erkenne ich denn ob der odometrie test erfolgreich war?
Hyperterminal:
Code:
-- ASURO Testing --
LED Test
Line Test
Switch Test
Odometrie Test
Motor Test
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
-- ASURO Testing --
LED Test
Line Test
Switch Test
Odometrie Test
Motor Test
im zweiten motortest hängt er sich auf, evtl weil das rad nicht ganz drann ist. (bekommt gleich nen eigenen thread)