Wer kennt es nicht? Man hat gerade Leerlauf und Lust auf ein lustiges Projektchen, nicht um die Welt zu retten, sondern einfach Spaß haben. Genau dafür ist Kampfroboter basteln! In dieser Anleitung erfährst du wie du ein per WLAN steuerbaren Mini-Kampfroboter bastelst. Am besten überzeugst du deine Freunde sich auch einen zu basteln, damit ihr eure Roboter gegeneinander antreten lassen könnt.
Der Bau des Battlebots teilt sich in folgende grundsätzliche Schritte auf:
Inhalt
Vorbereitung
Eine gewisse Grundausstattung an Werkzeugen brauchst du für dieses Projekt, jedoch nichts was über die übliche Hobbyausstattung hinausgeht:
Erforderliches Werkzeug (Mindestanforderungen):
- Lötkolben
- Multimeter
- Ein Satz Präzisionsschraubenzieher
- Knipszange
Erforderliche Bauteile:
- Zwei SG90 Servo-Motoren
- Ein ESP8266 (WemosD1 Boardform)
- Ein LiPo Akkumulator 200-800 mA
- Ein Step-Up MT3608
- Vier 1 kΩ Widerstände
- Ein 220 Ω Widerstand
- Ein 100 kΩ Widerstand
- Eine LED
- Draht
- Einen Schalter
Prinzipiell lassen sich diese Schritte in beliebiger Reihenfolge bearbeiten, mit Ausnahme der letzten beiden. Es empfiehlt sich allerdings mit dem Servo-Hacking zu beginnen, das ist ein frickeliger Schritt, den man am besten schnell hinter sich bringt.
Servo-Hacking
Ein Servomotor ist vereinfacht gesagt ein Elektromotor, dessen Winkelposition bestimmbar und einstellbar ist. Diese Eigenschaft ist sehr nützlich, wenn man beispielsweise bei Modellflugzeugen den Anstellwinkel von Flügeln oder die Position der Landeklappen genau steuern möchte.
In der Mikroelektronik werden gerne die sogenannten „SG90“ Mikroservomotoren verwendet, da sie sehr günstig sind und problemlos direkt über einen Mikrokontroller steuerbar sind (größere Motoren ziehen zu viel Strom und lassen sich nicht ohne weiteres direkt von einem Arduino o.ä kontrollieren). Die Zusatzbezeichnung 9g bezieht sich leider nicht auf die Beschleunigung die der Servomotor erreichen kann, sondern auf seine Masse, nämlich 9 gramm. Der SG90 kann eine Position zwischen 0 und 180° einnehmen. Ein Servomotor ist als Antrieb für Battlebots erstmal also nicht hilfreich, da das Rad somit nur eine halbe Umdrehung vorwärts und eine halbe Umdrehung rückwärts machen könnte.
Der Servomotor kann aber gehackt werden. Vereinfacht gesagt wird dem Servomotor vorgegaukelt, dass er sich permanent in der gleichen Position befindet, z.B. 90°. Dann wird ihm aufgetragen sich z.B. zu 150° bewegen. Der Servomotor dreht sich und dreht sich um die 150° zu erreichen, und hält nicht an, da er denkt er befindet sich immer noch auf der 90°. So macht man aus einem 180° Servomotor, einen Motor der eine kontinuierliche 360° Bewegung ausführen kann und damit bestens geeignet ist den Battlebot anzutreiben.
Wie passiert das konkret? Der Servomotor bestimmt seine Winkelposition über ein sogenanntes Potentiometer. Das Potentiometer ist im Grunde ein Gesamtwiderstand der sich variabel in zwei Einzelwiderstände aufteilen lässt. Je nach Motorposition ergibt sich eine unterschiedliche Verteilung der zwei Einzelwiderstände, die dann erfasst wird und in eine Gradzahl/Position umgerechnet wird. Der Hack besteht darin dieses Potentiometer herauszulöten und durch zwei einfache Einzelwiderstände zu ersetzen. Da die Verteilung der Widerstände so immer gleichbleibt, denkt das Potentiometer somit, dass es sich immer auf der gleichen Position befindet und meldet dementsprechend immer die gleiche Gradzahl/Position an die Steuerung.
- Zunächst muss der Servomotor aufschraubt werden. Die vier kleinen Schrauben an der Hinterseite des Servos gilt es zu lösen und herauszunehmen. Damit kann das Vorderteil des Servos abgenommen werden und das Zahnradgetriebe wird freigelegt. Die Zahnräder müssen abgenommen werden, am besten legt man sie so auf den Tisch, dass man sie später wieder problemlos in der richtigen Reihenfolge aufsetzen kann.
- Einige ältere Varianten der SG90 besitzen zusätzlich einen mechanischen Stopper am zweiten Zahnrad. Dieser Stopper verhindert eine 360° Drehung und muss entfernt werden. Das macht man am besten einfach vorsichtig mit einem Cuttermesser.
- Wenn der Motor und das kleine Board des Servos komplett freigelegt sind, kann das Potentiometer herausgelötet werden. Hier hängt von der eigenen Präferenz ab, wie man vorgehen kann. Eine Methode ist, dass Lötzinn zu erhitzen und die Potentiometer-Beine abwechseln immer wieder etwas rausruckeln und ziehen, bis es raus ist. Hier lohnt es sich die Beine vorher abzuknipsen, das vereinfacht die Sache. Alternativ kann man das Lötzinn absaugen, wenn eine Absaugepumpe zur Verfügung steht. Wenn das Lötzinn erst mal weg ist, lässt sich das Potentiometer sehr leicht rausnehmen.
- An Stelle des Potentiometers sollen nun zwei gleiche Widerstände (zwischen 1 kΩ und 10 kΩ) eingelötet werden. Wie groß die Widerstände genau sind ist nicht wichtig, am Wichtigsten ist, dass sie möglichst gleiche Werte haben. Es empfiehlt sich die Widerstände noch einmal zu messen vor dem Einbau, da auch Widerstände gleicher Größe natürlich durch Fertigungstoleranzen voneinander abweichen können.
- Spätestens hier lohnt es sich das Lötzinn in den Löchern des kleinen Servo-Boards abzusaugen, damit die Widerstände zum Verlöten entspannt eingesetzt werden können. Es geht aber mit etwas Mühe auch ohne. Die Widerstände und ihre Drähte sollten natürlich keine anderen Bauteile berühren. Die Drähte die unten herausragen werden abgeknipst.
- Der Servomotor kann anschließend wieder zusammengebaut werden.
3D-Druck des Gehäuses und der Räder
Die Einzelteile des Battlebots sind bereits vorkonstruiert und müssen nur auf einem beliebigen FDM 3D-Drucker ausgedruckt werden. Die files sind auf Thingiverse https://www.thingiverse.com/thing:4888287 zu finden. Natürlich kann die Optik auch noch angepasst werden und zusätzliche Dekorationselemente entwickelt und gedruckt werden.
Für die slicing-Einstellungen reichen Standardeinstellungen – der Druck ist nicht anspruchsvoll. Es empfiehlt sich ein Standardprofil des präferierten Slicers zu nehmen. Die Elemente „Body“ und „Lid“ können flach auf der Druckplatte angeordnet werden. Stützstrukturen, der sogenannte Support, kann bei den Aussparungen für die Servomotoren gesetzt werden. Jedoch kann man auch darauf verzichten, wenn man Vertrauen in die „bridging“-Fähigkeiten seines 3D-Druckers hat. Der Rest der Konstruktion ist ohnehin 3D-Druck gerecht gestaltet und hat keine Überhänge, die sich schwer drucken lassen.
Ein paar Eckeinstellungen
- Schichthöhe 0.2 mm
- Infill 20%
- 3 Wandstärken
- Geschwindigkeit 50mm/s
- PLA oder PETG
Auch die Räder besitzen eine flache Seite, für die Auflage auf der Druckplatte ohne Stützstrukturen. Bei den Rädern gibt es eine Besonderheit. Für den maximalen Grip ist es wichtig, dass die Räder eine möglichst gummiartige Oberfläche haben. Dazu gibt es prinzipiell zwei mögliche Lösungen: Silikon oder TPU-Filament. Ambitionierte Bastler, die vor Silikonguss nicht zurückschrecken, können die innere Radstruktur in einen einhüllenden Silikonmantel gießen. Eine wesentlich sauberere, stressfreie Variante ist es einen Radmantel mit flexiblem Filament (TPU) zu drucken und über das starre Rad zu stülpen.
Zusammenlöten der Komponenten
Für den Battlebot braucht man folgende grundsätzliche Komponenten:
- Ein Akkumulator
- Ein Laderegler für den Akkumulator(optional)
- Eine Steuerung
- Ein sogenannter Step-Up
- Kleinteile wie Draht, ein Schalter, eine LED, Widerstände
Der Akkumulator.
Der Akkumulator ist ein sogenannter LiPo – ein Lithium-Polymer Akkumulator. Das „Polymer“ beschreibt den Elektrolyten, denn anstelle eines flüssigen Elektrolyten wird hier ein fester Polymerelektrolyt verwendet. Diese Beschreibung ist leicht irreführend. Der Polymerelektrolyt ist eine Folie und kann besonders kompakt in beliebiger Form gewickelt werden. Diese Art Akkumulatoren sind daher im Modellbau besonders beliebt, da sie eine hohe Energiedichte erreichen können und schnell geladen werden können.
Ein Laderegler.
Ein Akkumulator kann nicht beliebig geladen werden, sondern immer nur innerhalb eines gewissen Spannungsfensters. Ein Unter- oder Überschreiten der zulässigen Spannung schädigt den Akku und führt im Zweifelsfall zu einem thermischen Durchgehen, inklusive Flammen, oder anderen unangenehmen Dingen. Ein Laderegler unterbricht z.B. den Ladevorgang beim Erreichen der maximalen Spannung. Warum ist der Laderegler dann optional, wenn er doch so wichtig ist? Wenn man ein spezielles LiPo-Ladegerät besitzt, kann man den Akkumulator auch außerhalb des Battlebots laden und dann frisch geladen wieder einsetzen.
Die Steuerung.
Für die Steuerung muss ein Mikrokontroller her: ein Minicomputer auf einem einzigen Chip, wie z.B. der bekannte und beliebte Arduino. Ein Arduino ist für diese Aufgabe jedoch überdimensioniert. Zudem muss der Battlebot ja ferngesteuert werden, z.B. über W-LAN. Die Lösung ist ein sogenannter ESP8266, ein sehr kleiner, günstiger, W-LAN fähiger Mikrokontroller. Dieser hat verschiedene Pins (Anschlussmöglichkeiten, die Eingänge oder Ausgänge zu dem Mikrokontroller darstellen). Diese Pins haben z.T. bereits festgelegte Funktionen – die verschiedenen Pinbezeichnungen sind auf der Platine neben den Pins aufgedruckt.
Die ESP8266 gibt es vielen verschiedenen Ausführungen, daher soll man sich nicht wundern wenn der eigene ESP8266 nicht genau so aussieht und unterschiedliche Pins hat. Für dieses Projekt ist die sogenannte “WemosD1 Boardform” anzuempfehlen, da sie besonders kompakt ist.
Der Step-up
Der Step-Up ist ein Spannungsbooster, der eine Gleichspannung erhöhen kann. Um die Notwendigkeit des Step-Up zu verstehen, muss man in die unterschiedlichen Spannungsbereiche der Komponenten schauen. Für die Servomotoren wird ein Betriebsspannung zwischen 4.8 V bis 6 V empfohlen. Der LiPo-Akku liefert jedoch im vollgeladenen Zustand nur 4.2 V und mit sinkendem Ladezustand sinkt auch die gelieferte Spannung. Der ESP8266 muss mit 5V betrieben werden. So oder so muss die LiPo-Eingangsspannung auf jeden Fall erhöht werden.
Grundsätzliches Schaltungsschema vor Step-up
Um die Schaltung einfacher zu verstehen, ist es besser sie getrennt zu betrachten – der Teil vor dem Step-Up und der Teil nach der Schaltung. Zunächst den Teil vor der der Schaltung:
Im Endeffekt wird der LiPo an den Step-Up Eingang angeschlossen. Der Stromkreis vom LiPo Pluspol zum Plus-Eingang wird aber durch den Schalter unterbrochen um den LiPo über den Schalter zuzuschalten oder zu trennen. Parallel zum LiPo wird die Statusanzeige (Widerstand + LED) angebracht. Wenn der Stromkreis geschlossen wird, fließt parallel ein Strom über die LED, die aufleuchtet und anzeigt, dass der LiPo angeschlossen ist. Der Widerstand schützt die LED vor zu hohen Strömen.
Bei dem Step-Up ist eine Sache wichtig zu beachten: Er hat bereits einen vorher eingestellten, unbekannten Spannungoutput. Daher ist es sinnvoll am Anfang erst einmal zu schauen, welchen Spannungsboost er hervorruft, und zwar ohne, dass Bauteile an der Ausgangsseite angeschlossen sind. Die Messung kann ganz einfach über ein Multimeter (eingestellt für Gleichspannung, in der Größenordnung bis 24 V) gemacht werden. Dafür wird der Schalter umgelegt und der Ausgang des Step-up gemessen. In dem Beispiel ist hier eine Outputspannung von 15V eingestellt. Wenn man diese aus Versehen auf ein Bauteil gibt, das dafür nicht ausgelegt ist, ist das nicht so gut.
Die Outputspannung wird dann Drehen der Schraube an dem großen blauen Bauteil justiert, bis 5,5 V erreicht werden. Diese Outputspannung ist an kein Übersetzungsverhältnis gekoppelt, sondern wird auch bei sinkender Akkuspannung konstant bleiben. Warum 5,5 V, wenn doch der ESP8266 5V braucht und die Servos zwischen 4,8 und 6? Es ist wie so oft im Leben ein Kompromiss. Einen zweiten Step-up einzubauen um einmal 5V für den ESP8266 und 6 V für die Servos zu generieren ist „over-the-top“. 5.5V ist ein guter Kompromiss um beide anzutreiben – der Mikrokontroller hält es noch aus und die Servomotoren haben genug Saft.
Grundsätzliches Schaltungsschema nach Step-Up
Die abgebildeten Komponenten müssen einfach dem Schaltschema entsprechend verlötet werden. Ob man mit Pins arbeitet oder ganz klassisch verlötet, ist egal, Hauptsache die Verbindungen sitzen. Da es im Kampfroboter vom Platz her auch ziemlich eng wird, solltet ihr alle offenen Drähte abisolieren, damit kein Kurzschluss entsteht.
Flashen des Codes
Kommen wir nun zum coolsten Teil der Programmierung des kleinen Roboters. Kennt ihr Arduino und habt schon ein wenig Erfahrung in C/C++? Dann könnt ihr euch auch überlegen, das was jetzt kommt einfach zu überspringen und den fertigen Code als Grundlage für eure eigene und wahrscheinlich schönere Firmware nehmen. Falls ihr euch noch nicht mit dem Programmieren auskennt, ist dieses Projekt für den moderaten Einstieg geeignet und hilft hoffentlich beim Einarbeiten. Erst einmal müsst ihr euch die Programmierumgebung von Arduino installieren. Diese Programmierumgebung nennt sich Arduino IDE. Nehmt die Version 1.8.xx nicht die Version 2, da diese sehr neu ist und noch nicht mit so vielen verschiedenen Mikrocontrollern kompatibel ist.
Nach dem Installieren müsst ihr in eurem Arduino-Ordner (in der Regel unter Eigene Dateien/Arduino/) einen Ordner mit dem Namen “tools” anlegen. Anschließend müsst ihr den Arduino ESP8266 Filesystem Uploader in den Ordner “tool” entpacken. Damit könnt ihr einfach die Website, die wir später verwenden, in den Speicher eures ESP 8266 laden.
Damit das Programm aber funktioniert und ihr den ESP 8266, das ist euer WeMosD1R1 Bord, programmieren könnt, sind noch ein paar weitere Schritte erforderlich. Ihr braucht noch die Programmbibliothek für das Bord selbst. Dafür fügt ihr nach dem Starten von Eurer Arduino IDE unter dem Punkt Datei → Voreinstellungen → Zusätzliche Bordverwalter-URLs diese URL ein: https://arduino.esp8266.com/stable/package_esp8266com_index.json . Jetzt geht ihr auf den Reiter Werkzeuge → Bord → Bordverwalter und sucht da ESP und installiert die entsprechende Bibliothek. Im Anschluss könnt ihr den WeMosD1R1 unter den Bords finden und auswählen. Lasst alle Einstellungen, die jetzt zu sehen sind, unverändert.
Soeben haben wir eine Bibliothek mit externem Programmcode eingebunden, die unser eigenes Programm nun benutzen kann. Allgemein funktioniert das Einbinden von Bibliotheken wie folgt: Die beliebtesten Bibliotheken könnt ihr einfach über Sketch->Bibliothek einbinden-> Bibliothek verwalten… einbinden. Wenn ihr eure Bibliothek dort nicht findet, müsst ihr googeln und einfach den Link wieder unter Datei-> Voreinstellungen -> Zusätzliche Bordverwalter-URLs einfügen. Und voilá, nun findet ihr eure Bibliothek bei der Suche über Bibliothek verwalten… Alternativ könnt ihr die Bibliothek auch als ma,e_der_bibliothek.zip herunterladen und über die Bibliotheksverwaltung einbinden (ihr dürft die Bibliothek nicht entpacken!). Als letzte Alternative könnt ihr die selbst entpackte Bibliothek auch in eurem Arduino-Ordner direkt in den Ordner “libraries” packen (in diesem Fall müsst ihr die Arduino IDE neu starten) und ihr habt das gleiche Ergebnis.
Seid ihr so weit und habt das Programm, welches ihr über den Thingiverse-Link von oben mit euren STLs geladen habt, kompiliert, dann könnt ihr es auf euren Mikrocontroller überspielen. Wenn ihr euch nun mit dem WLAN verbindet, das der ESP8266 aufspannt, werdet ihr feststellen, dass auf der Seite 192.168.4.1 noch nichts zu sehen ist. Das liegt daran, dass noch keine Website im Speicher des Microcontrollers liegt. Um das zu ändern müsst ihr einfach auf ESP8266 Sketch Data Upload in dem Reiter Werkzeug in der Arduino IDE klicken und schon wird alles, was im Sketchordner in dem Unterordner “data” liegt, auf den Microcontroller geschoben. Das dauert einen Moment. Wenn wir jetzt unseren seriellen Monitor öffnen (nicht vorher, sonst ist der Port belegt und wir können nichts hochladen), sollten wir auch sehen, dass das SPIFFS erfolgreich eingehängt wurde. Wenn wir uns jetzt wieder mit dem Netzwerk verbinden und die Website 192.168.4.1 aufrufen, sehen wir die Website die wir im Ordner “data” hinterlegt haben (diese Website wird auch im C Code aufgerufen).
Wenn jetzt eure Servomotoren schon drehen, ohne dass ihr etwas ansteuert, liegt das daran, dass der Nullpunkt der Servos nicht ganz sauber definiert ist. Anders als zu erwarten liegt dieser nicht bei 0°, sondern bei 90°, da Servomotoren sich in einem Bereich von 0° bis 180° ansteuern lassen. Durch unseren Mod haben wir die Winkelbegrenzung der Servos ausgehebelt und wir können jetzt mit den Abstufungen von 90+X und 90-X die Geschwindigkeit und die Drehrichtung vorgeben. Zum Beispiel beschreiben 120° eine moderate Geschwindigkeit in positiver Drehrichtung, während 70° eine etwas langsamere Geschwindigkeit in umgekehrter, negativer Drehrichtung hervorrufen. Das Programm, das wir über die Arduino IDE auf unseren Microcontroller übertragen haben, macht genau das Gleiche. Um auszuprobieren wo genau unser Nullpunkt liegt, können wir einfach schnell folgendes Programm auf dem Mircocontroller ausführen:
#include <Servo.h>
Servo servoA;
//wemos D1 Mini
//D1 ist 5
//D2 ist 4
//D3 ist 0
//D4 ist 2
int servo_pin = 2; // pin fuer servo hier D4 da 2 eingetragen
int posi = 90; // servo mittelstellung
void setup() {
servoA.attach(servo_pin);
Serial.begin(115200);
servoA.write(posi);
Serial.println("Geschaetzten Nullwert eingeben ca. 80-100, mit Enter bestaetigen");
}
void loop() {
while (Serial.available()){
String in_char = Serial.readStringUntil('\n');
Serial.print("Wert: ");
Serial.print(in_char);
servoA.write(in_char.toInt());
delay(200);
}
}
Damit können wir den Nullpunkt der angeschlossenen Servomotoren bestimmen und in unserem anderen Code eintragen. Unsere Website kann dabei die ganze Zeit im SPIFFS bleiben. Solange wir sie nicht in unserem Code aufrufen, liegt sie da nur herum. Wenn wir die Nullpunkte gefunden haben (typischerweise liegen diese im Bereich von 90°+-10°), sollte unser kleiner Bot dann auch ohne Eingaben keine Bewegung machen. Sollte er nach einiger Zeit doch ein wenig zucken, liegt das daran, dass er etwas warm geworden ist und sich dadurch der Widerstand der Spannungsteiler ändert. Gleiches gilt natürlich auch, wenn es draußen super heiß ist 😉 Happy Pushing and have FUN!