PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro fährt nicht geradeaus



frank1210
16.12.2009, 15:08
Hallo erstmal .
Ich bin ganz neu, und steige erstmal langsam ein. Mein Asuro ist seit ein paar Tagen fertig. hat alles auf Anhieb geklappt. Sämtliche Selbsttest wunderbar durchlaufen.
Und mit dem Programmieren---halt rumgespielt, und langsam erste Sachen verstanden.
Wenn er jetzt aber mit der Odometrie geradeaus fahren soll, macht er das nicht.
Motoren laufen, Odometriesensoren funktionieren bei´m Selbstest auch.
Kann man vieleicht den Speicher au null setzen. Sorry für meine dumme Frage, aber wie gesagt --ganz neu hier.
Gruß frank

Thund3r
16.12.2009, 16:42
Hallo

Welchen Speicher genau willse den auf null setzen?
Und was versprichst du dir davon?
Am besten du postest deinen Quellcode dann kann man dir am besten helfen.

Gruß Thund3r

frank1210
16.12.2009, 16:58
Dachte den Speicher, wo er den Lichtwert speichert, Oder ist das Quatsch.
Und was ist mein Quellcode und wie komm ich da drann?

Thund3r
16.12.2009, 17:06
Hallo

Also ein Quelltext ist zB

#include <asuro.h>
int main (void)
{
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(125,125);
}
return 0;
}
Und den von deinem Programm würd ich gerne mal sehen.

--

Jedesmal wenn du im Programm sagst dass der neue odometrie wert eingelesen wird verändert sich ja dieser .
...
while(1)
{
int a,b;
OdometrieData(data);
data[0] =a;
data[1] =b;
}
...
a ist dann zB im ersten Schleifendurchlauf 550 und b 856
im 2ten durchkauf ändert sich dann aber der wert das zB a = 976 und b=467 ist usw. So brauchst du nichts zu löschen weil sich der wert permanent ändert(in jedem durchlauf)

Gruß Thund3r

frank1210
16.12.2009, 17:11
OK hier ist der Quelcode. den hab ich so im Netz gefunden, und beim ersten versuch hats ja auch geklappt.

#include "asuro.h"

// Schwellwert fr die Hell/Dunkel-Unterscheidung
// Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1

int main(void)
{
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
Init();
MotorDir(FWD, FWD);
while(1) {
// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
// Wechsel rechter Sensor von niedrig auf hoch?
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--;
}
// Wechsel rechter Sensor von hoch auf niedrig?
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--;
}
// zur Sicherheit: verhindern, dass der Differenzz�ler
// den erlaubten Wertebereich verl�st
if (difference<-255) difference=-255;
if (difference>255) difference=255;

// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
StatusLED(status[0]+status[1]*2);

// Z�ldifferenz passend auf die Motoren verteilen
if (difference>0) MotorSpeed(255-difference,255);
else MotorSpeed(255,255+difference);

}
return 0;
}

Thund3r
16.12.2009, 17:16
Hallo

Auf den ersten Blick nicht so einfach...
Funktioniert denn dieser Quellcode nicht so wie gewünscht?
Und wo möchtest du welche Änderung vornehmen ( das mit dem löschen )


Gruß Thund3r

frank1210
16.12.2009, 17:20
Also:
Beim ersten Versuch hats wunderbar gklappt-- lief einwanfrei geradeaus.
Dann hatte ich zwischendurch ein paar andere Programme geflascht, und als ich den Geradeaus wieder vorführen wollt-----geht´s nicht mehr. fährt nur noch im Kreis. Aber wie gesagt beim selbsttest fuknzt alles.
Gruß frank

Thund3r
16.12.2009, 17:30
Hallo

Nein ich meinte das Programm wo du mir den Quellcode gezeigt hast das Programm hat beim ersten flashen funktioniert und dann nicht mehr?
Hast du auch gespeichert und dann "make" gemacht?

Gruß Thund3r

frank1210
16.12.2009, 17:34
Genau, nach dem ersten flaschen hat´s funktioniert. dann hab ich den Text gespeichert. Und später gings nicht mehr. Hab noch ein anders Programm ausprobiert, nennt sich"geradeausfahren und speichern". ging aich beim ersten versuch- jetzt aber auch nicht mehr. Fährt immer im Kreis, und der wird immer enger.
Bei anderen Programmen, wo die Odometrie nicht zu sagen hatt läuft er aber gerade--na ja fast gerade.
gruß Frank

Thund3r
16.12.2009, 17:41
Hallo

Deck mal die Odometriesensoren mit Pappe oder so ab.
( http://www.asurowiki.de/pmwiki/uploads/Main/mod_odo2.jpg )
Und speicher den Quellcode, mach "make" und flash das Programm erneut dann müsste es eig. auf jeden Fall klappen. Schau auch mal ob bei den Odometriesensoren kein Wackelkontakt vorliegt.

Gruß Thund3r

Hubert.G
16.12.2009, 17:41
Vielleicht kann das Abhilfe schaffen.
http://www.asurowiki.de/pmwiki/uploads/Main/mod_odo2.jpg

Thund3r
16.12.2009, 17:45
Hallo

Genau das sagte ich einen thread vorher :D

Gruß Thund3r

frank1210
17.12.2009, 07:36
Habe alles ausprobiert. Das Programm mehrmals geflasht. jetzt driftet er in die andere richtung ab.
Hab gelesen das eines der Programme was ins EPROM speichert.Hats vieleicht damit was zu tun.
gibs vieleicht ein einfaches programm um die Odometrie zu testen?
Gruß Frank

radbruch
17.12.2009, 08:00
Hallo

Nein, das Programm speichert nichts im EEProm, nach dem Einschalten startet der asuro jedesmal jungfräulich.

Abhängig vom Codescheibensegment schwanken die eingelesenen Odometriewerte zwischen einem max- und einem minimalen Wert. Der Mittelwert sollte etwa TRIGGERLEVEL sein. Wenn nun der eingelesene Wert über den TRIGGERLEVEL steigt, wird dies in status[] gespeichert und der Zähler verändert. Anschliessend wird auf ein Unterschreiten des TRIGGERLEVEL gewartet, dieses wird wieder in status[] gespeichert, Zähler verändert usw.

// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
Die ODO-Werte sind umso kleiner, je heller die Sensoren beleuchtet werden! Deshalb könnte es sein, dass der TRIGGERLEVEL für deinen asuro zu hoch gewählt ist. Versuche mal kleinere Werte wie 550, 500, 450...

Ein einfacher Test wäre z.B:


while(1)
}
OdometrieData(data);
if(data[0]<500) StatusLED(RED); else StatusLED(GREEN);
if(data[1]<400) FrontLED(ON); else FrontLED(OFF);
Sleep(255);
}
...und die Räder vom Hand drehen;)

Gruß

mic

frank1210
17.12.2009, 08:23
Hi Leute, muß mich wohl bei Euch entschuldigen. Hab mir den kleinen mal genau vorgenommen, und festgestellt das die Achsen sich nicht gleich leicht drehen. Etwas gebogen, zwei kleine Unterlegscheiben und etwas Fett. Die Motoren neu justiert und verklebt. Siehe da er läuft schnurgerade.
Obwohl der Unterschied zwischen den Achsen ja nicht so schlimm war macht´s so virl aus. Hatte ich nicht gedacht. Ohne Odometrie lief er ja gleichmäßig(Fast). Komisch. Trotzdem vieleb Dank für Eure Bemühungen.
Programmieren mit Odometrie verstehe ich trotzdem noch nicht.
Viele Grüße Frank

oberallgeier
17.12.2009, 09:20
Hallo Frank,


Habe alles ausprobiert ... gibs vieleicht ein einfaches programm um die Odometrie zu testen ...Ja, gibt es. Stammt von Sternthaler : hier, runterscrollen, ASSensorenV205.zip. (https://www.roboternetz.de/phpBB2/viewtopic.php?t=31073&sid=4e30102802d28eef072a571163a08a13) Der hat auch gleich eine *hex-Datei mitgeliefert, dann braucht man sich mit der dort verwendeten Library nicht zu befassen. Einfach flashen, testen, freuen.

Die verschiedenen, möglichen Werte siehst Du in diesem (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=386834&sid=accd228dedc4aead0413318a729d25e5#386834) und dem folgenden Posting.

................https://www.roboternetz.de/phpBB2/files/l_r-odo-.jpg

Bei Sternthaler schwank(t)en die Odometriewerte zwischen 500 und 800, bei mir zwischen 10 und 170. Die zugehörigen Threads könnten lesenswert sein.

UUUps - den vorigen Beitrag hatte ich beim Posten nicht gesehen. Entweder schreibe ich so langsam (viel rumsuchen) oder mein DSL läuft streckenweise mit Rauchzeichen.

RoboHolIC
17.12.2009, 09:36
Hallo Frank1210.

Das kann eigentlich nicht sein. Bei der Überarbeitung mußt du ungewollt noch was anderes verändert haben, wenn der Bot doch VOR der Achsbegradigung und Schmierung OHNE Odometrie schon geradeaus lief ...

Ich tippe auf eine Veränderung bei den Reflexsensoren; dann kann es sein, daß die Odometrie bzw. Drehzahlregelung den Gleichlauf gegenüber der ungeregelten Variante bisher verschlimmbessert hat, weil fehlende Pulse den Regler in die Irre geleitet haben.

Gruß
Christian.

Thund3r
17.12.2009, 17:16
Hallo

Ich kann dem nur beipflichten. Überprüf nochmal die Odometriesensoren auf Wackelkontakt richtige Ausrichtung o.ä. und führe die Odo.Modifikation durch (s.o.).

Gruß Thund3r