Página 1 de 1

LEGO, som e luzes com Pybricks

Enviado: 14 jun 2026, 11:47
por CyberX
Juntando os meus dois tópicos atualmente em curso, temos aqui um Hub Technic com dois adaptadores UART (uart2midi e uart2dmx).

Pelo adaptador MIDI saem comandos MIDI para gerar notas que o sintetizador converte em som.
Pelo adaptador DMX saem comandos DMX512 que cada projector (PAR) converte em intensidades UV e intensidades RGB.

À esquerda uma caixa de arrumação LEGO que encontrei na NET descrita como trans neon green... só que não. Tb achei bom demais para ser verdade. Ao lado um punhado de peças efectivamente TNG.



Código:

Código: Selecionar todos

#now with MIDI

from pybricks.hubs import TechnicHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Button, Color, Direction, Port, Side, Stop
from pybricks.robotics import DriveBase
from pybricks.tools import wait, StopWatch
from pybricks.iodevices import UARTDevice

hub = TechnicHub()
dmx = UARTDevice(Port.A)
midi = UARTDevice(Port.C, baudrate=31250)


num_channels = 11       # no need to send more frames than the
                        # number of channels usable in the whole fixture

payload = [b'\x00']*(num_channels+1)
                        # DMX512 supports up to 512 channels
                        # preceded by a Start Code

payload[0] = b'\x00'    # Start Code

# PAR RGB has 7 channels and DMX address = 1
payload[1] = b'\x00'    # CH1 Mode
payload[2] = b'\xFF'    # CH2 RGB Color
payload[3] = b'\x00'    # Speed
payload[4] = b'\xFF'    # Master dimmer
payload[5] = b'\xFF'    # R
payload[6] = b'\x00'    # G
payload[7] = b'\x00'    # B

# PAR UV has 4 channels and DMX address = 8
payload[8] = b'\xFF'    # Master Dimmer
payload[9] = b'\xFF'    # UV Color
payload[10] = b'\x00'   # Strobe off
payload[11] = b'\x00'   # Mode


# MIDI payload
midi_payload = bytearray(3)



while True:
    pitch, roll = hub.imu.tilt()
    heading = hub.imu.heading()

    pitch = abs(int(pitch))
    roll = abs(int(roll))
    heading = abs(int(heading))

    if pitch > 254:
        pitch = 254
    if roll > 254:
        roll = 254
    if heading > 254:
        heading = 254

    print(pitch, roll, heading)
    
    # play note
    note = 60 + int(heading/4)
    print(note)
    midi_payload[0] = 144       # note on
    midi_payload[1] = note
    midi_payload[2] = 127       # velocity
    midi.write(midi_payload)

    # control PARs
    payload[5] = pitch.to_bytes(1,'endian')   # R
    payload[6] = roll.to_bytes(1,'endian')    # G
    payload[7] = heading.to_bytes(1,'endian') # B

    payload[8] = payload[7]     # UV Brightness

    # Break + Mark-After-Break
    # need an hack because Pybricks UART doesn't allow to define a preamble
    # so we send something similar at a lower baud rate
    dmx.set_baudrate(90909)
    dmx.write(b'\x80')

    dmx.set_baudrate(250000)

    for frame in range(0, num_channels):
        dmx.write(payload[frame])

    wait(40)

    # stop note
    midi_payload[0] = 128       # note off
    midi_payload[2] = 0         # velocity
    midi.write(midi_payload)

    wait(160)

Re: LEGO, som e luzes com Pybricks

Enviado: 15 jun 2026, 00:54
por Conchas
Se bem percebi, tens aí uma luz de UV no apparatus, para fazer brilhar a caixa trans coiso green!?

Re: LEGO, som e luzes com Pybricks

Enviado: 15 jun 2026, 07:49
por CyberX
Sim, o projector da esquerda é UV. Isto foi filmado de dia, não se vê grande coisa, tenho de conceber um cenário qualquer em que valha a pena filmar de noite.

A caixa trans-coiso foi um flop. Tenho de ir rapar o meu stock de trans neon e agora aquelas cores novas estilo salmão e yellow neon (felizmente a maior parte das yellow neon já estão no gira-discos a pensar no futuro, é "só" tirá-lo da caixa em que veio de Oeiras)