MINDSTORMS EV3 observing Pybricks messages
Enviado: 13 mar 2025, 17:33
Como já havia dito noutra thread tenho andado a queimar as pestanas para poder usar o MINDSTORMS EV3 junto com os hubs Powered Up
A parte mais difícil, receber mensagens ("observar" na nomenclatura usada pelo Pybricks) ficou funcionamente funcional embora ainda seja necessário limar algumas arestas.
Mostro aqui Technic Hub, cada um a enviar ("difundir", de "broadcasting") mensagens no seu canal:
- no canal 1 é enviada a string "Ouch!" sempre que é accionado o sensor de toque;
- no canal 2 é enviada uma string com a cor detectada pelo sensor de cor e distãncia ("Red", "White", "Blue" e "Yellow")
- no canal 3 é enviada uma string indicando o número de vezes que o botão do hub já foi primido ("1", "2"...)
Cada mensagem é enviada durante 200 ms, depois disso o hub entre em radio silence até à mensagem seguinte. No protocolo implementado pelo Pybricks a duração de cada mensagem deve ser um múltiplo de 100 ms pelo que na melhor das hipóteses apenas é possível difundir 10 mensagens por segundo.
O protocolo no fundo imita um beacon Bluetooth Low Energy. A norma BT BLE prevê advertisements de mensagens curtas contendo informação específica (como o ID da empresa, no caso da LEGO 919) ou variável (no caso "Manufacturer Data", que pode ser uma temperatura, uma localização ou um URL) e qualquer cliente BLE pode escutar estas mensagens sem ter de estabelecer uma conexão (que é muito mais dispendiosa e complicada embora tenha a vantagem de depois de estabelecida permitir comunicações mais rápidas, supostamente mais seguras, blabla...).
O EV3 executa um script python que activa um "scan" dos dispositivos BLE por perto e se receber um "advertisement" com o ID da LEGO de um dispositivo com o nome começado por "Pybricks" regista a informação "Manufacturer Data" onde deverá estar o ID do canal usado e a string enviada.
Quando chega uma mensagem no canal certo o script limita-se a verbalizar essa mensagem.
Funciona muito bem só com um Hub a difundir, nem sempre bem com 3, provavelmente menos bem ou mal com mais hubs. E além disso o mecanismo de scan faz cache das mensagens recebidas por isso às vezes, ao mudar de canal, tenho a surpresa de receber em catadupa umas quantas mensagens antigas - no caso do vídeo cinco "Ouch!" que deviam ter sido descartados, tenho de descobrir como limpar esta cache.
o código e alguma documentação (ainda muito no início) podem ser consultados aqui:
https://github.com/JorgePe/EV3-Pybricks-Messaging
Daqui a alguns dias conto mostrar como faço a comunicação no sentido inverso (o EV3 a difundir mensagens no formato Pybricks).
A parte mais difícil, receber mensagens ("observar" na nomenclatura usada pelo Pybricks) ficou funcionamente funcional embora ainda seja necessário limar algumas arestas.
Mostro aqui Technic Hub, cada um a enviar ("difundir", de "broadcasting") mensagens no seu canal:
- no canal 1 é enviada a string "Ouch!" sempre que é accionado o sensor de toque;
- no canal 2 é enviada uma string com a cor detectada pelo sensor de cor e distãncia ("Red", "White", "Blue" e "Yellow")
- no canal 3 é enviada uma string indicando o número de vezes que o botão do hub já foi primido ("1", "2"...)
Cada mensagem é enviada durante 200 ms, depois disso o hub entre em radio silence até à mensagem seguinte. No protocolo implementado pelo Pybricks a duração de cada mensagem deve ser um múltiplo de 100 ms pelo que na melhor das hipóteses apenas é possível difundir 10 mensagens por segundo.
O protocolo no fundo imita um beacon Bluetooth Low Energy. A norma BT BLE prevê advertisements de mensagens curtas contendo informação específica (como o ID da empresa, no caso da LEGO 919) ou variável (no caso "Manufacturer Data", que pode ser uma temperatura, uma localização ou um URL) e qualquer cliente BLE pode escutar estas mensagens sem ter de estabelecer uma conexão (que é muito mais dispendiosa e complicada embora tenha a vantagem de depois de estabelecida permitir comunicações mais rápidas, supostamente mais seguras, blabla...).
O EV3 executa um script python que activa um "scan" dos dispositivos BLE por perto e se receber um "advertisement" com o ID da LEGO de um dispositivo com o nome começado por "Pybricks" regista a informação "Manufacturer Data" onde deverá estar o ID do canal usado e a string enviada.
Quando chega uma mensagem no canal certo o script limita-se a verbalizar essa mensagem.
Funciona muito bem só com um Hub a difundir, nem sempre bem com 3, provavelmente menos bem ou mal com mais hubs. E além disso o mecanismo de scan faz cache das mensagens recebidas por isso às vezes, ao mudar de canal, tenho a surpresa de receber em catadupa umas quantas mensagens antigas - no caso do vídeo cinco "Ouch!" que deviam ter sido descartados, tenho de descobrir como limpar esta cache.
o código e alguma documentação (ainda muito no início) podem ser consultados aqui:
https://github.com/JorgePe/EV3-Pybricks-Messaging
Daqui a alguns dias conto mostrar como faço a comunicação no sentido inverso (o EV3 a difundir mensagens no formato Pybricks).