UPDATE: Der Nachfolger RealRobots ist hier zu finden!

RLI LogoÜberblick

Mit dem Real Life Interface (RLI, gesprochen: rɪli ) kann zwischen Minecraft 1.5.1 und der realen Welt kommuniziert werden. RLI ist ein sogenanntes Peripheral für den Mod ComputerCraft von Daniel Ratcliffe (danke dafür!), also ein weiterer Block, der allerdings nur von ComputerCraft Computern aus angesteuert werden kann.

Da ComputerCraft das Steuern von Redstone-Signalen ermöglicht, können zum einen sämtliche Blöcke in der Kategorie Redstone aus der realen Welt angesteuert werden (z.B. Türen, Fackeln, Kolben, Notenblock, Werfer usw. ), zum anderen können Blöcke wie Falltür, Hebel, Knopf, Stolperdraht, Aktivierungsschiene usw. Dinge im realen Leben steuern.

Die Entwicklung

In den Sommerferien 2012 habe ich den Vorläufer des RLI geschrieben, um den Lego WeDo Hub ansteuern zu können. Der Hub unterstützt zwei Motoren sowie einen Kipp- und einen Entfernungssensor. Der Hub wird über USB angeschlossen und gibt sich als HID Gerät aus, d.h. die Treiber werden vom Betriebssystem direkt geliefert. Nach einigen Nächten mit diversen USB Sniffern hatte ich die notwendigen Reports, die zwischen Rechner und HID Gerät geschickt werden, soweit mitgelesen, dass die Motoransteuerung lief. Wenig später war auch das Auslesen des Kippsensors möglich. Als API zwischen Java und USB HID habe ich die hidapi von Codeminders verwendet (Vielen Dank dafür!).

Mein Block hatte einen amüsanten, aber unschönen Designfehler. Die Befehle zum Ansteuern bzw. Abfragen des WeDo Hubs wurden direkt an den Server geschickt, wenn man im Multiplayer Modus spielte. Dies bedeutet, dass dort auch der WeDo Hub angeschlossen sein musste. Und da unser Server in der Schule nicht im Computerraum steht, hätte man mit einer Webcam in den Serverraum schauen müssen, ob sich was dreht O.o

Aaron Mills, der ComputerCraft mitentwickelt, half mir mit einem Callback System aus der Klemme. Nun muss der Spieler einen Rechtsklick auf den RLI BLock ausführen, um ihn an sich zu binden. Befehle, die über den Block an den WeDo Hub geschickt werden, werden nun vom Server an den Rechner weitergeleitet, an dem der Spieler eingeloggt ist, und dort dann lokal ausgeführt. Jetzt konnten die Schüler in der Informatik AG selbst am Rechner bauen. Aaron zeigte mir noch den Trick, wie man eine eigene API in ComputerCraft einbinden kann (Aaron, vielen, vielen Dank dafür!). Die Programmierung mit ComputerCraft erfolgt übrigens in der Sprache Lua.

Auf dem TILL 2013 im Februar durfte ich meine Arbeit mit ComputerCraft im Informatikunterricht im Rahmen eines Workshops zeigen und wurde darauf angesprochen, dass auch der Arduino Leonardo das USB HID Protokoll unterstütze. Die Anpassung des RLI war schnell gemacht, allerdings konnte ich nur Daten vom Arduino zum PC senden und keine empfangen. Nach meiner bisherigen Suche ist es wohl so, dass das HID Protokoll noch nicht vollständig in der Leonardo Firmware implementiert ist. Als Alternative verwende ich nun das LUFA Framework von Dean Camera (danke dafür!) , baute mir einen passenden HID Descriptor und für die ersten Gehversuche ein Programm, dass die ersten 8 digitalen I/O Ports ansteuert, je nach Report, der vom Rechner gesendet wird. Die Ports 0-7 lassen sich so entweder als Eingang oder Ausgang schalten, als Ausgang geschaltet high oder low setzen und als Eingang geschaltet abfragen, ob ein Signal anliegt.

Ich hatte nun zwei Versionen des Blocks, einen für Lego WeDo und einen für den Arduino Leonardo mit meiner angepassten Firmware. Da ich leider nur begrenzt Zeit hatte habe, kann ich mich nicht in die Tiefen des Minecraft Modding einarbeiten. Schön wäre es gewesen, wenn man zwei Blöcke, für jede Hardware einen, hätte. Deshalb habe ich in den Sommerferien 2013 nun sämtliche Befehle für beide Systeme in einem Block zusammengefasst. Da beim Andocken eines Peripherals der ComputerCraft Computer jedoch nur einmal den Block abfragt, was er für Methoden, also Befehle, anbietet, kann ich auch nicht durch einen wechselDieHardware-Befehl unterschiedliche Methoden anbieten. Kurzum: Es gibt nun alle Methoden in einem Block, aber zwei APIs. Mit den Methoden wedo.useLeonardo() bzw. leonardo.useWeDo() wechselt man die VENDOR_ID und PRODUCT_ID, damit mit der richtigen Hardware kommuniziert wird.

Die letzte Arbeit am Block war die Grafik. Dieses Creepergrün ist unschlagbar 😉

Für meine proof-of-concept Videos nutzt bitte die Suchfunktion meines Blogs oder schaut auf Youtube oder Twitter.

Funktionsumfang

Lego WeDo

leftMotor(seite, drehzahl): Dreht den Motor am linken der beiden WeDo Hub-Anschlüsse mit einer Drehzahl von 1 bis ca. 100 im Uhrzeigersinn, von -1 bis ca. -100 gegen den Uhrzeigersinn

rightMotor(seite, drehzahl): Dreht den Motor am rechten der beiden WeDo Hub-Anschlüsse mit einer Drehzahl von 1 bis ca. 100 im Uhrzeigersinn, von -1 bis ca. -100 gegen den Uhrzeigersinn

bothMotors(seite): Dreht beide Motoren an beiden WeDo Hub-Anschlüssen mit einer Drehzahl von 1 bis ca. 100 im Uhrzeigersinn, von -1 bis ca. -100 gegen den Uhrzeigersinn

 getTilt(seite): Fragt den Kippsensor am WeDo Hub ab, gibt normal, left, right, forward oder back zurück, je nach Neigung des Sensors

getDistance(seite): Noch nicht vollständig implementiert. Zahlenwerte sind noch nicht determiniert 🙁

getLeftRotation(seite): Beim Sniffen des USB Traffics habe ich gesehen, dass man die Motoren auch als Drehsensor verwenden kann. Sowohl Richtung als auch Geschwindigkeit werden ausgegeben. Hier ist aber noch nichts Brauchbares vorhanden.

useLeonardo(seite): Wechselt die Vendor ID und Product ID, um den Leonardo zu verwenden

Arduino Leonardo (meine angepasste LUFA Firmware!)

setInput(seite, port): Setzt einen der Ports 0-7 als Eingang mit internem PullUp-Widerstand

getInput(seite, port): Fragt den Zustand des als Eingang geschalteten Ports ab. Liefert entweder 1 oder 0

useWeDo(seite): Wechselt die Vendor ID und die Product ID, um den Lego WeDo Hub zu verwenden

Beide Systeme

getRaw(seite): Liefert den kompletten HID Report als Array, zum selber Debuggen…

get Byte(seite,byteID): Liefert ein bestimmtes Byte des HID Reports. Zum Debuggen einzelner Ports beim Leonard interessant.

Vorteile für den Unterricht

Die virtuelle Welt ist nicht mehr isoliert, RLI schlägt eine Brücke zur realen Welt. Das Lego WeDo System ist nun dank der Programmierung über Lua auch für ältere SchülerInnen motivierend und herausfordernd zugleich. Die Methoden getRaw und getByte bieten sich dafür an, die Hardwarekommunikation mitzulesen und ggf. eigene Methoden in Lua zu schreiben.

Mit dem Arduino Leonardo lassen sich sowohl Ein- als auch Ausgänge steuern, so dass auch komplexere Schaltungen möglich sind. Dadurch, dass schon für das Ansteuern einer LED ein Breadboard, Kabel und Widerstand notwendig sind, lässt sich mit dem RLI ein guter Einstieg in die Welt der Elektronik realisieren. Die Kombination von Redstone-Logikschaltungen und realen Schaltungen ist auch nett.

Ausblick

Die Methoden getDistance, getLeftRotation und getRightRotation für den WeDo sind noch nicht voll funktionsfähig.

Die analogen Ports sowie die restlichen digitalen am Leonardo werden noch nicht unterstützt. Dann könnten auch eine Vielzahl an Sensoren angeschlossen werden.

Eine Vielzahl an Geräten läuft über die USB HID Spezifikation, beispielsweise Gamecontroller. Das RLI könnte entsprechend erweitert werden.

Auch sind Leonardo Klons erhältlich zu günstigeren Preisen als der original Leonardo. Hier kann man auch Unterstützung einbauen, vielleicht sogar eine Art autodetect.

Es ist denkbar, mehr als einen WeDo anzuschließen.

2 Antworten

  1. Hey Jani,

    inzwischen habe ich das RLI aufgeteilt in zwei Blöcke, den einen für Lego WeDo, den anderen für Arduino Leonardo. Die Ansteuerung des RaspberryPi mit PiFace ist inzwischen mit zwei Blöcken (Eingänge bzw. Ausgänge) realisiert und auch im Mod enthalten.
    Welche Hardware davon hast Du? Ich kann Dir den Mod per Mail schicken, wenn es für Dich in Ordnung ist.

    Mirek

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.