PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro fährt im Kreis mit neuem Programm Brauche Hilfe!



janse
17.02.2010, 12:36
Der Asuro soll mit diesem Programm gerade fahren das tut er aber nicht er fährt nur im Kreis. Was mache ich falsch?
#include "asuro.h"

int main(void)
{
Init();
while(1)
{
unsigned int data[2];
OdometrieData(data);


if (data [0] > data [1])
{MotorDir(FWD,FWD);
MotorSpeed(170,120);
}
else
{MotorDir(FWD,FWD);
MotorSpeed(120,170);}

}
while(1);
return 0;
}

gego81
17.02.2010, 15:11
hallo

hast du schon mal eine linienverfolgung gemacht?
schau mal in die asuro anleitung
du gibst im werte auf die er reagieren soll gibst aber keine ausgangs wert vor
er soll gerade fahren wenn er das nicht macht dann soll er das machen oder das machen

fahr vorfährts

ist die abweichung da dann
mach das
oder
mach das

gruss
gego81

radbruch
17.02.2010, 15:42
Hallo

OdometrieData() zählt nicht die Anzahl der Codescheibenimpulse sondern ermittelt die Helligkeit der Codescheibensegmente die sich gerade vor den Sensoren befinden:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=46157

Gruß

mic

janse
17.02.2010, 16:00
Ich verstehe, aber warum misst er die Helligkeit nur am Anfang und kontroliert nicht ständig das Ergebnis?

radbruch
17.02.2010, 16:12
Hallo

Bei jedem Schleifendurchlauf prüfst du "if (data [0] > data [1])" und wenn dabei eine Seite im Durchschnitt der Vergleiche heller als die andere Seite ist (Bauteileschwankungen, Fremdlicht von der Seite, Zufall), dann dreht er eben. Vielleicht kannst du diesen Effekt noch forcieren indem du die Sensoren einer Seite mit einer Taschenlampe anstrahlst.

Gruß

mic

janse
17.02.2010, 16:48
ich habe es bereits mit der taschenlampe getestet. aber er prüft nur zu beginn

radbruch
17.02.2010, 17:05
Hallo


ich habe es bereits mit der taschenlampe getestet... und er dreht immer auf die selbe Seite, unabhängig davon, auf welcher Seite du dauerhaft den Sensor mit der Taschenlampe "blendest"?


aber er prüft nur zu beginnWoran erkennst du das?

Bau mal die StatusLED mit ein um zu testen, ob er immer nur in eine Richtung fährt oder gelegentlich auch gegensteuert:

MotorSpeed(170,120);
StatusLED(GREEN);
}

und

MotorSpeed(120,170);
StatusLED(RED);
}

Wie eng ist denn die Kurve die er fährt? Ist sie identisch mit einer Programmvariante mit if(1) oder if(0) anstelle von if(data[0] > data[1])?

Mein "asuro" ist grad nicht betriebsbereit, deshalb kann ich es nicht selbst testen.

Gruß

mic

[Edit]
Ähm, eigentlich ist das alles völlig unwichtig. Du mußt die hell/dunkel-Wechsel auf jeder Seite erkennen und zählen. Nur so kannst du die Odometry sinnvoll anwenden.

Valen
17.02.2010, 17:28
#include "asuro.h"

int main(void)
{
Init();
while(1)
{
unsigned int data[2];
OdometrieData(data);
...Variabelen deklarationen sollten im prinzip nicht mehrmals fur dasselbe gemacht werden. Nur wan speicherplatz ein wirklich gross problem ist. Dein "unsigned int data[2];" steht am start von den While-schleife. Dadurch wird es wieder und wieder einen neue speicherplatz eingestellt. Glücklich sind variabelen nur gültig zwisschen den nächste {} klammern, also macht das fur dein program kein problem.Am ende vond den schleife ist es nicht mehr gultig. Net ist es aber nicht.

Wie schön gesagt, dein program verglicht die helligkeit auf den geberscheiben. Leider haben die beide scheiben nicht immer (oder kwasi-immer nicht) die selbe basis beleuchtung und sensitivität. Im theoretische fall wurde das den beiden rädern synchronisieren. Aber nur wen die beleuchtungs kurven fur ein ganzen radumlauf auch identisch sind. Sind sie aber nicht bei unsere billige Asuros. Schade? Na ja, das ist einfach unsere schmutzige realität.

radbruch
17.02.2010, 17:43
Dadurch wird es wieder und wieder einen neue speicherplatz eingestellt. ... Am ende vond den schleife ist es nicht mehr gultig.Die While-Schleife wird aber doch nie mehr verlassen.

Ich hatte das für nicht kritisch eingestuft, weil die nachfolgende if-Abfrage ja immer die aktuelle (möglicherweise zuletzt definierte) Variable verwendet. Wenn aber wirklich bei jedem Schleifendurchlauf 32 Bit zusätzlicher Speicher belegt wird, könnte vielleicht irgendein Überlaufeffekt auftreten. Das würde dann aber sehr schnell geschehen und so vielleicht den Eindruck vermitteln, die Messung würde nur zu Beginn stattfinden. Deshalb besser so:

#include "asuro.h"

unsigned int data[2];

int main(void)
{...

(So kann man die Variablen zusätzlich auch in anderen Funktionen verwenden, man nennt das "globale Variable".)


Sind sie aber nicht bei unsere billige Asuros. Schade? Na ja, das ist einfach unsere schmutzige realität.Meiner Meinung nach ist deshalb der asuro immer noch der beste Einsteigerroboter.


Gruß

mic

Valen
17.02.2010, 17:58
Oops, das richtige beispiel vergessen.


#include "asuro.h"

int main(void)
{
unsigned int data[2];

Init();
while(1)
{
OdometrieData(data);
...

Valen
17.02.2010, 18:11
...
Ich hatte das für nicht kritisch eingestuft, weil die nachfolgende if-Abfrage ja immer die aktuelle (möglicherweise zuletzt definierte) Variable verwendet. Wenn aber wirklich bei jedem Schleifendurchlauf 32 Bit zusätzlicher Speicher belegt wird, könnte vielleicht irgendein Überlaufeffekt auftreten. Das würde dann aber sehr schnell geschehen und so vielleicht den Eindruck vermitteln, die Messung würde nur zu Beginn stattfinden. Deshalb besser so:

...Stimmt. Ist auch nicht krittisch. Ich vermutte es wird keine speicherplatz verlieren oder (stack)uberlauf verursachen. Mir ist gelernt das variabelen, vielleich sogar constanten, nur zwisschen die {} klammern gultig sind. Weil die while-schleife damit endet, wird meines wissen diesen speicherplatz dort wieder frei gegeben. Aber bei den nächste durchlauf von while wieder de selbe platz auf neu benutzt. Wie gesagt, kein problem, nur nicht nett. Und habe versucht janse auf diese variabelen gültigkeit aufmerksam zu machen. Die {} klammern stehen in einem program nicht nur fur die lehsbarkeit.


Meiner Meinung nach ist deshalb der asuro immer noch der beste Einsteigerroboter.Ich weiss nicht von jeder andere art von roboter aber ist auch meiner meinung. Aber nur wen man ein bisschen elektronik wissen hat, oder es bekommen wil und gedült dafur hat.

josua
18.02.2010, 09:50
hallo janse,
ich würde auch probieren, die anzahl der schwarz-weis-übergänge auf jeder seite zu zählen und dann die anzahl zu vergleichen.
such mal hier im forum, da hatten bestimmt schon viele vor dier des problem.
gruß josua

Skroete
18.02.2010, 18:23
Hallo Janse,

wie die Vorgänger schon geschrieben haben, muss man die Odometriesensoren anders abfragen. Das funktioniert ungefähr so

if ((data[0] < 550) && (flagl == TRUE))
{
flagl = FALSE;
wegl++;
}
if ((data[0] > 650) && (flagl == FALSE))
{
flagl = TRUE;
wegl++;
}

if ((data[1] < 550) && (flagr == TRUE))
{
flagr = FALSE;
wegr++;
}
if ((data[1] > 650) && (flagr == FALSE))
{
flagr = TRUE;
wegr++;
}

diff=wegr-wegl;

Die Schwellenwerte (550, 650) musst du eventuell anpassen auf deinen Asuro.
Abgesehen davon ist aber ein zweiter Schnitzer in deinem Programm.
Nämlich der

:
}
while(1);
return 0;
}

Diese while(1); Schleife wird nie mehr verlassen, d.h. das Programm läuft genau einmal durch und rennt dann für immer in dieser Schleife. Also weg damit.

Viel Spass beim programmieren
Skroete

Skroete
19.02.2010, 10:28
Hallo Janse,

ich sehe gerade, daß das Programm ja nie an die zweite while(1); Schleife ran kommt.
Also letzten Teil der Antwort bitte ignorieren.

Gruß
Skroete

janse
19.02.2010, 13:47
danke für die vielen antworten. aber wie bekomme ich die daten der odometrie daten heraus gibt es dazu ein Programm?

radbruch
19.02.2010, 14:40
Hallo

Ich verwende meist diese Funktion um Werte auszugeben:

// aus: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=328394#328394
void PrintChar(unsigned int x)
{
char ergebnis[5] = {'0','0','0','0','0'};
while (x >=10000) { ergebnis[0]++; x -=10000; }
while (x >= 1000) { ergebnis[1]++; x -= 1000; }
while (x >= 100) { ergebnis[2]++; x -= 100; }
while (x >= 10) { ergebnis[3]++; x -= 10; }
ergebnis[4] +=x;
SerWrite(ergebnis,5);
} Das war zwar ursprünglich für PollSwitch() gedacht, kann so aber auch 16bit-Werte anzeigen. Aufruf der Funktion mit PrintChar(data[0]);

Gruß

mic

janse
20.02.2010, 15:05
ok vielen dank aber was muss ich jetzt dafür ändern?

SirWesley
12.12.2010, 18:57
Hallo, Janse und bisse weiter?
Wieder ein Thread wo es sich im Sande verläuft.
Michael