Pybricks Test und Sound mit Lego SPIKE Prime - Ein Zuglayout mit Bahnübergang

In einem Stream wurde ich auf die Idee gebracht einen Zug aus Lego zu bauen, der Töne abspielen kann. Da die Maße eines Zuges relativ begrenzt sind (4 freie Noppen in der Breite, begrenzte Höhe etc) kam eigentlich nur der SPIKE Prime Hub für den Zug infrage, da dies soweit ich weiß der kleinste Lego Hub mit integriertem Lautsprecher ist. Aber mehr dazu später.
Wer sich für den Entstehungsprozess der beiden Programme interessiert, dem kann ich diesen Stream nahelegen.

Pybricks

Relativ zeitgleich mit der offiziellen Python Unterstützung für den SPIKE Prime Hub ist die BETA für Pybricks erschienen. Dabei handelt es sich um eine Portierung des Micropython Betriebssystem auf die Hubs der Powered Up Reihe, also den Move Hub aus den Lego Boost Sets, den City Hub aus den Zugsets und den Control+ Hub aus der Technic-Reihe.
Im Klartext wird man mit Pybricks Programme, die in der Programmiersprache Python geschrieben wurden, auf den Hubs ablegen können. Dadurch können sie wie ein Roboter autonom agieren. Eine dauerhafte Bluetooth Verbindung ist nicht mehr notwendig.
Wie auch immer. Auf jeden Fall wurde Pybricks ungefähr in der gleichen Zeit veröffentlicht und da ich das zusammen mit dem Zug mit Lautsprecher ausprobieren wollte habe ich in das Layout einen elektronischen Bahnübergang eingebaut, den ich noch von einem vorherigen Projekt übrig hatte. Da sich in letzter Zeit ein bisschen was bei Pybricks getan hat könnte es sein, dass der Code nicht mehr mit dem übereinstimmt, den du kennst.
Zum erkennen des Zuges habe ich einen Ultraschallsensor aus dem SPIKE Prime Set genutzt.

Der Quellcode für den Control+ Hub (benötigt Pybricks):
# Initialize hub and sensor
from pybricks.pupdevices import *
from pybricks.parameters import Port
from pybricks.tools import wait

ultraschallsensor = UltrasonicSensor(Port.C)
motor1 = Motor(Port.A)
motor2 = Motor(Port.D)
licht = Light(Port.B)
speed = 30
repitions = 10
#A: Ultraschallsensor
#B: Lichter
#C: Äußerer Motor
#D: Innerer Motor

print('start')
while True:
    wait(100)
 
    if ultraschallsensor.distance() < 235:
        print(ultraschallsensor.distance())
        wait (100)
     
        for x in range(repitions):
            for y in range(80):
                licht.on(y+10)
                wait(10)
            for y in range(80):
                licht.on(90-y)
                wait(10)
         
            if x == 1:
                motor1.dc(20)
                motor2.dc(20)
            elif x == repitions-2:
                motor1.dc(-40)
                motor2.dc(-40)
            else:
                motor1.stop()
                motor2.stop()
        licht.off()
        wait(200)

Der Zug mit Lautsprecher

Bleibt noch übrig zu klären wie der Zug mit Lautsprecher zustande gekommen ist. Eigentlich erlaubt es einem die SPIKE Prime Software nämlich nicht, Tondateien auf dem Hub selbst abzuspielen. Es gibt zwar die Möglichkeit Tondateien abzuspielen, aber die werden über den Computer oder das Handy abgespielt. Der Hub selber kann mit der offiziellen Software nur einzelne Töne wiedergeben.
Von solchen Begrenzungen lässt sich die Community allerdings nicht lumpen und so gibt es einige Python Scripte mit denen man Tondateien in ein Format konvertieren kann, das der SPIKE Hub abspielen kann. Ein weiteres Script erlaubt es, die Datei auf den Hub zu kopieren.

Der Quellcode für den SPIKE Prime Hub:
from spike import PrimeHub, LightMatrix, Button, StatusLight, ForceSensor, MotionSensor, Speaker, ColorSensor, App, DistanceSensor, Motor, MotorPair
import os
from spike.control import wait_for_seconds, wait_until, Timer
import hub
color_sensor = ColorSensor('C')
backlight = Motor('A')
motor = Motor('E')
frontlight = Motor('F')
color = 'None'
frontlight.start_at_power(100)
backlight.start_at_power(100)
motor.start_at_power(50)
redCounter = 0
while True:
    color = color_sensor.get_color()
    if color == 'green':
        motor.start_at_power(35)
        wait_for_seconds(1)
 
    if color == 'cyan':
        motor.start_at_power(0)
        wait_for_seconds(1)
        hub.sound.play('projects/Wooden_Train_Whistle.spike.bin')
        wait_for_seconds(1)
        motor.start_at_power(50)
        wait_for_seconds(2)
    if color == 'red':
        redCounter = redCounter + 1
        if (redCounter % 2) == 1:
            motor.start_at_power(0)
            wait_for_seconds(1)
            hub.sound.play('projects/Wooden_Train_Whistle.spike.bin')
            wait_for_seconds(1)
            motor.start_at_power(60)
            wait_for_seconds(2)
        else:
            wait_for_seconds(1)

Kommentare