PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro folgt der Linie



Rubi
22.05.2005, 18:15
Hallo

Habe dem Asuro gerade beigebracht einer Linie zu folgen.
Es wird ja schon ein Code dafür mitgeliefert, auf meinem Parkour
hat der leider überhaupt nicht gefunzt.
Das hat aber auch sein gutes, denn so muß man sich mit dem Code auseinandersetzen und beginnt somit Schritt für Schritt den Asuro zu verstehen.
Vielleicht sollte ich auch das Manual genauer lesen,...

Hier 2 Videos:

http://members.chello.at/michael.rubitschka1/Linienfolger1.MPG
http://members.chello.at/michael.rubitschka1/Linienfolger2.MPG

Btw.
Habe mir gerade eine Testplatine für SMD geroutet (nach AATIS Vorlage), wenn interesse am Layout besteht, bitte pm.

http://members.chello.at/michael.rubitschka1/SMDProtoboard.JPG

LG
Rubi

Michael
22.05.2005, 18:27
Hallo Rubi,
kannst du bitte nochmal die Links überprüfen, ich bekomme ein:
The requested URL /michael.rubitschka1/Linienfolger1.mpg was not found on this server.
Möglichserweise hast du dich verschrieben?
Gruß, Michael

Rubi
22.05.2005, 18:36
Sorry

Danke für den Hinweis!!!
MPG gehört GROSS geschrieben.
Frag mich bitte nicht warum, aber jetzt funzt es.

LG
Rubi

waste
22.05.2005, 19:03
Auf den Videos fährt er doch wunderbar. Sind da deine verbesserten Routinen drin?

Gruss Waste

Rubi
22.05.2005, 19:10
Hallo Waste

Ja klar fährt er da wunderbar, sind ja auch meine verbesserten Routinen drinnen, :-)

Mit den Originalroutinen, war er viel zu schnell, da hat er die Kurve nicht gepackt.
Dann habe ich ein paar Dinge geändert,plötzlich konnte er keine Kurven mehr.
Dann habe ich mich mit dem Code genauer auseinander gesetzt, und 3 Versuche später, siehst Du dann das Ergebniß, die Videos.

Hat Spaß gemacht.

Die nächste Stufe ist dann, das er lernt, wie schnell er einen Kurs fahren darf.

Das wird dann schon um einiges komplexer, da er dann lernen sollte wann er eine Runde gedreht hat.
Schade, das keine Eingänge mehr verfügbar sind, ein Hallsensor würde sich dafür anbieten.

LG
Rubi

waste
22.05.2005, 20:46
@Rubi

Hast du rausbekommen, was der Sinn von ADOffset in LineDemo ist?
Ist das eine Kalibrierung der Sensoren?
Soll das vor weissem oder dunklem Hintergrund durchgeführt werden?

Gruß
Waste

Rubi
22.05.2005, 20:52
hALLO wASTE

Ja.
Der Sinn von ADOffset ist, die Differenz von den Liniensensoren.
Wenn die Differenz (ADOffset) der Liniensensoren > 4 dann erhöht er die Geschwindikeit des linken Rades um eins, wenn < -4 dann erhöht er die Geschwindikeit des rechten Rades um eins, ansonsten bleibt die Geschwindigkeit gleich.


Mit Kalibrierung hat das nichts zu tun.

Er mach kurz folgendes:

1. Starte Motor
2. Befrage den Liniensensor
3. Werde die Liniensensordaten mittels ADOffset aus (siehe Text oben)
4. Gehe zu 2.

Starten mußt Du ihn über einer dunklen Linie.


LG
Rubi

waste
22.05.2005, 21:22
@Rubi

ADOffset wird aber nur einmal am Anfang bestimmt. Da ist es die Differenz der Liniensensoren. Danach bei den Auswertungen wird es dann nur noch berücksichtigt, so als ob es ein Korrekturwert ist.
Für mich sieht das nach Kalibrieren aus, nur ist die Frage wie?
Auf weissem oder dunklem Hintergrund?

Gruß Waste

Rubi
23.05.2005, 05:24
Hallo Waste

Stimmt hast recht, man sollte niemals einen Code auf die schnelle überfliegen, in der Meinung man weis eh schon alles.

INteressant ist auch warum er vorher 143 (eigentlich 144) mal den Liniensensor befragt:
for (j = 0; j < 0x8F; j++) LineData(lineData);
LineData(lineData);
ADOffset = lineData[0] - lineData[1];

Ohne Werte von ADOffset zu kennen möchte ich mich nicht ein 2es mal festlegen, aber mein Verdacht geht in Richtung Umgebungslicht.
Schaue mir das an, wenn ich wieder Zeit habe.

LG
Rubi

Rubi
23.05.2005, 08:21
So jetzt habe ich hoffentlich den ADOffset durchschaut.
Er dient dazu, das man sich vorher nicht festlegen muß ob er einer hellen Linie auf dunklem Untergrund oder umgekehrt folgen soll.

Wenn ich den Asuro z.B. so positioniere, das ein Liniensensor auf die schwarze Linie zeigt und der andere auf den weißen Untergrund,
so folgt er dennoch der Linie und richtet sich so aus, das er immer an dem Rand der Linie entlang fährt.

Ohne vorher den Offset zu berechnen, wäre so ein Verhalten nicht möglich.

Das ist sehr intellegent programmiert.

LG
Rubi

Goblin
23.05.2005, 10:03
hab mir die vids angesehen und mich gefragt: warum wird der lange schwarze kabelbinder am asuro nicht abgeschnitten? (sorry wegen des OT)

Rubi
23.05.2005, 10:09
Hallo Goblin

Erstens schaut er m.M.n. ganz lustig aus, wie eine Antenne und zweitens ist er relativ praktisch um ihn daran aufzuheben.

LG
Rubi

Goblin
23.05.2005, 10:28
ok. :). ich hab auch erst gedacht, es sei ne antenne. (als ich den asuro zum ersten mal gesehen hab). ich glaub ich würd ihn auch so lassen!

The-BooN-
08.11.2006, 11:35
ok. :). ich hab auch erst gedacht, es sei ne antenne. (als ich den asuro zum ersten mal gesehen hab). ich glaub ich würd ihn auch so lassen!coooool

The-BooN-
08.11.2006, 11:35
ok. :). ich hab auch erst gedacht, es sei ne antenne. (als ich den asuro zum ersten mal gesehen hab). ich glaub ich würd ihn auch so lassen!cooooolcoooool coooool

MarkusH91
09.11.2006, 15:41
ok. :). ich hab auch erst gedacht, es sei ne antenne. (als ich den asuro zum ersten mal gesehen hab). ich glaub ich würd ihn auch so lassen!cooooolcoooool coooool
Immer 2 mal mehr cooooooooooool wie du (ihr!!!) O:)

Also mein Linien programm sieht so aus:


#include "asuro.h"

#define SPEED 0x8F

int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;

void LineLeft (void)
{
speedLeft += 1;
if (speedLeft > 0xFE) speedLeft = 0xFF;
}

void LineRight (void)
{
speedRight += 1;
if (speedRight > 0xFE) speedRight = 0xFF;
}

int main(void)
{
int i;
unsigned char j;

Init();

FrontLED(ON);
for (j = 0; j < 0xFF; j++) {
LineData(lineData);}
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
for(;;) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
return(0);


Aber leider funktioniert´s net so richtig!!

Bitte Helft mir!

MfG MarkusH91 :mrgreen:

m.a.r.v.i.n
09.11.2006, 15:54
Hi MarkusH91,

Bau mal noch folgendes ein:

MotorDir(FWD,FWD);
Dann sollte es gehen.

Gruß m.a.r.v.i.n

EDH
09.11.2006, 16:00
bei dem programm müsste er dir tasuende fehlermeldungen ausspucken (vielleicht auch ein paar weniger)
als erstes bastelst du die am besten raus.
dann schreibst du statt for(;;) while(1)
und als letztes: ich glaub dir ja gern, das du mit dem hexadezimalsystem was anfangen kannst, allerdings erschwerst du dir die sache doch nur wenn du 0x8F statt 143 schreibst. oder gibt es da einen tiferen sinn, den ich auf die schenlle nicht gesehen habe.

mfg EDH

EDH
09.11.2006, 16:01
oh ha das smilie da ist eigentlich auch ein strichpunkt

MarkusH91
09.11.2006, 16:29
ja ok
MfG MarkusH91

MarkusH91
09.11.2006, 16:32
jetzt kommt der fehler

-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function `main':
test.c:12: error: parse error before '{' token
test.c:6: warning: unused variable `lineData'
test.c: At top level:
test.c:19: error: parse error before '}' token
make: *** [test.o] Error 1

> Process Exit Code: 2



#include "asuro.h"

#define SPEED 0x8F

int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;

void LineLeft (void)
{
speedLeft += 1;
if (speedLeft > 0xFE) speedLeft = 0xFF;
}

void LineRight (void)
{
speedRight += 1;
if (speedRight > 0xFE) speedRight = 0xFF;
}

int main(void)
{
int i;
unsigned char j;

Init();

FrontLED(ON);
(;;while(1) (j = 0; j < 0xFF; j++) {
LineData(lineData);}
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
(;;while(1) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
return(0);

EDH
09.11.2006, 16:42
kompilier mal den code hier:


#include "asuro.h"

#define SPEED 0x8F

int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;

void LineLeft (void)
{
speedLeft += 1;
if (speedLeft > 0xFE) speedLeft = 0xFF;
}

void LineRight (void)
{
speedRight += 1;
if (speedRight > 0xFE) speedRight = 0xFF;
}

int main(void)
{
int i;
unsigned char j;

Init();

FrontLED(ON);
while(1) (j = 0; j < 0xFF; j++) {
LineData(lineData);}
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
(;;while(1) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
return 0;
}

The-BooN-
10.11.2006, 09:16
mal so ne kleine frage zum linienverfolger......
wofür benutzt ihr folgenden code und was bedeutet er?
hier der code:
for (j = 0; j < 0xFF; j++) LineData(lineData);
was haben die hexadezizahlen zu bedeuten? thx im voraus!

MfG The-BooN-

EDH
10.11.2006, 13:20
statt 0xFF kann man auch einfach 255 schreiben.
manche leute machen sich das leben halt künstlich schwer ;)

MarkusH91
10.11.2006, 14:32
Danke für die Antwort
Aber jetzt kommt ein Ar*** voll fehler:

test.c -o test.o
test.c: In function `main':
test.c:30: error: parse error before ';' token
test.c:24: warning: unused variable `i'
test.c: At top level:
test.c:32: warning: type defaults to `int' in declaration of `LineData'
test.c:32: warning: parameter names (without types) in function declaration
test.c:32: error: conflicting types for `LineData'
asuro.h:79: error: previous declaration of `LineData'
test.c:32: warning: data definition has no type or storage class
test.c:33: warning: type defaults to `int' in declaration of `ADOffset'
test.c:33: error: initializer element is not constant
test.c:33: warning: data definition has no type or storage class
test.c:34: warning: type defaults to `int' in declaration of `speedLeft'
test.c:34: error: initializer element is not constant
test.c:34: warning: data definition has no type or storage class
test.c:35: error: parse error before ';' token
test.c:37: warning: type defaults to `int' in declaration of `i'
test.c:37: error: initializer element is not constant
test.c:37: warning: data definition has no type or storage class
test.c:38: error: parse error before "if"
test.c:40: warning: type defaults to `int' in declaration of `LineLeft'
test.c:40: warning: function declaration isn't a prototype
test.c:40: error: conflicting types for `LineLeft'
test.c:11: error: previous declaration of `LineLeft'
test.c:40: warning: data definition has no type or storage class
test.c:41: error: parse error before '}' token
test.c:44: warning: type defaults to `int' in declaration of `LineRight'
test.c:44: warning: function declaration isn't a prototype
test.c:44: error: conflicting types for `LineRight'
test.c:17: error: previous declaration of `LineRight'
test.c:44: warning: data definition has no type or storage class
test.c:45: error: parse error before '}' token
test.c:48: warning: type defaults to `int' in declaration of `speedLeft'
test.c:48: error: redefinition of `speedLeft'
test.c:34: error: `speedLeft' previously defined here
test.c:48: error: initializer element is not constant
test.c:48: warning: data definition has no type or storage class
test.c:49: error: parse error before '}' token
test.c:50: warning: type defaults to `int' in declaration of `MotorSpeed'
test.c:50: warning: parameter names (without types) in function declaration
test.c:50: error: conflicting types for `MotorSpeed'
asuro.h:71: error: previous declaration of `MotorSpeed'
test.c:50: warning: data definition has no type or storage class
test.c:51: error: parse error before '}' token
test.c:53:2: warning: no newline at end of file
make: *** [test.o] Error 1

> Process Exit Code: 2

EDH
10.11.2006, 14:36
tja äh, manchmal zieht ein kleiner fehler einen gnazen rattenschnanz hinterher ich schu mal woran das liegt

MarkusH91
12.11.2006, 12:04
Ok Danke LOL
MfG MarkusH91

EDH
18.11.2006, 18:01
der code hier müsste eigentlcih funktioniern (zumindest gibts keine fehlermeldungen)


#include "asuro.h"

#define SPEED 0x8F

int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;

void LineLeft (void)
{
speedLeft += 1;
if (speedLeft > 0xFE) speedLeft = 0xFF;
}

void LineRight (void)
{
speedRight += 1;
if (speedRight > 0xFE) speedRight = 0xFF;
}

int main(void)
{
int i;
unsigned char j;

Init();

FrontLED(ON);
for (j = 0; j < 0xFF; j++) {
LineData(lineData);}
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
while (1) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
return 0;
}


keine garantie

Mastermsc
24.11.2006, 22:55
mal so ne kleine frage zum linienverfolger......
wofür benutzt ihr folgenden code und was bedeutet er?
hier der code:
for (j = 0; j < 0xFF; j++) LineData(lineData);
was haben die hexadezizahlen zu bedeuten? thx im voraus!

MfG The-BooN-

LineData(data) wird 255 (0FF) mal aufgerufen bzw. die FotoLEDs da vorne am Asuro ausgelesen.

odysee_2002
27.11.2006, 21:23
Hallo,

so wie ich das Programm verstehe, macht es keinen Sinn, 255 ( 0xFF = 255 dezimal) mal die Linedatas auszulesen. Für was, wenn es dann nicht verwendet wird?

Die Anmerkung, daß mit dem Offset eine Kalibrierung stattfindet, war schon richtig. Besser wäre es, für jeden Sensor einen eigenen Offset zu ermitteln.

Gruß

damaltor
27.11.2006, 21:27
So großartigen sinn macht es nicht, das stimmt... evtl könnte man es mit einer zeitverzögerung begründen.

eine "kalibrierung" der sensoren dürfte nciht wirklich realisierbar sein, allerdings kann man den offset durchaus messen und (z.B. über 100 messungen) durch mittelwertbildung recht genau bestimmen.

wenn man diesen dann immer wieder von den messergebnissen abzeiht, dann ist das mehr oder weniger genauso wie eine kalibrierung, der messfehler wird halt mit einbezogen. und genau das geschieht im code oben.

odysee_2002
27.11.2006, 21:31
Eine Mittelwertbildung kann ich im Code aber nicht entdecken...
Es macht auch keinen Sinn, x mal den Offset zu bilden, dieser hängt nämlich vom Untergrund ab und der ist auch nicht 100% homogen..

Also 255 mal eine Funktion aufzurufen, deren Rückgabewert nicht verwendet wird kann man sich schenken...

damaltor
27.11.2006, 21:32
das ist wahr. die 100malige abfrage ist hier reht sinnlos.

allerdings wird der offset (wenigstens) 1x bestimmt, dadurch ist das programm schonmal deutlich genauer als wenn man von gleich "guten" werten des sensoren ausgeht.

odysee_2002
27.11.2006, 21:45
Hallo Dalmator,

es gibt keine "guten" Sensorwerte. Der aktuelle Wert hängt vom Untergrund ab, der idealer weise der sein sollte außerhalb der Linie, der der Asuro folgen soll.

Gruß

damaltor
27.11.2006, 21:47
das weiss ich auch... ich meinte mit guten werten dass die werte bei gleichem untergrund auch gleich sind, dass die sensoren sozusagen keinen offset haben.

dementsprechend ist das programm genauer als wenn man gar keinen offset mit einbeziehen würde und nur davon ausgehen würde, dass beide sensoren bei gleichem untergrund gleiche werte bzw spannungen zurückgeben.

inka
04.01.2007, 15:46
hi EDH,

habe probeweise den code compiliert, die asuro.c war mit dabei, in unkenntnis dessen was da sonst im AVR studio alles an files mit eingebunden werden muss (könnte vielleicht für leute die lernen wollen angegeben sein? bite - danke) hab nur viele, viele fehlermeldungen bekommen :-(

z.b.
../edh_linie.c:30: error: syntax error before ';' token


wie kann ich es ändern???

gruß inka

Downad
04.01.2007, 17:21
hallo inka,

hast du den code sicher und genau so übernommen?

die fehlermeldung: irgend wo VOR dem ; in zeile 30 ist ein fehler - dazu müsste man den code sehen. wenn ich den code ober kopiliere bekomme ich diesen fehler nicht.

zu avrStudio:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=20382&highlight=avr+studio

gruß
downad

inka
04.01.2007, 17:38
ja, danke Downad,

den link kenne ich, hier der code, den ich kompiliert habe:



#include "asuro.h"

#define SPEED 0x8F

int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;

void LineLeft (void)
{
speedLeft += 1;
if (speedLeft > 0xFE) speedLeft = 0xFF;
}

void LineRight (void)
{
speedRight += 1;
if (speedRight > 0xFE) speedRight = 0xFF;
}

int main(void)
{
int i;
unsigned char j;

Init();

FrontLED(ON);
while(1) (j = 0; j < 0xFF; j++) {
LineData(lineData);}
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
(;;while(1) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
return 0;
}


gruß inka

Downad
05.01.2007, 14:00
hallo inka,

ich kann den code gerade nicht test (kein compiler hier)
aber...
bei dir ist die while (1) gefolgt von einem elemte der For-Schleife,
da schein etwas zu fehlen.
ich denke es müsste da erst eine for und dann die while kommen.

nimm mal den code oben con EDH und vergleich deinen mit dem

gruß
downad

damaltor
05.01.2007, 14:50
warum schreibst du die werte in hex-zahlen? mach dir doch das leben nich unnötig schwer... =)

inka
05.01.2007, 14:59
@damaltor,
meinst du mich? Ich hab den code von EDH so übernommen wie er war um ihn zu testen...

gruß inka

damaltor
05.01.2007, 21:04
achso... na gut =)