LEGO, som e luzes com Pybricks
Enviado: 14 jun 2026, 11:47
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:
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)