Hintergrund:
Auf Youtube gibt es eine tolle Anleitung, wie man Lego Power Functions mit dem Calliope steuern kann: https://m.youtube.com/watch?v=6N3frnwxqPo
Aber man kann mit dem Calliope nur einen Motor vorwärts und rückwärts fahren lassen und muss Kabel löten. Über das Infrarot Protokoll sollte man mehrere Motoren sehr präzise steuern können.
Zuerst stellt sich also die Frage nach dem Protokoll. Die Suchmaschine der Wahl liefert sehr schnell die Antwort, dass Lego dies vorbildlich dokumentiert und veröffentlicht hat: http://storage.technicbricks.com/Media/2010/TBs_20100304_1/LEGO%20Power%20Functions%20RC%20v120.pdf
Dort steht z.B. dass mit 38kHz übertragen wird und wie die Länge der On/Off Zeiten in Mikrosekunden pro Bit etc. Leider geben sie keinen vollständigen Befehl als Beispiel.
Dann die Frage, ob sowas schon mit einer dem Calliope Mini nahestehenden Platform hinbekommen hat, und auch hier gibt es gute Nachrichten:
- Microbit als Fernbedienung für Samsung TV: https://github.com/thtuerk/microbit-ir-remote
- Microbit mit Sniff als Lego IR Sender: http://www.sniff.org.uk/2016/09/power-functions-ir.html
- Imp und Lego Power Functions IR: http://impyourlego.blogspot.de/
- Arduino Lego Power Functions Library: https://github.com/jurriaan/Arduino-PowerFunctions
- Messwerte aus dem Oszilloskop liefern vollständige Beispielbefehle: http://www.hackvandedam.nl/blog/?page_id=559
Hardware:
Benötigte Hardware ist
- eine 940nm IR LED
- Widerstand je nach IR LED (bei mir wohl 20 Ohm)
- Litze/Krokoklemmen zum Anschluss an Calliope
- Lego Power Functions mit IR (ich habe z.B. das Lego 42065 Raupenfahrzeug mit der 8885 Fernbedienung)
Erster Code
Man schickt dem Lego Receiver ein Startbit, vier 4-Bit Gruppen aka Nibble und ein Stopbit. Die vierte 4-Bit Gruppe ist eine LRC Prüfsumme, die aus den ersten drei 4-Bit Gruppen zu errechnen ist.
Die 8885 Fernbedienung, die meinem ferngesteuerten Raupenfahrzeug beiliegt nutzt den ComboDirekt Mode. Das scheint mir am einfachsten zu sein, also fange ich damit an.
Beispiel für den Befehl zum Anhalten:
- erstes 4-Bit Nibble 0b0000, weil Toggle 0, Escape 0 für ComboDirect, Channel 00 für Kanal 1
- zweites 4-Bit Nibble 0b0001, weil Address 0, Mode 001 für ComboDirect
- drittes 4-Bit Nibble 0b1111, weil Data 1111 für Brake and Float B+A (immer dran denken: die zwei Bit für Motor B kommen zuerst)
- viertes 4-Bit Nibble LRC 0b0001, weil LRC ist 0xF XOR Nibble1 XOR Nibble2 XOR Nibble3, also 0b1111^0b0000^0b0001^0b1111
- zu senden ist also 0b0000 0b0001 0b1111 0b0001
Erster Code hat nicht funktioniert, weil ich den LRC falsch berechnet habe. Ich habe dann einfach einen gemessenen Befehl aus dem "Measurements" Link gecoded und jetzt fahren beide Motoren! Einer Rückwärts, einer Vorwärts und das Raupenfahrzeug fährt in Summe vorwärts, weil die Motoren gegenläufig eingebaut sind:
Der Calliope kann XOR (^ in Javascript) und berechnet den LRC dann auch richtig. Leider scheint .toString(2) für eine binäre Ausgabe nicht zu funktionieren? Hat hierzu jemand weitere Informationen?
Ein einziger Forward Befehlt führt dazu, dass das Raupenfahrzeug ca. 80cm fährt.
Ich habe ein zweites Programmbeispiel hinzugefügt, welches mit einer Funktion für das Senden der Bits arbeitet und entsprechend leichter zu lesen ist. Erst werden beide Motoren gestartet und nach 250ms gestoppt (Brake & Float). Das Raupenfahrzeug fährt ca. 15cm.
Erste vollständige Fernsteuerung:
Ich habe ein drittes Programmbeispiel hinzugefügt: dieser Code hat Funktionen für Stopp, Vorwärts, Rückwärts, Rechtsdrehung und Linksdrehung. In den Funktionen sind die Bits, die übertragen werden sollen, als Array hinterlegt. Gesteuert wird, indem der Calliope vor und zurück, rechts und links gekippt wird, d.h. es müssen keine Knöpfe gedrückt werden. Es wird ein Pfeil für die übertragene Richtung angezeigt.
Noch verbesserungswürdig: Links und Rechtsrum ist noch "hakelig", weil immer nur kurz gefahren und dann wieder gestoppt wird.
Comments