LeoBot, der alternative Weihnachts-Kalender 2013          

von Heinz D.                
Elektronik-Labor  Literatur  Projekte  Lernpakete  Kalender      



 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.zip

Das 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-Programmierung

Eine (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.zip

Auch 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



Elektronik-Labor  Literatur  Projekte  Lernpakete  Kalender