Lego Powered-Up Zug mit Python steuern

Mit Powered-Up lassen sich Lego Modelle per Fernbedienung oder App für das Smartphone steuern. Glücklicherweise gibt es neben den proprietären Lösungen für Enthusiasten auch verschiedene OpenSource Bibliotheken. So zum Beispiel auch für Python, welche in diesem Artikel kurz vorgestellt werden soll.

In den Vergangenen Jahren gab es bereits verschiedene Lösungen von Lego, die die Steuerung der gebauten Modelle ermöglichten. Die ersten Modelle waren noch per Kabel verbunden, später ließen sie sich über Infrarot auch ohne Kabel fernsteuern. Inzwischen kommt Bluetoot LE zum Einsatz. Dies hat den Vorteil, dass sich die Modelle leichter auch mit anderen Komponenten wie Computern, Mikrocontrollern, Smartphones etc. steuern lassen.

Für die Programmiersprache Python gibt es zum Beispiel die Bibliothek BrickNil, welche die Ansteuerung von Power-Up kompatibler Lego Komponenten ermöglicht. Benötigt wird dafür lediglich ein Computer oder ähnliches mit Bluetooth auf dem Linux, Windows oder MacOS läuft. Das im weiteren beschriebene Vorgehen bezieht sich auf ein Linux System.

Zunächst muss Bluez, eine Software aus mehreren Komponenten für die Unterstützung von Bluetooth unter Linux, installiert werden. Eine Anleitung für die jeweilige eingesetzte Linux Distribution sollte sich relativ leicht finden lassen.

Anschließend sollte noch BrickNil installiert werden.

pip install bricknil

Das Folgende Beispiel stammt so aus der offiziellen Dokumentation und wurde nur leicht angepasst.

#!/usr/bin/env python
from curio import sleep
from bricknil import attach, start
from bricknil.hub import PoweredUpHub
from bricknil.sensor import TrainMotor
from bricknil.process import Process
import logging


@attach(TrainMotor, name='motor')
class Train(PoweredUpHub):

    async def run(self):
        self.message_info("Running")
        for i in range(2):
            self.message_info('Increasing speed')
            await self.motor.ramp_speed(80,5000)
            await sleep(5)
            self.message_info('Coming to a stop')
            await self.motor.ramp_speed(0,1000)
            await sleep(2)


async def system():
    train = Train('My train')

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    start(system)

Nachdem das Skript gestartet wurde, sucht es automatisch nach verfügbaren Geräten. Der eingesetzte Power Hub muss mit einem kurzen Druck auf den Knopf aktiviert werden. Die LED blinkt zunächst und leuchtet anschließend durchgehend, sobald eine Verbindung hergestellt wurde. Nachdem dem Verbindungsaufbau beschleunigt der Zug langsam und bremst anschließend wieder ab.

Die Ansteuerung und das Auslesen weiterer Geräte und Komponenten kann der Dokumentation entnommen werden. So lassen sich zum Beispiel die Komponenten nicht nur steuern, sondern es kann auch auf Events der Fernbedienung reagiert werden.

Fazit

Die Power-Up Komponenten von Lego und die Bibliothek BrickNil für Python machen einen vielversprechenden Eindruck und eröffnen ganz neue Möglichkeiten der Interaktion mit Lego Model. Durch die Verwendung der Async IO Funktionalität von Python wird jedoch eine relativ neue Version 3.7+ als Mindestanforderung für die Installation und die Verwendung vorausgesetzt. Gefühlt wird die Verwendung von Async IO viele Entwickler, die aus dem klassischen Umfeld kommen, vor neue Herausforderungen stellen.

Da es kein Pairing oder eine Autorisierung gibt, kann sich während der Initialisierungsphase jeder im Umkreis von ein paar Metern mit dem Model verbinden. Die Sicherheit bei der Übertragung der Steuerbefehle wurde an dieser Stelle nicht weiter durchgeführt.

Links

  • Webseite: Python (englisch)
  • Webseite: BrickNil (englisch)
  • Webseite: Bluez (englisch)
  • Webseite: Lego (mehrsprachig, deutsch)

Verwandte Artikel