Agora que o pybricks já tem uma classe UART bastante evoluída, decide experimentar.
UART é basicamente uma porta série, como as antigas COM do tempo em que se usavam ratos e modems RS232. Ainda persiste nos Raspberry Pi, Arduinos e milhentos gadgets IoT.
A norma MIDI nasceu como um protocolo série, 8 bits sem paridade mais um stop bit (8N1). A única diferença relativamente a outros protocolos série ainda em uso é a velocidade: 31250 baud/s em vez dos habituais múltiplos de 9600.
Felizmente o Pybricks permite escolher o baud rate e a UART dos microcontroladores escolhidos pela LEGO não tem qualquer problema com este valor.
Restava apenas a questão do MIDI original não prever que dezenas de anos depois os microcontroladores iam usar alimentações de 3.3 Volt e níveis lógicos dependentes disso. Mas a utilização ainda é possível, desde com alguns acertos previstos nas revisões mais recentes da norma. Por exemplo para ligar o pino TX a um ficha MIDI DIN 5 convencional são necessárias 2 resistências.
Bem: um cabo Powered Up, 2 resistências, meia dúzia de linhas de código e temos um hub LEGO a enviar instruções MIDI para um sintetizador.
Na prova de conceito limitei-me a espetar as resistências e o fio de massa na ficha DIN 5 F do sintetizador. Mas depois arranjei uma cabo MIDI com ficha DIN 5 M de um lado e jack TRS M do outro (de há uns anos para cá os fabricantes começaram a usar fichas jacks por serem muito menos volumosos que as fichas DIN e provavelmente tb muito mais baratos). Foi só ligar as ditas resistências e a massa a uma ficha TRS F e pronto, temos um cabo.
o programa do video gera notas aleatórias num intervalo ajustável pelo motor da esquerda; o motor do meio ajusta a duração das notas e o motor da direita ajusta o intervalo entre cada nota.
Código: Selecionar todos
from pybricks.hubs import TechnicHub
from pybricks.parameters import Port
from pybricks.tools import wait
from pybricks.iodevices import UARTDevice
from urandom import randint
from pybricks.pupdevices import Motor
hub = TechnicHub()
ser = UARTDevice(Port.A, baudrate=31250)
mB = Motor(Port.B)
mC = Motor(Port.C)
mD = Motor(Port.D)
mB.reset_angle(0)
mC.reset_angle(0)
mD.reset_angle(0)
ba = bytearray(3)
print()
while True:
# read motors
note_range = 6 + 12 * int(mB.angle() / 40)
note_length = 100 + int(mC.angle() * 5)
tempo = 100 + int(mD.angle() * 5)
print('Note Range: ', note_range)
print('Note Length: ', note_length)
print('Tempo: ', tempo)
print()
# pick a random note to play
x = randint(60 - note_range, 60 + note_range)
# play note
ba[0] = 144
ba[1] = x
ba[2] = 127
ser.write(ba)
wait(note_length)
# stop note
ba[0] = 128
ba[1] = x
ba[2] = 0
ser.write(ba)
# pause between notes
wait(tempo)
Chegaram ontem, espero poder experimentar isto os próximos dias.
Para o Alexandre Campos: sim, com pybricks podes ligar um hub Powered Up a um RCX, só precias ajustar os níveis 3V3 para o habitual TTL de 5V.
