Página 1 de 1

DIY sensor compatível com LEGO Powered Up

Enviado: 23 mar 2025, 14:57
por CyberX
Andava já há uns tempos com a ideia de tentar uma coisa destas mas como sabia que ia dar trabalho fui adiando.

Até que um tipo viu um video meu no Youtube e perguntou se era possível ligar um 'reed switch" a um hub Powered Up e usar Pybricks para ler o estado (um 'reed switch' é um interruptor magnético, uma ampola pequena de vidro com uma bola lá dentro e 2 contactos, quando se aproxima um íman a bola move-se e fecha o circuito eléctrico entre os 2 contactos, pode ser útil por exemplo para detectar se uma janela está aberta ou fechada có colando um íman à janela).

Ser possível é: pega-se num Tilt Sensor do WeDo2 que já tem lá dentro duas coisas parecidaa e "hackeia-se".

Ou pega-se num microcontrolador e implementa-se o protocolo da LEGO e cria-se de raiz um dispositivo novo. De vez em quando aparecem na net algumas coisas assim, muito mal ou nada mesmo documentadas.

Por isso fui finalmente à procura de como fazer isto e deixar documentado para os próximos.

Porquê um microcontrolador?

Porque de há uns tempos para cá é tudo com microcontroladores. Nos tempos dourados do ZX Spectrum e Commodore C64, havia uma porta de expansão onde podiamos ligar os nossos próprios circuitos e fazer coisas relativamente simples que depois o Basic do computador conseguia entender. Não havia cá "drivers".

Por uns tempos o PC ainda teve isso. Mas ligar uma cena ao bus ISA do PC era de loucos (ainda fiz isso no meu trabalho de final de curso) e obrigava a fazer drivers. Uma forma de contornar isso era usar a porta da impressora (Centronics) ou do rato (RS-232) e usar drivers já existentes. Mas isso tudo acabou, agora um PC só tem USB (nenhum doido se mete a fazer placas PCI ou PCI-X).

Os bricks inteligentes da LEGO também evoluíram (se consideramos isso uma evolução) do mesmo modo e se o MINDSTORMS EV3 ainda tinha USB directo e UART/I2C indirecto (pelas fichas de I/O) o Powered UP já só tem.. bem... "aquilo": uma forma básica de UART não documentada que usa um protocolo LPF2 mal documentado, no mínimo incompleto.

Mas é o que temos.

O melhor que há por aí de documentação é ainda o projecto Pybricks, com uma página dedicada ao protocolo da LEGO:
https://github.com/pybricks/technical-i ... rotocol.md

Mas sem indicações concretas de como fazer um dispositivo.

Depois há por aí alguns projectos soltos, também raramente bem documentados. O melhor que encontrei foi o MyOwnBricks:
https://github.com/ysard/MyOwnBricks

uma library para Arduino (portanto em qualquer coisa parecida com C++) justamente para construir os seus próprios sensores compatíveis com LEGO Powered Up. Com alguns exemplos concretos de como fazer sensores que imitam sensores já existentes (nomeadamente o Tilt Sensor e o Color and Distance Sensor).

E com uma nota de agradecimento à minha pessoa por ter contribuído para o reverse engineering do protocolo (eu que mal pesco um boi do protocolo!) bem como ao Philo (que ele sim, com um Analisador Lógico, conseguiu alguma coisa).

Bem, eu ao lado do Philo... vamos ter de fazer alguma coisa para justificar tamanha honra :D

Instalei a library dele, tentei emular um Tilt Sensor com um ESP32 (que não sendo um Arduino é um dos milhentos controladores que podem ser usados como se fossem Arduino) e deu-me um erro de permissões, eu que não percebo nada de C++ lá descobri que uma das classes ou coisa parecida num dos ficheiros tinha de ser declarado como Public para poder ser usado, ultrapassei o problema para depois não ter nada a sair pela porta série (UART).

Isto deu um pouco mais de trabalho, a resposta a um comentário feito pelo Anton Vanhoucke há ano e meio ajudou - o tipo fez o projecto dele para uma arquitectura diferente do ESP32, baseada no Atmega32u4 que tem duas UART - ele usou uma para comunicar com o hub LEGO (Serial1), a outra para debug (Serial0). O ESP32 tem três UARTS mas a que ele usou para comunicar com o hub é internamente usada para comunicar com memória flash, tem de ser remapeada para outros pinos, lá descobri como fazer isto e pronto, temos o nosso primeiro Tilt Sensor a funcionar.

Ele implementa apenas o modo 0 do Tilt Sensor, que envia dois valores (dois ângulos de inclinação). Eu só queria ler um interruptor portanto um valor bastava-me. E queria o meu próprio sensor (com um nome e um ID diferentes de sensores da LEGO, para evitar confusões). Por isso tive de analisar o código e experimentar muitas combinações até conseguir.

Criei assim um Custom Sensor, que se identifica com o ID 36 (que não corresponde a nenhum dispositivo conhecido) e diz ao Hub que tem um modo apenas chamado MYOWNSWITCH que fornece valores de um byte apenas (mais concretamente signed int8).

Com o Pybricks é possível usar este dispositivo com a classe PUPDevice, que identica o dispositivo e expõe os modos disponíveis:

Código: Selecionar todos

    {'id': 36, 'modes': (('MYOWNSWITCH', 1, 0),)}
Neste caso o dispositivo tem o ID36 (nenhum da LEGO) e um modo apenas ('MYOWNSWITH que é o modo zero) que permite ler um valor do tipo 0 (que é o int8).

O que significa que pode ser acedido com a função 'read()' usando como argumento '0' (zero, o modo)

E com este código no Pybricks consigo ativar um motor quando primo um botão no ESP32:

Código: Selecionar todos

from pybricks.hubs import TechnicHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait
from pybricks.iodevices import PUPDevice

hub = TechnicHub()
myOwnSensor = PUPDevice(Port.A)
mot = Motor(Port.B)

print('\n')
print(myOwnSensor.info())
while(True):
    if myOwnSensor.read(0)[0] == 100:
        print('ON')
        mot.run(360)
    else:
        print('OFF')
        mot.stop()
    wait(100)
[media] [/media]

Agora vou limpar o que fiz e sugerir ao autor do MyOwnBricks as alterações para a library dele funcionar com ESP32 e se ele achar por bem adicionar a minha classe CustomSensor ao projecto dele.

To be continued...

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 23 mar 2025, 20:52
por AVCampos
Sinceramente, não sei o que dizer para além de "pôça" e "uau". 🤯

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 24 mar 2025, 22:31
por CyberX
boca fechada não entra mosca :D

Só uma pequena actualização: fui ali à loja da esquina e comprei 2 microcontroladoes para testar:

ESP32-S3-Zero
Imagem
https://www.waveshare.com/wiki/ESP32-S3-Zero

Raspberry Pi Pico 2
Imagem
https://www.raspberrypi.com/products/ra ... pi-pico-2/

Ambos custam entre €6 a €8, são mais pequenos que o NodeMCU32 que usei no video anterior (o ESP32-S3-zero é mais ou menos do tamanho de um selo, para aqueles que sabem o que é um selo dos correios) e gastam menos energia (o RPi Pico 2, como não tem Bluetooth nem Wi-Fi, deve ser o que gasta menos).

Ambos funcionam, recebendo energia (3,3 Volt) directamente da ficha Powered Up.

Estou só à espera que o autor do MyOwnBricks aprove o que lhe mandei para adicionar estes dois. Se o tipo não estiver para aí virado tenho um fork do projecto dele no meu github, meto lá as alterações e fica à disposição:

https://github.com/JorgePe/MyOwnBricks

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 26 mar 2025, 15:01
por CyberX
Com o ESP32-S3-Zero e um mero cabo em vez do backpack do sensor de distância do SPIKE:



Fica bastante mais pequeno.
No video uso primeiro um tactile switch e depois um reed switch com um íman LEGO para mostrar ao tipo que me perguntou se era possível.

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 26 mar 2025, 15:17
por AVCampos
É verdade, a complicação nos dias de hoje para um microcontrolador conseguir ler um simples interruptor é mesmo... coiso. :-\

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 26 mar 2025, 15:37
por CyberX
Um microcontrolador ler um simples interruptor continua a ser cagativo, no ambiente Arduino é só isto:

Código: Selecionar todos

#define SWITCH_GPIO 6

void setup() {
    pinMode(SWITCH_GPIO, INPUT_PULLUP);
    ...
void loop() {
    // Get data from GPIO pin
    if( digitalRead(SWITCH_GPIO) != HIGH) {
        ...
    }
    else {
       ...
    }
A questão aqui é que a LEGO decidiu não expor nenhum GPIO dos microcontroladores STM32 usados nos hubs Powered Up. Lá terá as suas razões (se calhar algumas até do mesmo tipo que justificou as tampas das pilhas serem aparafuzadas).

Ou melhor, decidiu expor apenas dois em concreto: TX e RX (suponho que os pinos 5 e 6 das portas Powered Up irão directo ao microcontrolador). podia ser suficiente para fazer resmas de dispositivos.. se tivesse divulgado o protocolo e tivesse oferecido um ambiente de desenvolvimento melhor ou ao menos um SDK.

Hoje até já existe suporte do ambiente IDE para o STM32. Se os hubs da LEGO tivessem apenas uma porta USB a mais, podia-se ligar um HUB a um computador, lançar o Arduino IDE, adicionar o plugin para STM32 e desenvolver projectos em C++ capaz de usar as milhentas bibliotecas já existentes no universo Arduino.

Mas não. Tinha de ser tudo por Bluetooth BLE.

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 28 mar 2025, 15:08
por CyberX
Publiquei as intruções. É uma versão ainda não completa mas já suficientemente exaustiva para poder ser usada:

https://github.com/JorgePe/DIY-PU-Sensor

O Ysard, autor do MyOwnBricks, tem resmas de cenas no github e não me respondeu. Pode até nunca o fazer por isso nas instruções sugiro usar o meu fork para poupar o trabalho de andar a editar a library dele.

Quando/se ele adequar o projecto dele eu actualizo do meu lado e eventualmente elimino o meu fork, é escusado poluir a net com múltiplas versões da mesma coisa.

Entretanto estou à espera de chegou um microcontrolador semelhante ao do Raspberry Pi Pico mas mais pequeno, o Seeed Studio XIAO R2040. Funciona como os anteriores e é até agora o mais barato de todos (menos de 6€). Quando chegar faço Vou fazer comparações de consumos para quem possa estar preocupado com a duração da bateria do Hub ao usar uma cena destas.

No Tumblr coloquei algumas fotografias:
https://www.tumblr.com/cyberxstuff/779256212625801216
https://www.tumblr.com/cyberxstuff/779257750010167296

mostro aqui apenas três:

o backpack do sensor de distância do SPIKE, que expõe as ligações da ficha Powered Up:

Imagem
(usei uma ponta Torx T6 para desaparafusar os 2 parafusos)

Um cabo PU a que soldei headers Dupont como alternativa ao backpack:


Imagem

O ESP32-S3-Zero com o cabo acima e mais um par de cabos com garras para ligar um switch e um outro cabo Y para derivar a massa (GND) porque esta placa tem apenas um pino GND disponível (as placas maiores, como o NodeMCU-ESP32 e o Raspberry Pi Pico 2, têm vaŕios pinos GND):

Imagem

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 29 mar 2025, 09:14
por CyberX
Comparação de consumos dos vários microcontroladores:

Setup:
- Technic Hub com Pybricks
- Motor na porta B
- Custom Sensor na Porta A, sem nenhum switch ligado (apenas os fios 3V3, GND, TX e RX)

Leitura da corrente (em mA) fornecida pela bateria do Hub: hub.battery.current()
Registados os valores miníno, máximo e médio ao fim de alguns segundos e novamente ao fim de um par de minutos
o valor médio é calculado com base nos últimos 10 valores, amostrados a intervalos de 100 ms
o sensor também é questionado no mesmo loop de 100 ms


por ordem crescente de área ocupada pelo circuito:

Seeed Studio XIAO 2040 - Min: 88 Max: 95 Avg: 90.3
Waveshare ESP32-S3-Zero - Min: 103 Max: 111 Avg: 104.7
Raspberry Pi Pico 2 - Min: 76 Max: 81 Avg: 78.1
Joy-IT NodeMCU-ESP32 - Min: 108 Max: 116 Avg: 111.3

O valor Max tende a ocorrer no início da execução, ao fim de uns 15 segundos o consumo estabiliza por isso é bastante
razoável assumir o valor Avg como expectável.

O Raspberry Pi Pico 2 é o que menos corrente consome. Surpreendeu-me já que o XIAO 2040 é da mesma família e tem um microcontrolador mais fraco (RP2040 em vez de RP2350) esperava que consumisse menos.

Os ESP-32, com Wi-Fi e BT/BLE consomem mais como esperado. Mesmo assim o ESP32-S3-Zero consome menos que o NodeMCU-ESP32

Num cenário destes, com pilhas de 2600 mAh, um Hub aguentar-se-ia 50 horas com um Raspberry Pi Pico 2.
Um pouco menos com o XIAO 2040 que contudo ocupa apenas metade do espaço e custa 5,75€ contra 6,89 € e é mais fácil de usar com o Arduino IDE sendo por isso neste momento o meu preferido para futuros projectos.

Na verdade aguentariam todos mais, já que durante a leitura o Hub esteve sempre ligado por BT-BLE ao IDE do Pybricks e não faço ideia quanto consome esta sessão BLE, teria de implementar um mecanismo de logging qualquer para depois recolher os valores num cenário autónomo.

Além disso todos estes microcontroladores têm previstos mecanismos de poupança de energia que poderão ajudar a reduzir consumos (mas é preciso implementar esses mecanismos no código Arduino). E se reduzirmos do lado do Hub a frequência com que lê o sensor talvez se consigam melhores resultados.

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 29 mar 2025, 19:00
por CyberX
Um caso concreto, "ready to production" - um sensor magnético Powered Up

Dimensões: 6x6x2
(com algum jeitinho e as peças certas conseguia-se 5x5x2, com muito jeitinho talvez até menos)

Imagem

Microcontrolador Seeed Studio XIAO RP2040 - 5,75€
Reed Switch 10W - 0,80€
Cabo Powered Up - 11,2€ (tenho de mandar de vir uns quantos da China)
umas quantas peças LEGO que tinha nas gavetas - valor indeterminado mas provavelmente menos de 3€

Horas-Homem dedicadas apenas a isto: 1
Horas-Homem dedicadas ao raio da investigação para poder fazer isto numa hora: umas 40



O reed switch não está centrado, por vezes tenho de "apalpar terreno" para que o íman actue. Algum 'blu tack' ou plasticina ou Super Gorila de Mentol podem ajudar a melhorar esta parte e se calhar também uma marca no tile 6x6 tipo "x marks the spot".

Tudo soldado directamente à board:

Código: Selecionar todos

pin 1 (D0 ou GPIO0 ou P26) --->  reed switch  
pin 7 (TX ou P0)           --->  LEGO PU wire 6 (ID2)
pin 8 (RX pin ou P1)       --->  LEGO PU wire 5 (ID1)
pin pin 13 (GND)           --->  LEGO PU wire 3 (GND) + reed switch
pin 12 (3V3)               --->  LEGO PU wire 4 (VCC)
A programação é feita ligando um cabo USB-C entre o PC e a board SEM ligar nada ao Hub LEGO. Depois de transferido o programa E REMOVIDO o cabo USB fica pronto a usar.

NÃO SE DEVE LIGAR SIMULTANEAMENTE o cabo USB e o cabo Powered Up ao LEGO, sob pena de se curto-circuitar a parte da board que fornece energia ao microcontrolador.

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 16 abr 2025, 00:24
por CyberX
Estendi o sensor com um modo de output - é possível enviar dados do Hub para o microcontrolador.



Isso permite-me ligar cenas mais complexas aos hubs - tudo o que seja possível ligar a um Arduino (e há resmas de libraries já implementadas) fica ao alcance.

No video 3 LEDs e um servo RC de modelismo. Tenho de ir à procura de algumas das tralhas que tenho para Arduino como electroímanes e lasers e depois um dia destes meto-me com protocolos mais complexos como RS485 (DMX) e MIDI.

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 16 abr 2025, 14:17
por AVCampos
Estou já a imaginar o Rockódromo com esses upgrades todos. 8)

Geradores de fumo baseados em óleo/parafina/whatever é que são capazes de não dar muito jeito: embora sejam menos visíveis, os piezoeléctricos com água são capazes de ser mais práticos.

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 16 abr 2025, 21:52
por CyberX
É pah para isso não preciso disto, já mostrei como se fazia há uns quantos anos - emulas um motor PU dos comboios (só ligar um dos pinos ID à massa e o outro aos 3.3 Volt) e ligas o gerador de fumo ou o piezo aos pinos M1 e M2, se precisares de garantir que a tensão nunca é negativa basta juntar uma ponte rectificadora e no caso do piezo talvez precises baixar ainda mais a tensão juntando mais alguns diodos.

A minha ideia é mesmo cenas digitais, tipo um display LCD, um gerador de som (que saudades do sintetizador de voz dos tempos do ZX Spectrum) ou talvez uns actuadores mais elaborados como foram os actuadores lineares que chegaram a fazer para o NXT/EV3.

E conversores de protocolo... teoricamente é possível um adaptador Wi-Fi mas não me vou meter nisso, talvez me fique poir coisas que por baixo são baseadas no bom e velhinho TX/RX: RS232, RS485 (DMX mais concretamente), MIDI... se ainda houvesse SIMs GSM2 à venda até talvez um modem por telemóvel :D

Aquelas cenas que era fixe mesmo não ter arranjado emprego justamente agora.

Re: DIY sensor compatível com LEGO Powered Up

Enviado: 23 abr 2025, 18:19
por CyberX
Primeiro conversor de protocolo implementado: midi2pu - um conversor MIDI para LEGO