LeoBot, der alternative Weihnachts-Kalender 2013
von Heinz D.
Learning by doing! (Für jedes Kapitel werden 2 Tage empfohlen)
Diese
Seiten sind für Schüler, Jugendliche und jung gebliebene. Sie sind als
Arbeitsblätter gedacht und sollen einen roten Faden bieten, an dem man
sich durch die Materie arbeitet. Bewusst wurde auf 1-Wire (Dallas),
2-Wire (I2C) und 3-Wire-Sensoren verzichtet, um kein geschlossenes
unflexibles System a la Kleinweich oder Apfel zu bilden.
Zum
Programmieren wird Bascom 2.0.7.5 - Demo (ISP) und
Arduino-1.0.4-windows (USB) benutzt, jedoch keine Kenntnisse
vorausgesetzt (nur benutzt). Als Hardware kommt meist ein Atmega
8 zum Einsatz und ist damit zum Arduino 100% kompatibel.
Das
Ziel ist das Bauen, das Programmieren und das Lösen von Aufgaben mit
einer universellen (preisgünstigen) Plattform. Das dabei mehrere
verschiedene LeoBot's gebaut werden ist durchaus erwünscht. Dann kann
auch koordiniertes Verhalten programmiert werden.
Bevor man
anfängt, sollte man eine Port-Map anlegen, um bei späteren
Erweiterungen nicht alles wieder ändern zu müssen. Der Ur-Arduino war
ein Atmega8 (nicht 88 !), deshalb ist es nicht verwunderlich, dass die
Pin-Belegung mit einem Leonardo kompatibel ist.
PORTMAP:
4 digitale Eingänge für Stoßstange vorn und hinten (D0-D3)
4 digitale Ausgänge für LED und Aktuatoren (D4-D7)
3 Servo-Ausgänge für die Fahrmotoren und Aktuatoren (D9-D11)
6 ADC-Eingänge für analoge Sensoren, LDR, IR, RGB, Mic (A0-A5)
2 Ultaschall-Port 1x-Out (US-Puls=Led13), 2x-In (US-Echo=D8+D12)
Im
Bild sind die grünen Felder zum Anschluss des
RS232-(FTDI-)Breakout-Board (Paperduino) oder zum Anschluss eines
PL2303-Handyadapter. Die lachsfarbenen Felder bezeichnen die
ISP-Anschlüsse.
Um es noch einmal deutlich zu sagen: diese
Seiten sollen Ihre Kreativität verstärken und sind NICHT als fertig an
zu sehen und NICHT als Komplettanleitung zu verstehen! Und sollen die
Zeit bis Weihnachten verkürzen.
1 Das Fahrwerk2 ist im Wesentlichen mit LeoBot-1 zu vergleichen, nur dass alles etwas größer ist.
521027 Strapubox (als Chassis)
209035 Servo S325HB oder 233751 Servo RS2
70504
Lego rot (oder 70005 Lego schwarz, im Angebot ab ~30€, enthalten je 2
Paar Gummiketten) ein paar kleine Schrauben mit Plastikgewinde aus
defekten Radios, Anrufbeantwortern usw.
Der
Umbau der Servos gestaltet sich genau so, wie beim LeoBot-1. Platine
vorsichtig herausziehen, Clipse vom Poti lösen, ggf. Motor ablöten,
Poti nach außen verlegen oder besser 1k2+1k2 (RS2) 2k2+2k2 (S325HB)
als Spannungsteiler anlöten), mechanische Sperre abschneiden/dremeln.
Die
Schrauben aus einem kaputten Radiowecker passten genau durch das
Kettenrad in den Servo hinein. Spannen Sie die Ketten nicht so stark,
um die Servos nicht zu sehr zu belasten.
Die
obere Fahrwerkshälfte ist aus einer Legoplatte gedremelt (9x16 oder
10x16) und vorn und hinten abgewinkelt (Heißklebe). Die Komponenten
können später 'umgeknöpft' werden.
2 Die Kollisions-Sensoren mit Cherry Mikroschaltern
703673 Mikroschalter Cherry (sie lösen an der Rolle bei ~10 Gramm aus)
Batteriekasten 4xAA für Akkus 4,8V
1N4001..1N4007; falls Sie mit 4x1,5V=6V speisen wollen, MÜSSEN Sie 0,7V mit der Si-Diode in Reihe vernichten !!!
4x LED (Rot/Grün/Blau/gelb/weiß o.ä.)
6x 390R-470R Widerstände
Für
die Stoßstangen werden Mikroschalter verwendet. Um auch
Frontalberührungen zu detektieren, werden die Schalter mit einer
Stoßstange verbunden. Die Taster werden 'Servo-kompatibel'
angeschlossen. Die Pin-Folge ist: GND/schwarz, +5V/rot und Signal/gelb
(wie die deutsche Flagge)
Die
Taster werden wegen der Pullup-Widerstände zwischen GND und Signal
angeschlossen (und sind damit verdrehsicher). Die Ausgänge des
Mega8/Leonardo sind NICHT kurzschlussfest! Zur Sicherheit sollten Sie
je einen ~470R in Reihe schalten. Zwei weitere Schalter können die
hintere Stoßstange bilden. Die digitalen In-Anschlüsse arbeiten mit
invertierter Logik wegen der Pullup-Widerstände. Viele Sensoren können
dadurch 2-polig ohne eigene zusätzliche Pullup-Widerstände
angeschlossen werden.
Die
Led's werden ebenfalls 'Servo-kompatibel' angeschlossen.
(K=Kathode=kurzer Draht) Also in Reihe mit ihren Vorwiderständen
zwischen Gnd und Signal. Wird der Stecker verdreht aufgesteckt, wird
die Led nicht leuchten. Als Vorwiderstände/Schutzwiderstände sollten
Sie 470R (oder grösser) wählen. Die LED an den Seiten sind hinten=rot,
rechts=grün, vorn=blau und links=gelb. Sie können einzeln geschaltet
werden.
Die Befestigung ist kein Muss, sondern soll nur eine
Idee sein und bietet etwas Flexibilität. (je 2Stück
1x3-Knopf-3-Höheneinheiten)
3 Die Mega8 Platine (Arduino-kompatibel)Eine
ernst gemeinte Warnung: kein AVR/Arduino ist gegen Kurzschluss und
Überlastung geschützt! Während unserer Entwicklung sind einige
Halbleiter das Opfer von Unachtsamkeit geworden! Also bitte schauen Sie
dreimal hin und kontrollieren Sie noch einmal! Achten Sie auf eine
saubere Unterlage und entfernen Sie Metalle, Schlüssel usw.!
Mega8, Lochraster-Platine, 1mm Stifte, Draht usw.
Der
ATmega8 kann unter Bascom laufen, oder mit dem Arduino-Bootlader unter
C. Mit dem Bootlader benötigen Sie außerdem
ein RS232-(FTDI-)Breakout-Board oder PL2303. (Bitte im Netz unter
Paperduino recherchieren.)
Sie können ein 'altes'
Handyprogrammierkabel (hier mit PL2303) umbauen. Sie müssen nur die
Anschlüsse: DTR, Tx, Rx, +5V und Gnd finden und auf eine 6-pol-Buche
verdrahten.
Der
Ur-Arduino war ein Atmega8 (nicht 88), deshalb ist es nicht
verwunderlich, dass die Pin-Belegung mit einem Leonardo kompatibel ist.
Für den Mega8 gibt es im Ordner:
'..arduino-1.0.5\hardware\arduino\bootloaders\atmega8' den Bootlader:
'ATmegaBOOT-prod-firmware-2009-11-07.hex'
Für Bascom benötigen Sie einen Programmer (z.B. USBASP ab ~5€ oder STK500 kompatibel ab ~16€).
Alle
Anschlüsse sind auf 3-pol. Servo-kompatible Stifte geführt. Dadurch
kann später ohne löten schnell etwas ausprobiert werden. Der
Reset-Anschluss hat einen 100nF Koppelkondensator, um bei DTR=0 zum
Arduino-Bootlader zu wechseln. NUR AN DIESEM ANSCHLUSS WIRD DIE
BATTERIE ANGESCHLOSSEN! (!!! ACHTUNG Verpolungsgefahr!!!).
Der Quarz muss nur für den Bootlader bestückt werden (!!! ACHTUNG FUSE richtig setzen !!!).
Die
Reset-Taste muss nicht, sollte jedoch bestückt werden. Die zusätzlichen
Led's und Tasten wurden nur für den Prototyp benötigt und können
fehlen.
Die Led13 (mit ~2k Vorwiderstand) an Pin B.5 sollten
Sie bei Gelegenheit bestücken. Der Vorwiderstand sollte so hoch wie
möglich gewählt werden, weil hier ggf. noch andere Ausgaben (US)
angeschlossen werden. Im Lochrasterplan ist Led13 noch nicht, weil sie
sich erst spät als sehr nützlich erwiesen hat.
(Befestigung des M8 mit 2x 1x2-Knopf 3-Höheneinheiten, ggf. 1x3- oder 1x4-Knopf)
4 TPR - Tasten-Programmierbarer-Roboter
TPR-Befehle
Eine
Intention war, die Programmierung mit den Stoßstangen-Tasten
durchzuführen, um langfristig von Kindern ohne Aufsicht und ohne PC
genutzt werden zu können. In Anlehnung an die TPS von Herrn Kainka
wurde die TPR für Roboter entwickelt. Manches ist gleich, für die
Roboter-Programmierung sind jedoch etwas komplexere Befehle
erforderlich, um den Code nicht zu lang werden zu lassen.
Falls Sie sich noch nie mit TPS beschäftigt haben, sollen sie unbedingt die Arkel über "
Die Tastenprogrammierbare Steuerung" lesen.
Eine
'Programmiersprache' (für Roboter) benötigt Befehle für: die
Eingaben/Sensoren usw., die Verarbeitung, die Ausgaben/Motor/Led usw.,
die unbedingten Programabläufe und die bedingten
Programabläufe/Verzweigungen/Entscheidungen. Neu sind die relativen
Sprünge (Jr=Jump relativ) um +7 bis -8 Schritte (kurze Distanz) und für
längere Distanzen wird HL (H=High, L=Low) mit der Zieladresse geladen
und mit Jp HL gesprungen.
Für die bedingten kurzen Sprünge (Jr
D wenn ..) muss D (=Distanz) geladen werden, um anschließend je nach
dem Ergebnis der Entscheidung (A=<> .. -> ja/nein) zu springen
(ja) oder den nächsten Befehl (nein) auszuführen.
Der Befehl
Jp HL wenn .. funktioniert genauso, nur das vorher HL mit der
Sprungziel-Adresse geladen werden muss. Sämtliche Register (A, B, D, H,
L) behalten ihre Werte solange bis sie neu geladen werden. Ggf. muss D,
H oder L nicht immer neu geladen werden.
Die Programmierung
wird mit den Tasten TL+TR (Stoßstange) und den vier LEDs am Out-Port
vorgenommen. Während die Adresse kurz angezeigt wird ist die Led13 aus.
Beim ersten Nibble (X) leuchtet die Led13. Beim Daten-Nibble (Y) ist
die Led13 aus.
Anhand der Beispiele können Sie die Handhabung
erlernen. Versuchen Sie jeden Programmschritt einzeln zu analysieren
und sich die Registerinhalte aufzuschreiben.
Download:
13LB-TPR-bas-hex.zipDas
Programm ist in 4 kB gequetscht (für Bascom-Demo) und daher nicht gut
lesbar. Sie müssen das .bas nicht verstehen, Sie können das .hex
flashen und loslegen. Falls Ihre Motoren nicht stillstehen stellen Sie
die Potis ein. Falls Sie die Poti's durch einen festen Spannungsteiler
ersetzt haben, dann können Sie die Zahl hinter '$crystal =' solange
vergrößern/verkleinern, bis die Motoren stillstehen (neu kompilieren
nicht vergessen). Im .zip-File sind deshalb TPR-m8v1-7575kHz, welches
mit unseren Servos funktioniert und TPR-m8v1-8000kHz, das mit 8 MHz
(ggf. mit Quarz) funktioniert.
TPR-Beispiele
Steht
dieses Beispiel im EEPROM, dann kann nach dem Einschalten zwischen
Kollision (TL) oder Linienfolger (TR) gewählt werden. Versuchen Sie zu
ergründen, warum mit TasteL nach 'Adresse 10' gesprungen wird, bzw. mit
TasteR nach 'Adresse 20' und das jeweilige Programm in einer Schleife
bis zum Reset ausgeführt wird.
P.S.
Sie müssen keinen
LeoBot bauen. Sie können natürlich das TPR benutzen, um andere/eigene
Standalone-/Steuer-Anwendungen zu programmieren.
TPR-ProgrammierungEine
(jede) Programmiersprache besteht aus 'Befehlen' für die Eingabe (der
'Daten'), Verarbeitung (der 'Daten'), Ausgabe (der 'Daten') und denen,
die den Programmablauf steuern/ändern können. Nach Reset beginnt die
Programmausführung an der Adresse '00'. Außerdem lernt jeder
Programmierer, das ein Programm enden muss und nicht wahllos irgend
welche (unsinnigen) Befehle ausführt. Die Eingabe-Daten sind beim
LeoBot Sensordaten oder konstante Werte. Die Verarbeitung geschieht in
den Registern A/B. Die Ausgabe der Daten (oder Konstanten) erfolgt auf
die Motoren/Led usw.
Die
Daten werden nur ein einziges Mal geholt und angezeigt. Meist wünscht
man sich eine permanente Abfrage und Ausgabe. Um die Befehle immer
wieder auszuführen sind die Sprünge geeignet. Für kurze Distanzen
genügt Jr +8 bis -7 (Jump relativ, gerechnet wird von der aktuellen
Position =0 an.) Deswegen ist der Halt-Befehl identisch mit Jr 0.
Damit
haben wir die Verarbeitung realisiert. Bis hier hätten wir das auch mit
einer geschickten Verdrahtung geschafft. Damit der Programmablauf in
Abhängigkeit der Eingangsdaten beeinflusst werden kann, gibt es noch
die 'bedingten Verzweigungen'. Durch die 4-Bit-Verarbeitung sind
mindestens zwei Befehle erforderlich: laden der Sprung-Distanz
(-Adresse) und springen in Abhängigkeit vom Ergebnis des Vergleichs
A=<>...
Mit
dem Jp HL (springe nach Adresse in HL (H=High, L=Low)) ist zwar ein
weiterer Ladebefehl erforderlich, es kann jedoch jede Adresse das
Sprungziel sein.
Sämtliche
mögliche Kombinationen können nicht dargestellt werden. Sie sollten die
Beispiele analysieren und notieren, wie sich die Registerinhalte
ändern. Dann werden Sie schnell dahinter kommen was geschehen wird,
bzw. weswegen etwas erforderlich ist.
5 Der Linienfolger
[13LB05-Linie.jpg]
1 Led (z.B. weiß)
2 LDR (z.B. Pollin 120780)
Eine
typische aber langweilige Anwendung ist der Linienfolger. Man malt eine
schwarze Linie auf den (Fabrik-) Boden und der Roboter soll an der
Linie entlang fahren (um Ersatzteile zu bringen).
Die
Linie wird von einer Led beleuchtet und zwei Sensoren sollen jede
Abweichung nach links oder rechts melden. Geeignet sind z.B. 2x LDR
oder Fototransistoren.
Im Beispielprogramm sind die LDR an Ad4
und Ad5 angeschlossen. Man lässt den Motor laufen, dessen LDR mehr
Helligkeit meldet. Logisch?!
Wir verwenden C4+C5, weil hier
die Pullup-Widerstände eingeschaltet sind, die zusammen mit den LDR
einen Spannungsteiler bilden. Bei ungünstigen Lichtverhältnissen kann
der Wertebereich verlassen werden. Werden die LDR/Led einzeln montiert,
kann der Abstand später geändert werden.
(siehe oben: TPR-Beispiel1)
Für Fortgeschrittene:
Im Beispiel sind die Stoßstangen-Tasten nicht programmiert. Versuchen Sie die Tasten TR und TL mit einzubeziehen.
Für weit Fortgeschrittene:
Versuchen Sie, das der LeoBot Licht sucht oder meidet.
Für ganz weit Fortgeschrittene:
versuchen Sie mit den LDR einen Bewegungs-/Berührungs-Sensor.
6 Arduino micro (Mega32u4), Leonardo (Mega32u4), Arduino nano (Mega328), o.ä. Alle
bisherigen Fahrwerke und Sensoren lassen sich auch mit einem Arduino
steuern. Der Arduino micro/nano ist für kleine Roboter etwas besser
geeignet. Der Arduino nano 328 passt auch auf das micro-Shield und
umgekehrt!
Der Leonardo ist elektrisch identisch und eignet sich genau so gut, sowie alle anderen Arduino's mit M8, M168, M328, nano usw.
Das
Umstecken der Anschlüsse sollte kein Problem darstellen. Noch einmal
die Warnung: beim Umstecken ruhig und besonnen vorgehen!
7-TPR für Arduino Heute
folgt die 'TPR-Arduino.ino'. Die Befehlstabelle ist mit der für M8
identisch geworden. Es hätte auch anders kommen können. Sie müssen das
Programm nicht verstehen. Wir haben das Bascom fast 1:1 in C
übernommen. Es können daher noch viele Fehler enthalten sein. Der
'RGB'-Befehl ist experimental und noch nicht perfekt. Das .ino ist nur
mit dem Leonardo/-mikro getestet. Bei anderen Arduinos können
Schwierigkeiten auftreten.
Installieren Sie die
Entwicklungsumgebung (von www.arduino.cc). Ggf. müssen Sie einen
Treiber fürs Board installieren. Dann stellen Sie den Com-Port ein, das
richtige Board und laden das .ino hoch.
Download (aktualisiert 10.12.13):
tpr_13lb.zipAuch
hier wird die Programmierung mit den Tasten TL+TR (Stoßstange) und den
vier Led's am Out-Port vorgenommen. Während die Adresse kurz angezeigt
wird ist die Led13 aus. Beim ersten Nibble (X) leuchtet die Led13. Beim
Daten-Nibble (Y) ist die Led13 aus.
Indem Sie die
Kommentarzeichen '//' in Zeile ~79 entfernen, wird nach Reset das
Beispiel1 ins EEPROM übertragen. Wenn Sie die '//' beim 2. hochladen
nicht wieder anbringen, können Sie NICHT manuell programmieren!
Nun sollten Sie in der Lage sein eigene Ideen mit Arduinos zu verwirklichen.
weiter zum Teil 2