Beispiel Powered Up Programme für Lego Hedwig (75979)


Es ist langweilig, das neue Lego Hedwig Set (75979) per Hand zu bewegen. Deshalb war für mich ziemlich schnell klar, dass man das ganze motorisieren muss.
Nachdem Pybricks jetzt in der Public Beta ist, kann man endlich Programme auf die Hubs im Powered Up System übertragen und dauerhaft auf dem Hub speichern. Das bedeutet, dass nach der einmaligen Übertragung keine Bluetooth Verbindung mehr notwendig ist. Das Programm wird dauerhaft auf dem Hub gespeichert. Wie das genau geht kann man der offiziellen Dokumentation von Pybricks entnehmen.
Je nachdem was einem an Hardware zur Verfügung steht oder was einen so interessiert habe ich drei Projekte als Beispiel.

Projekt 1: Batteriebox mit Geschwindigkeitssteuerung

Das erste Projekt benötigt neben einem Hub (88009) und einem einfachen, mittleren Linearmotor (45303) keine weitere Hardware. Der Motor sollte mit dem ersten Anschluss des Hubs verbunden werden.
Wenn man die grüne Taste des Hubs drückt wird der Motor schneller. Man sollte allerdings auf die Farbe der LED achten: wenn sie blau wird, hat man das Programm beendet. Da der Hub nur eine Taste hat, kann das relativ schnell passieren.
Das Programm stammt bis auf sehr kleine Modifikationen vollständig von Gianluca Cannalire.
import uos
from pybricks.hubs import CityHub
from pybricks.pupdevices import DCMotor
from pybricks.parameters import Port, Stop
from pybricks.parameters import Color
from pybricks.tools import wait, StopWatch
import uerrno
print(uos.uname())
hub=CityHub()
crono=StopWatch()
lastClick=crono.time()
ramp=0
     
def isDoubleClick():
    global lastClick, crono
    y=crono.time() - lastClick
    if (y < 300):
        #print(str((tmr.time() - previousClickTime))) #debug double click time
        return True
    else:
        lastClick=crono.time()
        return False
def get_motor(port):
    #Returns a Motor object if a motor is connected to port or None if no motor is connected.
    try:
        return DCMotor(port)
    except OSError as ex:
        if ex.args[0] != uerrno.ENODEV:
            raise
        return None
#Show a red blinking if not motor present
def warning_LED(speed):
    iCount=0
    while iCount < 4:
        hub.light.on(Color.RED)
        wait(speed)
        hub.light.off()
        wait(speed)
        iCount +=1
     
# don't care which port motor is connected to
mot = get_motor(Port.A) or get_motor(Port.B)
if not mot:
    warning_LED(100)
    raise RuntimeError("No motor connected on Port A or Port B")
speedMultipler=2 #with less of 20% of Duty Cycle the motor don't turn
mot.dc(10 * speedMultipler) #start the motor at 20%
while True:
    try:
        if (speedMultipler==10):
            hub.light.on(Color.RED) #with max speed, turn on RED light
        else:
            hub.light.on(Color.GREEN) #otherwise, GREEN light
        wait(500)
    except KeyboardInterrupt as e:
        if isDoubleClick()==True:
            raise SystemExit("Stop by user..")
        if (ramp==0): 
            speedMultipler +=1
            mot.dc(10 * speedMultipler)
            if (speedMultipler==10):
                ramp=1
        else:
            speedMultipler -=1
            if (speedMultipler>1):
                mot.dc(10 * speedMultipler)
            else:
                raise SystemExit("End of speed ramp cycle...")

Projekt 2: Flattern bei Objekt

Für das zweite Projekt wird ein weiteres Hardwareelement benötigt: der Farb- und Abstandssensor (88007) aus den Lego Boost Sets. Dabei handelt es sich übrigens um einen sehr vielseitigen Sensor, der sogar Power Functions Infrarot Signale aussenden kann um entsprechende Empfänger anzusteuern.
Darum soll es heute allerdings nicht gehen. Wir nutzen die Möglichkeit des Sensors Entfernungen zu messen, um die Geschwindigkeit des Motors und damit die Flattergeschwindigkeit der Eule an die Entfernung anzupassen.
from pybricks.pupdevices import *
from pybricks.parameters import Port, Stop
from pybricks.tools import wait
hedwigMotor = DCMotor(Port.A)
sensor = ColorDistanceSensor(Port.B)
while True:
    wait(100)
    hedwigMotor.dc((100-sensor.distance())*3)
Das war schon der ganze Code für dieses Projekt.

Projekt 3: ein zweiter Motor als Geschwindigkeitsregler

Die Projektbeschreibung sagt eigentlich schon alles notwendige aus. Für diese Steuerung benötigen wir einen Motor, der einen Umdrehungssensor enthält. Das sind aktuell (2.8.2020) alle Motoren bis auf den Zugmotor und den einfachen, mittleren Linearmotor. Man kann auch Mindstorms, Control+ und SPIKE Prime Motoren verwenden.
Für dieses Projekt wird eine Kurbel an den Motor gebaut. Je nachdem, wie weit er gedreht wurde, wird die Geschwindigkeit der Eule angepasst.
from pybricks.pupdevices import *
from pybricks.parameters import Port, Stop
from pybricks.tools import wait
hedwigMotor = DCMotor(Port.A)
controlMotor = Motor(Port.B)
controlMotor.reset_angle()
while True:
    wait(100)
    hedwigMotor.dc(controlMotor.angle())

Protip

Wenn dir der Powered Up Hub direkt von Lego zu teuer ist, kannst du ihn für ungefähr 20 Euro auf anderen Marktplätzen wie z.B. Bricklink erwerben. Da der einfache, mittlere Linearmotor bisher kaum in Sets aufgetaucht ist, bekommt man ihn selten günstiger als im Direktverkauf.

Kommentare