Ferngesteuertes LEGO Technic Batmobil (Pybricks)

In meinem aktuellsten Projekt habe ich das LEGO Technic Batmobil aus diesem Jahr motorisiert, damit es ferngesteuert werden kann.


Hardware

Ein großer Fokus in diesem Modell lag auf der Beleuchtung. Allgemein bin ich ein großer Verfechter von steuerbarer Beleuchtung und da war ein Technic-Modell, das 2 Light Bricks enthält, natürlich ein gefundenes Fressen. Die Light Bricks wurden durch normale LEDs (für den vorderen) und eine 3x3 Farblichtmatrix (für den hinteren) ersetzt.
Insgesamt habe ich die folgende Hardware genutzt:
Der große Technic Hub hat 6 Powered Up Anschlüsse und ist in Bezug auf das Volumen quasi gleichgroß wie der normale Technic Hub mit 4 Anschlüssen. Deshalb nutze ich ihn vorwiegend für meine ferngesteuerten Modelle. Dank des Programms kann die Powered Up Fernsteuerung direkt mit dem Hub verbunden werden.
Ein Auto braucht normale Fahrlichter. Da Vorder-und Rücklichter sich gleich verhalten, wollte ich nur einen Port für alle vier Lichter nutzen. Das geht dank eines Adapterkabels von Powered Up zu Power Functions, womit sich die Kabel stapeln lassen. So können 2 Power Functions LEDs an einen Powered Up Anschluss angeschlossen werden.
Für die leuchtende Motorhaube, die keine Motorhaube ist, habe ich das Äquivalent der Power Functions LEDs unter der Motorhaube versteckt: das Powered Up Licht. Die Farbe der zwei weißen LEDs wird durch eine durchsichtige, runde 1x1 Plate in orange/rot zu dem entsprechenden Farbton gewechselt.
Der durchsichtige Fake-Motor mit sich bewegenden Zylindern hat im Original einen roten Leuchtstein aber blaue Flammen, die herauskommen. Um den Motor deshalb sowohl rot für normale Fahrten und blau für schnelle Fahrten leuchten lassen zu können, habe ich die 3x3 Farblichtmatrix genutzt. Sie hat 9 LEDs, die in Farbe und Helligkeit gesteuert werden können.
Bei Lego-Modellen ist der Fake-Motor häufig direkt mit den Antriebsrädern verbunden. Das reicht für ein Spielmodell aber originalgetreu ist es nicht. Ein echter Motor kann sich auch drehen, wenn das Auto steht. Um diesen Effekt simulieren zu können, wird der Fake-Motor in diesem Modell von einem kleinen Winkelmotor angetrieben und ist unabhängig von dem Antriebsstrang.
Der Antriebsstrang wird von einem einfachen, mittleren Linearmotor angetrieben.


Video


Quellcode (geschrieben mit Pybricks)

dank der Nutzung von Pybricks ist es relativ einfach gewesen, die LEGO Fernsteuerung ohne zusätzliche Hardware mit dem Hub zu verbinden.
Nachdem die Fernsteuerung verbunden ist und der Lenkmotor kalibriert ist, befindet sich das Auto im "Standby". Dieser kann über die mittlere Taste auf der Fernbedienung beendet werden. Der Fake-Motor "heult" dabei auf und danach kann das Modell im normalen Modus gesteuert werden. Die Fake-Engine dreht sich hierbei langsam und leuchtet rot. Für dringende Heldeneinsätze können die linke und die rechte rote Taste der Fernbedienung gleichzeitig gedrückt werden, um in den Hero-Modus zu wechseln. Dieser zeichnet sich durch eine erhöhte Geschwindigkeit, einen sich schneller drehenden, blau leuchtenden Fake-Motor und eine orange/rot leuchtende vordere Klappe aus. Mit der mittleren Taste kann das Fahrzeug wieder in den "Standby"-Modus gestellt werden.

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import *
from pybricks.parameters import *
from pybricks.tools import wait

#used hardware
hub = PrimeHub()
fakeEngine = Motor(Port.A)
frontLight = Light(Port.B)
fakeEngineLight = ColorLightMatrix(Port.C)
mainLight = DCMotor(Port.D) #Actually 2 lights via PF adapter cable
driving = DCMotor(Port.E)
steering = Motor(Port.F)

hub.light.on(Color.RED)
remoteControl = Remote()
hub.light.on(Color.GREEN)

#steering calibration sequence
steering.run_until_stalled(500)
steering.reset_angle(0)
steering.run_until_stalled(-500)
maxAngle = steering.angle()
steering.run_target(500, (maxAngle/2)+10)
steering.reset_angle(0)

hub.light.off()
mainLight.dc(10)

#main loop
while True:
    #Loop to "start" the car
    remoteControl.light.on(Color.YELLOW)
    while True:
        pressed = remoteControl.buttons.pressed()
        if Button.CENTER in pressed: break

    #Start engine
    remoteControl.light.on(Color.YELLOW)
    mainLight.dc(100)
    fakeEngineLight.on(Color.BLUE)
    fakeEngine.dc(100)
    frontLight.on(100)
    driving.dc(-40)
    wait (200)
    driving.brake()
    frontLight.off()
    fakeEngine.dc(80)
    fakeEngineLight.on(Color.RED)
    wait(1300)
    frontLight.off()
    for brightness in range(1, 60):
        fakeEngineLight.on(Color(h=0, s=100, v=100-brightness))
        fakeEngine.dc(80-brightness)
        wait(100)
    wait(500)

    maxSpeed = 60
    remoteControl.light.on(Color.RED)
    #mainLoop
    while True:
        pressed = remoteControl.buttons.pressed()
        #turn batmobile off
        if Button.CENTER in pressed: break
        #Activate hero mode
        if (Button.LEFT in pressed) and (Button.RIGHT in pressed):
            maxSpeed = 100
            fakeEngine.dc(100)
            fakeEngineLight.on(Color.BLUE)
            remoteControl.light.on(Color.BLUE)
            frontLight.on(100)
            

        #commands to drive forwards or backwards
        if Button.LEFT_PLUS in pressed:
            driving.dc(maxSpeed)
            if maxSpeed == 60:
                fakeEngineLight.on(Color(h=0, s=100, v=60))
                fakeEngine.dc(maxSpeed)
        elif Button.LEFT_MINUS in pressed:
            driving.dc(-maxSpeed)
            if maxSpeed == 60:
                fakeEngineLight.on(Color(h=0, s=100, v=60))
                fakeEngine.dc(maxSpeed)
        else: 
            driving.brake()

        #commands to steer
        if Button.RIGHT_PLUS in pressed:
            steering.run_target(1200, (maxAngle/2)-5, Stop.HOLD,False)
        elif Button.RIGHT_MINUS in pressed:
            steering.run_target(1200, -((maxAngle/2)-5), Stop.HOLD,False)
        else:
            steering.run_target(1200, 0, Stop.HOLD, False)

    #turn off sequence
    frontLight.off()
    remoteControl.light.on(Color.ORANGE)
    for brightness in range(1, maxSpeed):
        fakeEngine.dc(maxSpeed-brightness)
        if (brightness < 20) and (maxSpeed == 100): fakeEngineLight.on(Color(h=240, s=100, v=100-brightness))
        elif brightness < 55: fakeEngineLight.on(Color(h=0, s=100, v=100-brightness))
        else: fakeEngineLight.on(Color(h=30, s=100, v=100-brightness))
        wait(100)
    maxSpeed = 60
    fakeEngineLight.off()
    mainLight.dc(10)


3D-Modell für Rücklicht

Der Umbau war in großen Teilen ohne besondere Neudesigns möglich. Eine Ausnahme davon bilden die Rücklichter, die ich am Computer etwas umgeändert habe, damit je eine LED mit roter 1x1 Plate reinpasst.

Download


Weitere Ideen

Man könnte anstelle des Hero-Modus' eine Art "Gas-Pedal" einbauen können, bei dem die Effekte nur bestehen bleiben, solange die Taste gedrückt wird. Da man viel Platz benötigt, um das Fahrzeug damit zu nutzen, habe ich diese Idee verworfen.
Eine weitere Idee ist, das Modell mit einem normalen Technic Hub fernzusteuern. Man könnte beispielsweise das Licht unter der Motorhaube, die keine Motorhaube ist, mit dem Front-und Rücklicht zusammenbringen. Außerdem könnte man die Trennung von echtem Antrieb und Fake-Engine rückgängig machen.

Kommentare