All about Robot Cars - part 1

In den nächsten vier Wochen wollen wir in unserem Blog als Schwerpunktthema kleine Elektrofahrzeuge von allen Seiten beleuchten. Sie werden staunen, wie viele Kombinationsmöglichkeiten es für die Ausstattung dieser kleinen sogenannten Robot Cars gibt. Wir beginnen mit der Basisausstattung, bei der Sie zwischen dem zweirädrigen Bausatz mit Stützrad und dem vierrädrigen wählen können. Die kleinen Gleichstrommotoren sind bei fast allen Lieferanten gleich, aber bei den Micro Controllern steht die volle Palette von Raspberry Pis über AVR (Arduino kompatibel) und Espressif mit unterschiedlichen Stärken und Schwächen zur Verfügung. 

Für den ersten Test kann man die Fahrbefehle wie beim Lego ® Boost vorprogrammieren. Aber das wird schnell langweilig. Eine Fernsteuerung muss her. Beim Raspberry Pi kann man eine Funktastatur am USB Port benutzen. Die WLAN-fähigen MCUs können von einem Controller im Netzwerk, z.B. dem Smartphone, sogar mit Blynk, gesteuert werden. Als Abschluss seiner MQTT-Blogreihe wird Jörn Weise einen einfachen Roll-Roboter über seinen Raspberry Pi Broker steuern. Und wir zeigen Ihnen, wie Sie mit einem Mikrocontroller Board mit ATmega328P, ATmega16U2, kompatibel mit Arduino UNO R3 eine Funkfernsteuerung bauen und programmieren können.

Zum Schluss wollen wir den großen Vorbildern nacheifern und unserem Robot Car das autonome Fahren beibringen. Mit den Abstandsensoren können wir einen Nothalt programmieren oder Hindernissen ausweichen. Mit den IR Sensoren können wir einer Linie folgen oder sehr präzise in kleinen Schritten fahren, um z.B. rückwärts einzuparken.

Los geht’s mit den ersten Entscheidungen:

Zunächst benötigt man ein Chassis mit 2 oder 4 Rädern/E-Motoren. Die Kits haben wir zurzeit noch nicht wieder im Sortiment; deshalb verweisen wir hier auf Amazon.

Vor- und Nachteile der zweirädrigen mit Stützrad: Hochbeweglich, kann auf der Stelle drehen. Aber durch die (sagen wir ruhig billige) Bauart der Motoren oder kleine Unebenheiten am Boden ist der Geradeauslauf schwierig.


Vor- und Nachteile der vierrädrigen: Besserer Geradeauslauf, ein hakelnder Motor wird angeschoben, mehr Platz für MC und Akkus. Aber den Geradeauslauf erkauft man sich mit großen Kurvenradien. Und vier Motoren benötigen auch doppelt so viel Saft aus den Akkus.


Mit dem Stichwort Akkus sind wir bei der Stromversorgung unserer Robot Cars. Wie auf den Bildern zu sehen ist, enthalten die Bausätze eine Halterung für 4 Mignon Batterien/Akkus. Das mag für erste Versuche genug sein; man stößt jedoch sehr schnell an Grenzen. Die Mignon Akkus liefern nur 1,2 bis 1,25 V pro Zelle, fast zu wenig für unsere Micro Controller. Und auch die Motoren, bei weitem die größeren Stromverbraucher, mögen etwas mehr „Wumms“. Eine Halterung für 6 Mignon Akkus ist da schon besser. Empfehlenswert ist auch eine getrennte Stromversorgung für Motoren und Micro Controller, denn ein kurzzeitig blockierender Motor kann schnell einen unerwünschten Neustart der MCU verursachen.

Die meisten Leser werden wissen. dass die Micro Controller die Motoren nicht direkt mit Strom versorgen können und die Steuerung der Motor-Drehzahl über Pulsweitenmodulation (PWM) erfolgt. Wir benötigen also einen Motor Controller, der von der MCU mit PWM angesteuert die externe Spannungsversorgung an die Motoren leitet. Das kann im einfachsten Fall ein IC-Baustein mit Namen L293D sein. Empfehlenswert sind jedoch Shields oder HATs mit einem oder zwei dieser Chips, die direkt auf den jeweiligen Micro Controller aufgesteckt werden. Wie dieser Chip, eine sogenannte H-Brücke, funktioniert, werden wir in einem Blog im Detail erläutern.

Als Nächstes müssen wir uns entscheiden, welchen Micro Computer oder Micro Controller wir auswählen. Auch hier gibt es jeweils Vor- und Nachteile bei den unterschiedlichen Lösungen.

Wer viel Rechenleistung benötigt, benutzt einen Micro Computer, z.B. aus der Raspberry Pi Familie: Empfehlenswert sind Raspberry Pi 3B, 3B+, 3A+, 4B oder Zero WH. Vorteile: Größte Rechenleistung, WLAN, Bluetooth, Tastatursteuerung, viele Sensoren, Kamera(!), PWM für Servomotoren. Als Programmiersprache wird Python mit dem sehr mächtigen Programm-Modul gpiozero genutzt. Ein preiswerter Motor Controller ist der MotoZero von ThePiHut im pHAT  (Pi Zero) - Format für vier Motoren. Und es gibt weitere Motor Controller auf Basis L293D. Man darf aber auch die Nachteile nicht verschweigen: Die RasPis benötigen ca. 1 min zum Booten von µSD-Karte und wollen unterbrechungsfrei exakt 5,0 bis 5,1 Volt.

Am unempfindlichsten bei der Stromversorgung sind die Arduino-kompatiblen Micro Controller mit den Atmel Prozessoren, z.B. unser Mikrocontroller Board mit ATmega328P, ATmega16U2, kompatibel mit Arduino UNO R3, für den es das passende Motortreiber-Shield gibt. Diese Kombination bietet weitere Anschlussmöglichkeiten für Sensoren, der Sketch wird in der Arduino IDE kompiliert und unser Robot Car ist nach dem Einschalten sofort einsatzbereit. Aufgrund fehlender WLAN-Fähigkeit bleibt uns allerdings diese Möglichkeit der Steuerung bei dieser ansonsten robusten und Einsteigerfreundlichen Variante vorenthalten. Aber Abhilfe schafft hier eine Funkfernsteuerung mit 433MHz oder 2,4GHz.

WLAN bringen die MCUs von Espressif von Haus aus mit: Egal ob ESP8266-12F oder ESP32, auch die Minis sind für unser Robot Car geeignet. Aber auch hier, wie bei den RasPis, sollte für eine stabile Spannungsversorgung ein DC-DC-Converter zum Einsatz kommen.  Denn z.B. zwei 18650 LiPo Akkus liefern 7,4 bis 8,4 V, 6 Mignon Akkus ca. 7,2 bis 7.5V, zu viel für unsere Micro Controller, auch wenn diese teilweise eingebaute Spannungsregler haben. (Diese sind meist für die internen 3,3 V).

Was brauchen wir noch? Sofern die Kabel für die Stromversorgung der Motoren noch nicht angelötet sind, benötigen wir dafür einen Lötkolben. Ansonsten sind alle Verbindungen geschraubt oder mit Jumperkabeln gesteckt. Für das Anbringen des Batteriefachs und einzelner Komponenten empfehle ich doppelseitiges Klebeband und selbstklebendes Klettband oder auch Kabelbinder.

 

In dieser allgemeinen Einführung möchte ich noch das Grundwissen über Gleichstrommotoren und Pulsweitenmodulation auffrischen.

Gleichstrommotoren haben zwei Anschlüsse für Plus und Minus. Dabei entscheidet die Polung über die Drehrichtung des Motors. Das Umpolen funktioniert dann mit der oben bereits erwähnten H-Brücke. Hier zunächst das Funktionsprinzip des Gleichstrommotors:

Bild aus Kampert/Scherbeck: Elektronik verstehen mit Raspberry Pi

Das linke Bild zeigt die gegensätzlichen Pole, die aufgrund der Lorentzkraft den Rotor in die waagerechte Position bewegen. Das mittlere Bild zeigt diese waagerechte Position, in der der Stromfluss unterbrochen wird, der Rotor sich aufgrund der Massenträgheit jedoch weiterbewegt. Kurz darauf berühren die Schleifer die anderen Kontakte des Kommutators (rechtes Bild). Das magnetische Feld des Rotors wird umgepolt, und die gleichen Pole stoßen sich nun ab. Die Drehung wird fortgesetzt.

Exemplarisch zeige ich hier das L293D-Motortreiber-Shield für Arduino Uno und kompatible Micro Controller, an dem bis zu 4 Motoren an den Schraubanschlüssen verbunden werden können. Wenn die Drehrichtung nicht passt – den jeweiligen Motoranschluss einfach umpolen. Im Bild unten links befinden sich die Schraubanschlüsse für die externe Spannungsversorgung. Über die Anschlüsse am Micro Controller braucht man sich keine Gedanken zu machen – einfach aufstecken und die Anschlussbelegung der Motoren für den Sketch im Datenblatt nachlesen. Gut zu erkennen ist auch der optionale Anschluss zweier Servomotoren links oben.


Alle Motortreiber-Boards mit dem L293D sind PWM-fähig. Diese elektronischen H-Brücken können also nicht nur die Drehrichtung ändern, sondern auch die Drehzahl der Motoren regeln.

PWM steht im deutschen für Pulsweiten-Modulation und im englischen für pulse width modulation (synonym ist auch PDM für Puls-Dauer-Modulation bzw. pulse duration modulation) und das bedeutet, dass wir anstelle einer konstanten Gleichspannung Pulse aussenden, also den Strom immer an- und abschalten. Das geschieht jedoch so schnell, dass wir es nicht sehen. Wie im Kino oder im Fernsehen, wo 24 bzw. 25 Bilder / Sekunde für unser Auge einen Film ergeben. Wie oft in einer Sekunde ein- und ausgeschaltet wird (die Frequenz, engl. „rate“ oder „frequency“), ist eine der Kenngrößen unserer PWM. Hier können wir die jeweiligen Voreinstellungen nutzen.

Die zweite Kenngröße ist das Verhältnis der Pulsdauer zur Gesamtdauer eines Zyklus, bestehend aus Puls + Pause. Diese Kenngröße nennt man Tastgrad (engl. „duty cycle“).


Was bedeutet das für unsere Gleichstrommotoren? Sie bekommen mit dem Puls die volle Spannung, während der Strom nur zeitanteilig gemäß dem Tastgrad fließt. Damit wird dem Motor weniger elektrische Energie zugeführt.

Die Programmierung ist recht einfach: Wir benutzen die Funktion analogWrite(), mit der Syntax analogWrite(pin, value), wobei pin die Pinnummer ist, ohne dass diese vorher als Ausgang definiert wird, und value eine Integerzahl zwischen 0 und 255 (bei 8 Bit PWM) ist, also z.B. 25% entspricht 63.

Nach Aufruf von analogWrite() generiert die Funktion eine stetige Rechteckwelle mit angegebenem Zyklus, bis der nächste Aufruf von analogWrite() (oder digitalRead() oder digitalWrite()) auf dem gleichen Pin erfolgt.

Weitere Einzelheiten finden Sie auf der Referenzseite von arduino.cc,
https://www.arduino.cc/reference/de/language/functions/analog-io/analogwrite/
wo ich folgenden Beispielcode kopiert habe, der vor allem interessant ist, weil die analoge Eingangsgröße eine 10-Bit-Auflösung (max. 1023) hat, während der Ausgangswert max. 255 sein darf.

Der Code setzt die Ausgabe auf dem LED-Pin 9 proportional (Faktor 4) zu dem Wert, der von einem Potentiometer an A3 gelesen wird. Die LED steht hier stellvertretend für unseren Motor.

int ledPin = 9; // LED auf Digitalpin 9 verbunden
int analogPin = 3; // Potentiometer auf Pin 3 verbunden
int val = 0; // Variable, um den gelesenen Wert zu speichern 
void setup() {
  pinMode(ledPin, OUTPUT); // Setzt den Pin als output.

void loop() {
  val = analogRead(analogPin); // Liest den Wert vom Pin ein
  analogWrite(ledPin, val / 4);  // analogRead: Werte von 0 bis 1023,
                                                //analogWrite: Werte von 0 bis 255

Fast genauso einfach ist das Ganze in der Programmiersprache Python am Raspberry Pi, zumindest, wenn man das Modul gpiozero verwendet. Das wird in einem späteren Blog-Beitrag gezeigt.

 

Ich hoffe, ich habe Ihre Neugier geweckt und Sie folgen uns in den nächsten Wochen, wenn das Bloggerteam unterschiedliche Schwerpunkte bei der Steuerung und Regelung von Robot Cars zeigen wird.

3 Kommentare

Guido Jensen

Guido Jensen

Cooles Project, werds jetzt doch mal probieren.

UND…ist das DER Walter Goegebeur :-)) ?

Guido

Volkert Braren

Volkert Braren

Vernünftig funktionierende Stützrollen hab ich noch nicht gefunden. An Teppichen und kleinen Stufen bleiben die gern hängen. Stattdessen setze ich ein Servo mit kleiner Möbelrolle ein. Steuerung mit der Motorsteuerung synchronisiert.
Geradeauslauf verbessern mit Tachorädern an den Motorachsen.
Grüße, Volkert

Walter Goegebeur

Walter Goegebeur

Darauf freue ich mich sehr. Es ist super das Sie sich um aktuelle Themen kümmern und uns mit Denkanstöße fördern und das für günstige Preise. Vielen Dank.

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert