Archiv verlassen und diese Seite im Standarddesign anzeigen : Liniensensoren funktionieren nicht richtig
wildtobias
21.02.2011, 10:04
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 8-[ ?
#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.
wildtobias
21.02.2011, 12:12
@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?
radbruch
21.02.2011, 19:41
Hallo
Für einen schnellen Test:
#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;
}
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 :
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
wildtobias
22.02.2011, 08:20
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 klappt ;) Nochmals vielen Dank.
Herbert A.
07.03.2011, 21:05
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:
#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;
}
mfG
Habe mal den Code überarbeitet (ungetestet) - die if-Konstruktionen überarbeitet und ein LineData entfernt, da es ja sowieso bei jedem Schleifendurchlauf neu eingelesen wird.
#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;
}
Am Programm selber kann man nicht mehr viel Laufzeit optimieren.
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
Herbert A.
07.03.2011, 21:39
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.