Logo

PiBot-B

mobiler Roboter mit Raspberry Pi

PiBot-B - mobile robot with Raspberry Pi
PiBot-B - mobile robot with Raspberry Pi PiBot-B - mobile robot with Raspberry Pi PiBot-B - mobile robot with Raspberry Pi

PiBot-B – ein mobiler Roboter auf Basis des Raspberry Pi

Eigenschaften

PiBot-B ist ein kleiner mobiler Roboter auf Basis des Einplatinencomputers Raspberry Pi. Er bewegt sich auf Raupenketten voran und kann somit leichte Bodenunebenheiten wie Teppichkanten überwinden. Ein von einer Webcam geliefertes Videobild wird drahtlos auf ein iPhone übertragen; mit einer einfachen App kann das Gefährt ferngesteuert werden. Ein in das Robotergehäuse eingebautes LED-Display dient der Anzeige diverser Betriebszustände.

Geplante nächste Ausbaustufe: Wird der Roboter in den Autonomiemodus versetzt, bewegt er sich ohne externe Steuerung fort. Mithilfe von Sensoren erkennt er Hindernisse und weicht diesen selbstständig durch geeignete Fahrmanöver aus.

Fernsteuerung mit iPhone

iPhone web app

iPhone Web App

Auf dem Raspberry Pi läuft ein Webserver (lighttpd); eine einfache Web-App auf dem iPhone dient als Steuerkonsole. Die Verbindung zwischen Roboter und iPhone erfolgt via WLAN.

Web-App

Die angezeigte Webseite ist horizontal in zwei Frames unterteilt. Im oberen wird das Bild der Webcam mit mjpeg-streamer als Life-Stream angezeigt. Im unteren Frame nimmt ein einfaches PHP-Formular mit neun Buttons die Steuerkommandos des Benutzers entgegen und leitet diese an die Software für die Motorsteuerung weiter. Der zuletzt gedrückte Button (der gerade aktive Fahrmodus) wird mit einem roten Ring hervorgehoben.

Mit einem weiteren Button „Shutdown“ kann der Raspberry Pi heruntergefahren werden.

Neben Geradeausfahrt (vor- und rückwärts) sind Kurvenfahrten mit festem Radius (vorwärts etwa 80 cm, rückwärts 30 cm) und Drehungen auf der Stelle in beide Richtungen möglich. Dieses Set an fest einprogrammierten Fahrmanövern hat sich für die Fernsteuerung des Fahrzeugs bewährt; die Kurvenfahrten sind geschmeidig, das Bild der Webcam lässt sich gut verfolgen. Die von mir entwickelte Motorsteuerung unterstützt genau diese Fahrbewegungen.

Buttons

Belegung der Buttons

1  vorwärts Kurve links
2  vorwärts geradeaus
3  vorwärts Kurve rechts
4  Rotation links
5  Stop
6  Rotation rechts
7  rückwärts Kurve links
8  rückwärts geradeaus
9  rückwärts Kurve rechts

Driving example

1–9–1–2


Für ein sanftes Anfahren und Bremsen wird das Gefährt bei Start und Stopp sowie beim Wechsel zwischen Vor- und Rückwärtsfahrt automatisch kurz abgebremst bzw. beschleunigt.

Blockbild

schematic of Raspberry Pi robot

Blockbild

Herzstück der Elektronik des Roboters ist der kreditkartengroße Einplatinencomputer Raspberry Pi in der B-Version. Die Stromversorgung des Raspberry Pi übernimmt ein 5-Volt-Power-Pack, das eigentlich zum Nachladen von Handy-Akkus gedacht ist. Die beiden Motoren im Roboter-Chassis werden durch die in das Chassis integrierten Batterien (4 x AA) mit 6 Volt Spannung versorgt. Die Ansteuerung der Motoren erfolgt über eine kleine Zusatzschaltung (Motor Control oben Mitte), die mit dem GPIO-Port des Raspberry Pi verbunden wird.

Eine 8x8-LED-Matrix dient als Display für die Anzeige diverser Betriebszustände, sie wird über den I²C-Bus angesteuert und daher ebenfalls mit dem GPIO-Pfostenstecker verdrahtet. (Zwei GPIO-Pins sind speziell für die Verwendung als I²C-Bus ausgelegt.) Die Webcam und der WLAN-Adapter werden an die beiden USB-Ports des Raspberry Pi angeschlossen.

In Zukunft soll das Gefährt zusätzlich mit Sensoren für die Hinderniserkennung (oben links) ausgestattet werden. Diese werden dann über freie Pins des GPIO-Konnektors angesteuert.

Roboter-Chassis

Chassis for Raspberry Pi robot

Pololu Zumo-Chassis

Nach ersten Experimenten mit einem Dagu Magician Robot Chassis (das sich als zu instabil erwies) stieß ich auf das Zumo Chassis Kit von Pololu. Es passt zufällig genau unter das von mir gewählte Gehäuse und bildet mit dem Raspberry Pi optisch eine Einheit (siehe Bilder oben). In Kombination mit zwei 100:1 Micro Metal Gearmotors (ebenfalls Pololu) ergibt sich ein sehr kompaktes und robustes Fahrwerk.

Motorsteuerung

Pulsweitenmodulation

Kettenfahrzeuge manövrieren, indem die beiden Gleisketten für Kurvenfahrten mit unterschiedlichen Geschwindigkeiten und für Drehungen auf der Stelle gegenläufig bewegt werden. Die beiden Gleichstrommotoren im Roboter-Chassis sollen dazu mittels Pulsweitenmodulation (PWM) in ihrer Geschwindigkeit variiert werden. Der GPIO-Port des Raspberry Pi verfügt aber leider über nur einen Pin (GPIO 18), der hardwareseitig PWM unterstützt. Meine Experimente mit Software-PWM-Lösungen (z. B. der Software PWM Library von WiringPi) erbrachten keine befriedigenden Resultate – die Motoren liefen ruckelig.

Bei der hier vorgeschlagenen Lösung gelangt das eine vom Raspberry Pi generierte PWM-Signal über einen digitalen Umschalter wahlweise nur an einen der beiden Motoren (der andere steht dann entweder still oder läuft mit Maximalgeschwindigkeit) oder an beide gleichzeitig (beide laufen dann mit variabler, bei Bedarf reduzierter, aber derselben Geschwindigkeit).

(Siehe auch: Mögliche Verbesserungen.)

Fahrmanöver

Auf diese Weise können folgende Fahrmanöver realisiert werden:

Driving manoevres

mögliche Fahrmanöver mit nur einem PWM-Signal

  • rotation – Das PWM-Signal gelangt an beide, sich gegenläufig bewegende Motoren: Drehung auf der Stelle mit variabler Geschwindigkeit.
  • turn – Ein Motor steht still, der andere erhält das PWM-Signal: Kurve um die still stehende Gleiskette mit variabler Geschwindigkeit.
  • curve – Ein Motor erhält die volle Fahrspannung, der andere erhält das PWM-Signal: Bogenfahrt mit variablem Radius, aber unveränderlicher Geschwindigkeit.
  • straight – Beide Motoren erhalten das PWM-Signal: Geradeausfahrt mit variabler Geschwindigkeit.

Die Skizze oben zeigt die Varianten für „Vorwärtsfahrt“ und „Linkskurve“, die beschriebenen Fahrmanöver sind natürlich auch bei Rückwärtsfahrt und für Rechtskurven möglich.

H-Brücke

Die Motoren werden mit einer integrierten H-Brücke angesteuert. Über digitale Steuersignale (2 Bits je Motor) können jeweils Linkslauf, Rechtslauf und Motorstopp bewirkt werden. In einen weitereren Eingang je Motor wird bei Bedarf das PWM-Signal eingespeist.

Schaltung

Circuit

Schaltung Motorsteuerung

Für die H-Brückenschaltung zur Motorsteuerung habe ich das IC L293D verwendet. Dieses hat TTL-kompatible Steuereingänge und bereits integrierte Freilaufdioden an den Ausgängen, mit denen es die Motoren direkt treiben kann. Einige zu den Motoren parallel geschaltete Kondensatoren (Keramik, 100 nF) halten von den Motoren produzierte Spannungsspitzen vom Raspberry Pi fern. Ich habe je zwei direkt am IC, in der (verdrillten) Kabelverbindung zu den Motoren und unmittelbar an den Motoren selbst platziert. Sicher ist sicher ;-)

(Siehe auch: Mögliche Verbesserungen.)

PWM-Umschalter

PWM switch with or-gates

PWM-Schalter mit Oder-Gatter

Die Verteilung des GPIO-PWM-Signals auf die beiden PWM-Eingänge der Motorsteuerung erfolgt mit einem digitalen Umschalter aus zwei Oder-Gattern in einem IC 74LS32. An jeweils einem Eingang eines Oder-Gatters liegt das PWM-Signal (GPIO 18). Am jeweils anderen Eingang bewirkt ein High (im Bild links), dass der Ausgang – unabhängig vom PWM-Signal – auf High geht, der Motor also über die H-Brücke die volle Spannung erhält. Ein Low hingegen (im Bild rechts) lässt das PWM-Signal passieren und führt es über die H-Brücke dem Motor in Form einer pulsierenden Gleichspannung zu. Die Motorleistung wird nun durch die Pulsweite des PWM-Signals bestimmt.

GPIO-Anschluss

Die Steuereingänge des L293D und die Eingänge der beiden Oder-Gatter im 74LS32 können ohne weitere Maßnahmen direkt von den GPIO-Ausgängen angesteuert werden. Eine Pegelumsetzung (GPIO 3.3 V nach TTL 5 V) ist nach meiner Erfahrung nicht erforderlich. Die Pegel der GPIO-Ausgänge sind zu den TTL-Eingängen (High ≥ 2.0 V und Low ≤ 0.8 V) kompatibel und werden von diesen richtig „verstanden“.

GPIO Pin Funktion
5 V2Versorgungsspannung ICs
GPIO 2215linker Motor, Input 1 (L293D Pin 15)
GPIO 2316linker Motor, Input 2 (L293D Pin 10)
GPIO 1019rechter Motor, Input 1 (L293D Pin 2)
GPIO 2418rechter Motor, Input 2 (L293D Pin 7)
GPIO 1711linker Motor, PWM on/off (74LS32 Pin 13)
GPIO 2713rechter Motor, PWM on/off (74LS32 Pin 2)
GPIO 1812GPIO-PWM (74LS32 Pin 1 und 12)
GND14gemeinsame Masse von Raspberry Pi, ICs und Motorbatterie

GPIO-Anschlüsse Motorsteuerung

Software

Die Software für die Motorsteuerung muss die GPIO-Pins, welche die benötigten Logikpegel an die Eingänge der ICs legen sollen, mit High bzw. Low ansteuern, und außerdem das gewünschte PWM-Signal auf den GPIO-Port 18 legen. Dazu eignet sich gut die WiringPi-Library in Verbindung mit dem Python-Wrapper.

Software Motorsteuerung

Ein in Python geschriebenes Modul „robot.py“ (Listing siehe oben), steuert die ICs auf der Zusatzplatine über den GPIO-Port an und implementiert so die oben beschriebenen Fahrmanöver. Ein als Hintergrundprozess laufendes Programm (ebenfalls Python) führt die Fahrbewegungen gemäß den auf der iPhone-App gedrückten Buttons aus. (Ich habe diesen Weg gewählt, damit später – im Autonomiemodus – in der Endlosschleife auch die Sensoren periodisch abgefragt werden können.) Die Kommunikation zwischen dem PHP-CGI und diesem Programm erfolgt der Einfachheit halber über eine Dateischnittstelle.

LED-Matrix

Wiring of led matrix Smiley

Anschluss der LED-Matrix an den I²C-Bus – Beispielanzeige

Mit der über den I²C-Bus angesteuerten LED-Matrix von Adafruit hatte ich bereits meine ersten Raspberry-Pi-Experimente durchgeführt. Da ich dem Roboter die Möglichkeit geben wollte, verschiedene Betriebszustände anzuzeigen, entschied ich mich für den Einsatz dieses schicken Displays. (Das ist natürlich eine ziemlich luxuriöse Lösung, ein paar Einzel-LEDs hätten es auch getan ;-)

Der Anschluss ist simpel, die vier Lötpunkte der Platine werden einfach mit den korrespondierenden GPIO-Pins verbunden. Eine zur Ansteuerung der Matrix über den I²C-Bus geeignete Softwarebibliothek kann bei Adafruit heruntergeladen werden.

Für die Darstellung von Piktogrammen auf dem Display habe ich ein Pythonprogramm „8x8.py“ geschrieben, das aus ASCII-Zeichen bestehende Bitmaps sowie einige einfache Kommandos (z. B. „blink“) verarbeitet. Rechts als Beispiel das Bitmap-File für den Smiley oben.

..oooo..
.o....o.
o.o..o.o
o......o
o.o..o.o
o..oo..o
.o....o.
..oooo..

Webcam

Webcam Webcam

modifizierte Webcam mit Selbstbau-Winkelstecker

Bei der Webcam entschied ich mich für die C300 von Logitech – zum einen, weil sie mit der Software mjpeg-streamer betrieben werden kann, zum anderen, weil sie mit ihrem kugeligen Kopf dem Gefährt ein putziges Aussehen verleiht. Ich habe den Klemmbügel vom Sockel entfernt und diesen mit einem scharfen Messer von überflüssigen Profilen befreit, bis lediglich eine annähernd quadratische Grundplatte übrig blieb. Wenn man unter dieser Platte vier selbstklebende Gerätefüßchen anbringt, ist es ausreichend stabil, wenn die Platte mit einem Gummiband auf dem Gehäusedeckel fixiert wird.

Nach einem Blick in das Innenleben des Webcamgehäuses gab ich die Idee auf, an Stelle des vorhandenen, langen Kabels ein kürzeres mit angeschweißtem Winkelstecker anzuschließen. Statt dessen kürzte ich das vorhandene Kabel auf die benötigte Länge und lötete einen USB-A-Platinenstecker von Assmann so an, dass das Kabel zur Seite wegführt. Durch Ummantelung mit Flüssiggummi entstand so ein brauchbarer Selbstbau-Winkelstecker (siehe Bild oben).

WLAN

Edimax wifi dongle

Edimax-Dongle

Die drahtlose Verbindung zwischen Raspberry Pi und iPhone erfolgt über WLAN. Dazu wird der WLAN-Adapter im USB-Port des Raspberry Pi im Access-Point-Modus betrieben, sofern er sich nicht in Reichweite des heimatlichen WLAN-Routers befindet. Ein einfaches Skript prüft nach dem Booten mit Ping, ob der Router erreichbar ist. Ist dies nicht der Fall, wird der WLAN-Adapter in den Access-Point-Modus umkonfiguriert. Dazu wird die Datei /etc/network/interfaces modifiziert, anschließend werden der Access-Point-Daemon hostapd und der DHCP-Server udhcpd gestartet. Eine Anleitung für den Betrieb eines Access-Points auf dem Raspberry Pi gibt es bei elinux.org.

Der von mir wegen seiner Performance und seiner geringen Maße präferierte Edimax-WLAN-Adapter EW-7811Un eignet sich – entgegen landläufiger Meinung – bestens für den Betrieb als Access-Point, allerdings nur mit einem speziellen Ersatz für das hostapd-Binary, den Dave Conroy freundlicherweise zum Download anbietet.

Zusammenbau

Zusatzplatine

Die Zusatzschaltung für die Motorsteuerung ist recht einfach, die zwei ICs und die paar Kondensatoren finden auf einer passend gekürzten Universal-IC-Platine Platz, die zwischen Roboter-Chassis und Raspberry-Pi-Gehäuse eingebaut wird. (Die Breite ist bereits genau richtig.)

Assemmbly

Zusatzplatine, über Flachbandkabel an GPIO-Port angeschlossen, rote Litze: 5 V

Im Bild erkennt man auf der Platine links und rechts oben die Steckverbinder für die Kabel zu den Motoren; unten Mitte (teilweise verdeckt) sitzt der Steckverbinder für das Kabel zur Batterie im Chassis. An den im Bild nach oben führenden Teil des Flachbandkabels vom GPIO-Konnektor werden später die Sensoren (in Planung) angeschlossen. Die noch ungenutzte obere Hälfte der Platine bietet dann ggf. Platz für weitere Elektronik.

Assembly

Die beiden Hälften vor dem Zusammenklappen

Die Platine wird mit der Bestückungsseite nach unten mit 4 Schrauben und Abstandhaltern auf das Roboterchassis geschraubt (rechts), der mit dem Flachbandkabel verbundene Raspberry Pi (links, sichtbar ist nur die Gehäuseunterseite) wird auf die Platine geklappt und sitzt dann mit seinem Gehäuse und vier angeklebten Gummifüßchen oben auf der Lötseite der Platine. Er wird – zusammen mit der Webcam – einfach durch ein Gummiband gehalten.

Gehäuse

Beim Gehäuse fiel meine Wahl auf das neue, sehr schicke Adafruit Pi Case. Es hat einen leicht trapezförmigen Querschnitt (verbreitert sich nach unten), passt dabei immer noch genau zwischen die Raupenketten des Roboterchassis und überdeckt mit seinem schwarzen Unterteil fast vollständig die hässliche Platine. Ein Schlitz für das GPIO-Flachbandkabel ist vorhanden. Das Oberteil ist glasklar und hat keine Schlitze über den DSI- und CSI-Konnektoren, so dass das LED-Display im hinteren Teil des Gehäuses eingebaut werden kann.

SD card adapter

Ausschnitt für den Micro-SD-Card-Adapter auf der Gehäuseunterseite

Da die SD-Card nicht aus dem Gehäuse herausragen darf, weil sie sonst dem Akku im Weg wäre, habe ich einen Adapter für eine Micro-SD-Card eingesetzt. Damit dieser in das Adafruit-Gehäuse passt, muss dort allerdings an passender Stelle ein Ausschnitt hineingeschnitten werden.

(Siehe auch: Mögliche Verbesserungen.)

Verkabelung im Heck

Wriring in the rear

Verkabelung GPIO, LED-Matrix und Akku

Von den insgesamt 26 Pins des GPIO-Pfostensteckers (links im Bild) werden nur die Pins 11 bis 26 sowie Pin 2 aus dem Gehäuse heraus an die Platine zwischen Raspberry Pi und Chassis geführt. Die 4 Pins des I²C-Busses werden innerhalb des Gehäuses für den Anschluss der dort eingebauten LED-Matrix gebraucht. Ich habe daher einen 16-poligen Pfostenverbinder an einem Ende so gekürzt, dass er sich auf die Pins 11 bis 26 des Pfostensteckers aufstecken lässt; ein 16-poliges Flachbandkabel führt von hier nach unten zur Platine. Die benachbarten Pins 9 und 10 des Pfostensteckers werden auf diese Weise zwar blockiert, sie werden aber auch nicht benötigt. Die übrigen Pins bleiben frei zugänglich.

(Siehe auch: Mögliche Verbesserungen.)

Für die weiteren Verbindungen habe ich handelsübliche Experimentierkabel („Jumper wires“, weiblich) verwendet, deren Isolierhülsen ich gekürzt und eingekerbt habe, so dass die Kabel im rechten Winkel abgeknickt werden konnten und dadurch unter den Gehäusedeckel passen. Eines dieser Kabel steckt auf Pin 2 (5 V) und führt neben dem Flachbandkabel nach unten zur Platine (im Bild links rot), mit vier weiteren Kabeln ist die 8x8-LED-Matrix angeschlossen. (Diese habe ich mit doppelseitigem Klebeband auf dem nicht benötigten DSI-Konnektor fixiert, dadurch sitzt sie unmittelbar unter dem Gehäusedeckel.)

Akkuhalterung und -kabel

Wiring of the battery

Selbstbaukabel für den Akku

Der Raspberry Pi wird durch einen zylindrischen 5-V-Akku mit Spannung versorgt. Für die Verbindung des Akku-Ausgangs (USB-A-Buchse) mit dem Raspberry Pi (Micro-B-USB-Buchse) wird ein spezielles, sehr kurzes Kabel mit gewinkelten Steckern benötigt. Ich habe hierzu ein Kabel von Delock (gewinkelter Micro-B-Stecker auf USB-A-Buchse) zweckentfremdet, weil hier der Stecker den richtigen Winkel aufweist. Die Buchse habe ich abgeschnitten, das Kabel gekürzt und einen USB-A-Platinenstecker von Assmann so an das Kabel gelötet, dass sich die gewünschte Geometrie ergab (siehe Bild). Anschließend habe ich die Konstruktion mit Flüssiggummi ummantelt.

Der Akku steckt am Heck des Gefährts in zwei Schlingen aus Kabelbindern, die an den Abstandhaltern der Platine befestigt sind.

Liste der Komponenten

Komponente Produkt Hersteller Händler
Raspberry Pi Raspberry Pi Model B 512 MB RAM RS Comp. Amazon
Gehäuse Adafruit Pi Case Adafruit exp-tech
SD-Card-Adapter Low-profile microSD card adapter Adafruit Watterott
Roboter-Chassis Pololu Zumo chassis Pololu Lipoly
Motoren Pololu 100:1 Micro Metal Gearmotor Pololu Lipoly
Motorsteuerung L293D H-Bridge diverse Conrad
Akku für RPI Leicke externer Power-Pack 2800 mAh Leicke Amazon
Akku-Kabel Delock Kabel USB micro-B Stecker Delock Amazon
Selbstbau-USB-Stecker Assmann USB-Einbaustecker Assmann Conrad
WLAN-Adapter Edimax EW-7811Un Edimax Amazon
Webcam Logitech C300 Logitech Amazon
8x8 LED-Matrix Adafruit Small 1.2" 8x8 LED Matrix Adafruit Watterott

Komponenten

Mögliche Verbesserungen

Die nachstehenden Verbesserungen halte ich für interessant und machbar, getestet habe ich sie aber nicht.

  • Es gibt bei Adafruit inzwischen einen Adapter für Micro-SD-Cards, der perfekt in das Adafruit-Gehäuse passt, ohne daraus hervorzustehen. Damit wäre der Ausschnitt im Gehäuseboden überflüssig.
  • Am P5-Header scheint ein zweiter I²C-Bus zur Verfügung zu stehen. Wenn dem so wäre, könnte man das LED-Display (ohne Konnektor) direkt mit dem unmittelbar benachbarten(!) P5-Header verdrahten, und der P1-Header wäre uneingeschränkt zugänglich. Das Herstellen eines gekürzten Pfostensteckers könnte entfallen.
  • Es gibt winzige, integrierte H-Brücken-Platinchen (wie z. B. den DRV8835 Dual Motor Driver Carrier von Pololu) mit gegenüber dem von mir verwendeten IC L293D erweiterter Funktionalität bei deutlich geringerer Bauhöhe. Mit dem experimentiere ich gerade bei der Entwicklung des PiBot-A.
  • Ich bin inzwischen auf die Software pi-blaster gestoßen, die eine saubere Software-PWM-Implementierung verspricht. Ich werde das für den (in der Entwicklung befindlichen) PiBot-A testen – vielleicht erübrigt sich dann der PWM-Switch mit den beiden Oder-Gattern.

Known Issues

  • Die Motoren sind recht laut, sie erzeugen ein etwas unangenehmes, sägendes Geräusch.
  • Die Kurvenradien fallen je nach Untergrund (Glattboden oder Teppich) unterschiedlich aus. Drehungen auf der Stelle sind auf Teppichboden nur mit deutlich höherer Motordrehzahl möglich.
  • Sporadisch fällt das Bild der Webcam aus (wird schwarz oder friert ein). Ich habe keine Ahnung, ob das an der Kamera oder an der Software (mjpeg-streamer) liegt. Als Workaround habe ich das Videobild in der iPhone-App klickbar gemacht, ein Klick restartet die Webcam-Software.
  • Der 5-Volt-Akku versorgt den Raspberry Pi etwa 2 Stunden lang mit Strom. Seine Ausgangsspannung bricht dann ohne Vorwarnung zusammen, ein Shutdown ist nicht mehr möglich. Das Nachladen dauert einen halben Tag. Die Batterien im Chassis, die die Motoren versorgen, halten dagegen ewig.

© 2014 – Thomas Schochwww.retas.de

Valid HTML 4.01 Transitional