Kleiner Linienverfolger / line following robot
Verfasst: 30 Dez 2019, 22:34
Hallo,
ich stelle Euch hier mal meinen Linienverfolger vor (Video s.u.), den ich schon öfters mal erwähnt habe. Er kann gegenüber anderen Linienverfolgern nicht besonders viel. Die einzigen Anforderungen, die ich hatte, waren, dass er einer handgezeichneten Linie möglichst schnell und genau folgen sollte und dabei möglichst klein und wendig sein sollte. Idee war, dass die Kids eigene Strecken auf Poster malen können und er damit klarkommt.
Es kommen einige selbstgedruckte Teile und ein Arduino mit zwei DC-Motortreibern zum Einsatz. Interessant finde ich aber vor allem die Steuerungssoftware. Sie nutzt einen PID-Regler, den wir ja jüngst schon hier (nicht als erste) diskutiert haben. Die PID-Parameter können dynamisch auch während der Fahrt mit Hilfe einer Infrarot-Fernbedienung geändert werden. Die aktuellen Werte oder alternativ eine Visualisierung der Sensoren (PID Regelgröße) und des Output (PID Stellgröße) werden per OLED-Display angezeigt.
Im Gegensatz zu anderen Linienverfolgern kommt das Modell mit nur zwei Sensoren (Typ TCRT5000) aus, die hier analog ausgewertet werden (es gibt viele Beispiele mit diesem Sensor, die ihn nur digital mit einstellbarer Schwelle auslesen). Die Differenz der beiden Messwerte (links - rechts) kommt als Input (Regelgröße) in den PID-Regler, der Sollwert ist 0, was einer mittleren Position über der Linie entspricht. Einen Spursucher habe ich bisher nicht implementiert, der Roboter muss also am Anfang manuell auf die Linie gesetzt werden.
Da mir mir die 9V-Blockbatterien/akkus zu kurzlebig sind, verwende ich zwei 3,7V 14500 LiIonen-Akkus als Stromquelle. Ebenfalls gedruckt sind der An-/Ausschalter und der Baustein 15 mit Kugelrad.
Einiges an weiteren Erklärungen v.a. zur Steuerung habe ich in den Video gepackt, fragt gerne, wenn was unklar ist:
https://youtu.be/hU7KIjeh6Fw
Wie man sieht, fährt das System bei 66% der mit MiniMotor, U-Getriebe und ca. 8V maximal möglichen Geschwindigkeit sehr genau und weitgehend geschmeidig. 100% sind nur auf Kosten harter (ruckartiger) Steuerungseingriffe zu fahren, wenn die Linie zuverlässig gehalten werden soll. Vielleicht fällt ja den PID-Profis unter Euch noch was auf, aber ich habe da wirklich lange rumprobiert und es nicht besser hinbekommen.
Einer der Stolpersteine für mich war bei dem Projekt die Frequenz des PID-Regler-Aufrufs. Die ansonsten sehr empfehlenswerte Arduino-Library von Brett Beauregard hat als Standard ein Intervall von 200 mS für die Aktualisierung des PID-Reglers eingestellt, was hier natürlich viel zu lang ist, in der Zeit fährt der Roboter mind 5 cm. Selbst ein häufigerer Aufruf führt zu keiner schnelleren Aktualisierung, wenn man diesen Default nicht per SetSampleTime() ändert. Auch interessant war die Umrechnung des Output (Stellgröße) auf passende PWM-Werte für die beiden Motoren. Problem war anfangs, dass die Sensoren je nach Bedingungen etwas unterschiedliche Werte-Bereiche lieferten, damit aber der vordefinierte PWM-Bereich von 0-255 angesteuert werden sollte. Hier hat die Kalibrierung mit anschließender Normierung des Messwertebereichs per map() geholfen (s. Video).
Mein Fazit ist, dass der PID-Regler auch keine Wunder bewirken kann. Das System, so wie es hier aufgebaut ist, bringt einiges an Trägheiten mit sich. Sensor und Arduino kommen an ihre Grenzen, was die Reaktionsgeschwindigkeit angeht, und das Spiel des Getriebes bringt die Geschwindigkeitswechsel auch nicht 1:1 auf die Straße. Bei Gelegenheit werde ich den Linienverfolger wahrscheinlich ähnlich noch mal mit einem weniger schnarchigen Wemos/ESP und Mini-Getriebemotoren nachbauen.
lg
Jan
ich stelle Euch hier mal meinen Linienverfolger vor (Video s.u.), den ich schon öfters mal erwähnt habe. Er kann gegenüber anderen Linienverfolgern nicht besonders viel. Die einzigen Anforderungen, die ich hatte, waren, dass er einer handgezeichneten Linie möglichst schnell und genau folgen sollte und dabei möglichst klein und wendig sein sollte. Idee war, dass die Kids eigene Strecken auf Poster malen können und er damit klarkommt.
Es kommen einige selbstgedruckte Teile und ein Arduino mit zwei DC-Motortreibern zum Einsatz. Interessant finde ich aber vor allem die Steuerungssoftware. Sie nutzt einen PID-Regler, den wir ja jüngst schon hier (nicht als erste) diskutiert haben. Die PID-Parameter können dynamisch auch während der Fahrt mit Hilfe einer Infrarot-Fernbedienung geändert werden. Die aktuellen Werte oder alternativ eine Visualisierung der Sensoren (PID Regelgröße) und des Output (PID Stellgröße) werden per OLED-Display angezeigt.
Im Gegensatz zu anderen Linienverfolgern kommt das Modell mit nur zwei Sensoren (Typ TCRT5000) aus, die hier analog ausgewertet werden (es gibt viele Beispiele mit diesem Sensor, die ihn nur digital mit einstellbarer Schwelle auslesen). Die Differenz der beiden Messwerte (links - rechts) kommt als Input (Regelgröße) in den PID-Regler, der Sollwert ist 0, was einer mittleren Position über der Linie entspricht. Einen Spursucher habe ich bisher nicht implementiert, der Roboter muss also am Anfang manuell auf die Linie gesetzt werden.
Da mir mir die 9V-Blockbatterien/akkus zu kurzlebig sind, verwende ich zwei 3,7V 14500 LiIonen-Akkus als Stromquelle. Ebenfalls gedruckt sind der An-/Ausschalter und der Baustein 15 mit Kugelrad.
Einiges an weiteren Erklärungen v.a. zur Steuerung habe ich in den Video gepackt, fragt gerne, wenn was unklar ist:
https://youtu.be/hU7KIjeh6Fw
Wie man sieht, fährt das System bei 66% der mit MiniMotor, U-Getriebe und ca. 8V maximal möglichen Geschwindigkeit sehr genau und weitgehend geschmeidig. 100% sind nur auf Kosten harter (ruckartiger) Steuerungseingriffe zu fahren, wenn die Linie zuverlässig gehalten werden soll. Vielleicht fällt ja den PID-Profis unter Euch noch was auf, aber ich habe da wirklich lange rumprobiert und es nicht besser hinbekommen.
Einer der Stolpersteine für mich war bei dem Projekt die Frequenz des PID-Regler-Aufrufs. Die ansonsten sehr empfehlenswerte Arduino-Library von Brett Beauregard hat als Standard ein Intervall von 200 mS für die Aktualisierung des PID-Reglers eingestellt, was hier natürlich viel zu lang ist, in der Zeit fährt der Roboter mind 5 cm. Selbst ein häufigerer Aufruf führt zu keiner schnelleren Aktualisierung, wenn man diesen Default nicht per SetSampleTime() ändert. Auch interessant war die Umrechnung des Output (Stellgröße) auf passende PWM-Werte für die beiden Motoren. Problem war anfangs, dass die Sensoren je nach Bedingungen etwas unterschiedliche Werte-Bereiche lieferten, damit aber der vordefinierte PWM-Bereich von 0-255 angesteuert werden sollte. Hier hat die Kalibrierung mit anschließender Normierung des Messwertebereichs per map() geholfen (s. Video).
Mein Fazit ist, dass der PID-Regler auch keine Wunder bewirken kann. Das System, so wie es hier aufgebaut ist, bringt einiges an Trägheiten mit sich. Sensor und Arduino kommen an ihre Grenzen, was die Reaktionsgeschwindigkeit angeht, und das Spiel des Getriebes bringt die Geschwindigkeitswechsel auch nicht 1:1 auf die Straße. Bei Gelegenheit werde ich den Linienverfolger wahrscheinlich ähnlich noch mal mit einem weniger schnarchigen Wemos/ESP und Mini-Getriebemotoren nachbauen.
lg
Jan