Hallo,
was noch nicht so ganz klar wurde: verwendet du und dein Kollege ein und denselben ASURO oder hat jeder von euch einen eigenen Roboter?
Vielleicht ist noch etwas mit den Liniensensoren nicht in Ordnung (Lötfehler?).
Grüße,
Bernhard
Guten Morgen,
ich versuche schon seit längerem meinen ASURO dazu zu bewegen einer schwarzen Linie zu folgen, aber er haut immer wieder ab, bzw. dreht sich im Kreis.
Ich habe das Standartprogramm von der Arexx CD genommen und nur die Motorengeschwindigkeit etwas herabgesetzt.
Wenn mein Kollege sein Programm auf den ASURO flasht klappt es wunderbar, wie kann das sein? Könnte das Problem sogar an meinem Computer liegen?
Code:#include "asuro.h" // Linienverfolgung auf die einfachste Art int main(void) { unsigned int data[2]; //Speicher bereitstellen Init(); FrontLED(ON); // Linienbeleuchtung einschalten MotorDir(FWD,FWD); // Beide Motoren auf vorwärts while(1) // Endlosschleife, ASURO soll beliebig // lang einer Linie nachfahren { LineData(data); // aktuelle Helligkeitswerte der // Fototransistoren einlesen if (data [0] > data [1] ) // links heller als rechts... {MotorSpeed(100,80);} // ... dann links mehr Gas geben... else {MotorSpeed(80,100);} // ... sonst rechts mehr Gas geben! } return 0; }
Hallo,
was noch nicht so ganz klar wurde: verwendet du und dein Kollege ein und denselben ASURO oder hat jeder von euch einen eigenen Roboter?
Vielleicht ist noch etwas mit den Liniensensoren nicht in Ordnung (Lötfehler?).
Grüße,
Bernhard
Das Problem wird wohl eher nicht an deinem Computer liegen. Der Code scheint ja auch in Ordnung zu sein,sonst würde es auf dem anderen auch nicht laufen.
Was sagt denn der Selbsttest?
Vielleicht sollte man ihm aber auch sagen was er machen soll, wenn beide Werte gleich sind.
@BMS
Wir verwenden 2 verschiedene ASUROs. Lötfehler kann nicht sein, weil es mit seinem Programm von seinem Computer aus auf meinem ASURO funktioniert. Das Problem tritt nur auf, wenn ich es von meinem Computer aus flashen will.
Andere Programme funktionieren ohne Probleme. Ich versuche nochmal mit der Geschwindikeit zu spielen. Wenn ein Wert zu niedrig ist dreht sich das Rad nicht, aber wenn der Wert zu hoch ist kommt glaube ich der Liniensensor nicht mit.
*edit
Es ist zum heulen... Jetzt habe sogar noch Strumpschläuche um die Lichtsensoren gemacht und der ASURO fährt immer noch wie Depp durch die Gegend. Mit dem Programm stimmt alles.
Ich lasse den ASURO schon extra langsam fahren damit er auch genug Zeit hat zum messen, aber er hält seine Bahn keine 2mm ein. Immer wieder kommt er von der schwarzen Bahn ab. Es ist egal ob der Raum Hell, ganz Hell oder Dunkel ist, bzw. ob die FrontLED an oder aus ist.
ich komme einfach nicht mehr weiter.
Gibt es eine Möglichkeit, dass man eine Motorengeschwindigkeit vorgibt und bei einer Veränderung der Helligkeit (LineData[0]/LineData[1]) die entsprechende Seite beschleunigt und die andere verlangsamt wird?
Hallo
Für einen schnellen Test:
Dann nimmst du ein Blatt Papier, malst eine Linie drauf und ziehst diese Linie unter den Sensoren durch. So kannst du feststellen, ob und wo der asuro die Linie "sieht". Das sieht etwa so aus :Code:#include "asuro.h" // Linienverfolgung auf die einfachste Art int main(void) { unsigned int data[2]; //Speicher bereitstellen Init(); FrontLED(ON); // Linienbeleuchtung einschalten while(1) // Endlosschleife, ASURO soll beliebig // lang einer Linie nachfahren { LineData(data); // aktuelle Helligkeitswerte der // Fototransistoren einlesen if (data [0] > data [1] ) // links heller als rechts... StatusLED(RED); // ist rot else StatusLED(YELLOW); } return 0; }
http://www.youtube.com/watch?v=46ts6GH04NI
http://www.youtube.com/watch?v=694Q7X_PB4Q
(hab leider kein Video mit dem asuro, es zeigt aber die Idee)
Einer der unzähligen Ansätze mit ausgeblendetem Umgebungslicht:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=39774
Änder mal den Titel in etwas aussagekräftigeres...
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Vielen Dank für die Hilfe! Endlich färht mein ASURO. Danke radbruch für das Programm zum test, ob die Linie gefunden wird.
Dann habe ich mal das Programm aus deinem link genommen und siehe da es klapptNochmals vielen Dank.
Ich habe das Programm etwas abgeändert, sodass es die Kurven in der Linientestarena schafft, aber das ruckelt ziemlich und ist nicht so schnell.
Hat jemand eine Idee,wie manb das verbessern könnte(Geschwindigkeit/Ruckeln)?
Das Programm sieht so aus:
mfGPHP-Code:
#include "asuro.h" // Linienverfolgung auf die einfachste Art
#define tol 15
int main(void)
{
unsigned int data[2]; //Speicher bereitstellen
Init();
FrontLED(ON); // Linienbeleuchtung einschalten
MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
while(1) // Endlosschleife, ASURO soll beliebig
// lang einer Linie nachfahren
{
LineData(data); // aktuelle Helligkeitswerte der
// Fototransistoren einlesen
if (data [0] > data [1] + tol ) // links heller als rechts...
{MotorSpeed(140,80);
MotorDir(FWD,RWD);} // ... dann links mehr Gas geben...
LineData(data); // aktuelle Helligkeitswerte der
// Fototransistoren einlesen
if (data [1] > data [0] + tol ) // links heller als rechts...
{MotorSpeed(80,140);
MotorDir(RWD,FWD);
} // ... dann links mehr Gas geben...
else
{MotorSpeed(120,120);} // ... sonst rechts mehr Gas geben!
}
return 0;
}
while (!asleep()) sheep++;
Habe mal den Code überarbeitet (ungetestet) - die if-Konstruktionen überarbeitet und ein LineData entfernt, da es ja sowieso bei jedem Schleifendurchlauf neu eingelesen wird.
Am Programm selber kann man nicht mehr viel Laufzeit optimieren.Code:#include "asuro.h" // Linienverfolgung auf die einfachste Art #define tol 15 int main(void) { unsigned int data[2]; //Speicher bereitstellen Init(); FrontLED(ON); // Linienbeleuchtung einschalten MotorDir(FWD,FWD); // Beide Motoren auf vorwärts while(1) // Endlosschleife, ASURO soll beliebig { LineData(data); // aktuelle Helligkeitswerte der // Fototransistoren einlesen if (data [0] > data [1] + tol ) { MotorSpeed(140,80); MotorDir(FWD,RWD); } else if (data [1] > data [0] + tol ) { MotorSpeed(80,140); MotorDir(RWD,FWD); } else { MotorSpeed(120,120); MotorDir(FWD,FWD); } } return 0; }
Du kannst noch ein wenig mit den Geschwindigkeitswerten und der Toleranz spielen, dadurch lässt sich das noch optimieren.
Außerdem ist das Rückwärtsdrehen der Motoren kontraproduktiv. Du willst ja voran kommen. Wenn er oft die Drehrichtung FWD/RWD ändern muss, bleibt er eher auf der Stelle stehen. Also lieber den Motor, der bisher rückwärts fuhr in Vorwärtsrichtung drehen lassen, vielleicht mit geringer Geschwindigkeit.
Da musst du viel probieren. Aber Versuch macht klug
Ansonsten stößt dieses Regelverhalten halt irgendwann an seine Grenzen. Ist ja ein Zweipunktregler. Man könnte es einmal mit einem P-Regler (Software) versuchen.
Auch eine andere Anordnung der Sensoren (Abstand) kann viel am Regelungsverhalten ändern. Frage ist eben: willst du der Linie sehr präzise und langsam folgen oder grob und schnell ? Je schneller man folgen will, desto weiter sollten die Sensoren auseinander.
Grüße,
Bernhard
Jipiiiiiii es funktioniert.
und danke für die schnelle Antwort.
ich habe schon sehr viel mit den Werten rumprobiert.
wenn ich beide Motoren in der Kurve auf vorwärts setze, schafft er aber nicht so enge Kurven.
und wenn er vorwärts und rückwärts dreht, korrigiert er schnerller.
ich habe die Werte jetzt so optimiert, dass der bot der Linie sehr ruhig folgt.
mfG
Geändert von Herbert A. (08.03.2011 um 17:19 Uhr)
while (!asleep()) sheep++;
Lesezeichen