Notícias:

Oeiras BRInCKa 2018 de 10 a 13 de fevereiro de 2018! Marca já na tua agenda!

[IR] Um comando que os comande a todos

Offline CyberX

  • *
  • 2537
    • Brickshelf
[IR] Um comando que os comande a todos
« em: 12 Novembro 2017, 17:20:02 pm »
Os que tiverem participado nas BRInCKA's mais recentes talvez conheçam o 2949 LEGO DUPLO RC Dozer, costumo levar os dois exemplares que comprei por uma pechincha numas férias no Algarve e que faz as delicias dos mais pequenos na mesa DUPLO ou na Technic:



Descobri que este conjunto utiliza o mesmo protocolo de infra-vermelhos utilizado nos comboios RC, no Bionicle Manas, no RC Nitro Flash e no MINDSTORMS Spybotics. Foi o primeiro protocolo RC por IR que a LEGO implementou mas teve pouco sucesso e foi pouco depois substituído pelo Power Functions IR que ainda hoje existe (como no 42065 Tracked Racer).

Bom, enquanto tentava recuperar o MINDSTORMS Spybotics descobri como snifar o protocolo com um Arduino, consegui replicar os sinais com um Arduino e com um Raspberry Pi e finalmente consegui entender o formato e convertê-lo para o formato LIRC (usado em Linux para gerir os comandos IR).

Como anteriormente já conseguia controlar PF IR a partit de um PC (ou EV3) fundi ambos os protocolos e consigo agora controlar TODOS os dispositivos IR da LEGO:



Ironia das ironias, o DUPLO RC Dozer é o único que não reage bem aos meus comandos, tem uma tendência irritante para empancar ao fim de uns poucos comandos. Pode ser que consiga melhorar a coisa mais tarde.

Oportunamente experimentarei o método com um RC Nitro Flash e com um RC Train.

Muitos mais detalhes no blog, código no GitHub:
http://ofalcao.pt/blog/2017/decoding-old-lego-infrared-protocol
https://github.com/JorgePe/ir-spybotics

Não posso esquecer os devidos agradecimentos ao código aberto de:
- Conor Cary
- Diomidis Spinellis

« Última modificação: 12 Novembro 2017, 18:56:13 pm por CyberX »
«De génio, criança e louco... porquê só 1 pouco?»
Jorge Pereira - sócio 159
http://ofalcao.pt/
http://www.brickshelf.com/cgi-bin/gallery.cgi?m=jorgepereira

Offline Conchas

  • *
  • 13437
  • LEGO @nywhere
    • TechnicBRICKs
Re: [IR] Um comando que os comande a todos
« Responder #1 em: 12 Novembro 2017, 18:03:53 pm »
Isto tem um nome...
Muito tempo livre!!!.... ;D ;D

:clapping: :clapping: :clapping:
FCorreia
We are working to build a better :plug:
LEGO Fan: A Lifelong Experience - Play Well (Leg Godt)

Oeiras 2018     10-13.Fev

Online AVCampos

  • *****
  • 10677
  • Gatos e robots NÃO combinam bem
    • TechnicBRICKs
Re: [IR] Um comando que os comande a todos
« Responder #2 em: 12 Novembro 2017, 22:19:58 pm »
Xalente! :clapping: Protocolos IV por protocolos IV, fica só a faltar o RCX/Scout e tens aí o verdadeiro "to rule them all". 8)

Isto tem um nome...
Muito tempo livre!!!.... ;D ;D
Cheira-me que queres impingir mais um "voluntariado" de hacatão de Java... :D

Offline CyberX

  • *
  • 2537
    • Brickshelf
Re: [IR] Um comando que os comande a todos
« Responder #3 em: 12 Novembro 2017, 22:20:53 pm »
O que queres tu dizer com fica a faltar?  >:D
«De génio, criança e louco... porquê só 1 pouco?»
Jorge Pereira - sócio 159
http://ofalcao.pt/
http://www.brickshelf.com/cgi-bin/gallery.cgi?m=jorgepereira

Offline CyberX

  • *
  • 2537
    • Brickshelf
Re: [IR] Um comando que os comande a todos
« Responder #4 em: 12 Novembro 2017, 22:25:02 pm »
Cheira-me que queres impingir mais um "voluntariado" de hacatão de Java... :D

Ontem (ou foi já hoje?) t ambém me cheirou.
Eu agora hacatões só python ou quando muito Arduino C
(embora para gerar os timings PF tenha corrido hoje um programa java... mais uma vez uma dor até perceber como raio se corria aquilo)
«De génio, criança e louco... porquê só 1 pouco?»
Jorge Pereira - sócio 159
http://ofalcao.pt/
http://www.brickshelf.com/cgi-bin/gallery.cgi?m=jorgepereira

Online AVCampos

  • *****
  • 10677
  • Gatos e robots NÃO combinam bem
    • TechnicBRICKs
Re: [IR] Um comando que os comande a todos
« Responder #5 em: 12 Novembro 2017, 23:01:12 pm »
O que queres tu dizer com fica a faltar?  >:D
Bem, não mencionaste esse protocolo na mensagem inicial... :angel:

Eu agora hacatões só python ou quando muito Arduino C
Eu estou interessado em aprender Python para EV3 mas não seria justo cair de pára-quedas num hacatão sem ter tido a pachorra de ler sobre isso nem praticar alguma coisa. :-[

Offline Conchas

  • *
  • 13437
  • LEGO @nywhere
    • TechnicBRICKs
Re: [IR] Um comando que os comande a todos
« Responder #6 em: 12 Novembro 2017, 23:53:37 pm »
Ontem (ou foi já hoje?) t ambém me cheirou.

Por falar nisso... Não te esqueças de me enviar as tuas notas sobe a instalação/configuração do ambiente com o Eclipse, sff.
FCorreia
We are working to build a better :plug:
LEGO Fan: A Lifelong Experience - Play Well (Leg Godt)

Oeiras 2018     10-13.Fev

Offline CyberX

  • *
  • 2537
    • Brickshelf
Re: [IR] Um comando que os comande a todos
« Responder #7 em: 13 Novembro 2017, 07:26:34 am »
Ontem (ou foi já hoje?) t ambém me cheirou.

Por falar nisso... Não te esqueças de me enviar as tuas notas sobe a instalação/configuração do ambiente com o Eclipse, sff.

By your command:

Código: [Seleccione]
leJOS - 5 de Abri l  2017
=========================
Eclipse:
download + extract  "eclipse-java-neon-3-linux-gtk-x86_64.tar.gz" (168.1 MB)
duplo click "eclipse"

default Workspace: /home/jxpereira/workspace
mas deixei checked "Use this as the default and do not ask again"

"Welcome screen"

plugin:
Help > Install New Software > Add
Name: leJOS EV3
Location: http://www.lejos.org/tools/eclipse/plugin/ev3/

check "leJOS EV3 Support" (inclui apenas o plugin, "0.9.1.201511161011")

Next
Review, Next
Review Licenses, I accept..., Finish

Warning: "... unsigned content..." OK

Restart Eclipse? yes

Window > Preferences > leJOS EV3

EV3_HOME: /home/jxpereira/Downloads/LEGO/LeJOS/leJOS_EV3_0.9.1-beta
x Run Tools in separate JVM
x Run program after upload


New Project (LeJOS EV3 Project)
Project Name: Plugin Test
Finish

seguir https://sourceforge.net/p/lejos/wiki/Developing%20with%20leJOS/

não pesco nada mas passei um programa main que gera lixo [7 meses depois acho que no ecran do EV3] :

// Inicio
package plugin_test;

import lejos.hardware.lcd.LCD;
import lejos.utility.Delay;

public class test {
public static void main (String[] args) {
// TODO Auto-generated method stub
LCD.drawString("I hate Java but I am stubborn!", 0, 4);
Delay.msDelay(5000);
}
}
// Fim

diz "unsupported major.minor version" ??

tive de forçar Java 1.7
"You need to tell Eclipse to compile Java 7 compatible byte code. Go to Windows -> Preferences -> Java -> Compiler and set "Compiler compliance level" to 1.7."

Basicamente instala o Eclipse, adiciona o plugin do LeJOS e vai a "Windows -> Preferences -> Java -> Compiler" e muda "Compiler compliance level" para  "1.7."

Isto do Compliance Level 1.7 porque o Java que terás enfiado na imagem do cartão microSD é 1.7, no meu caso foi
"ejre-7u60-b19-ejre-7u60-fcs-b19-linux-arm-sflt-headless-07_may_2014.tar.gz"

A partir daqui foi mesmo só problemas com o Java em si e não com o Eclipse.
« Última modificação: 13 Novembro 2017, 07:31:24 am por CyberX »
«De génio, criança e louco... porquê só 1 pouco?»
Jorge Pereira - sócio 159
http://ofalcao.pt/
http://www.brickshelf.com/cgi-bin/gallery.cgi?m=jorgepereira

Offline Conchas

  • *
  • 13437
  • LEGO @nywhere
    • TechnicBRICKs
Re: [IR] Um comando que os comande a todos
« Responder #8 em: 13 Novembro 2017, 07:36:57 am »
:fixe:
FCorreia
We are working to build a better :plug:
LEGO Fan: A Lifelong Experience - Play Well (Leg Godt)

Oeiras 2018     10-13.Fev

Offline CyberX

  • *
  • 2537
    • Brickshelf
Re: [IR] Um comando que os comande a todos
« Responder #9 em: 13 Novembro 2017, 12:05:50 pm »
@AVCampos Por acaso já capturei os sinais do Comando IR do RCX/Scout e consigo replicá-los, mas por enquanto só com o Arduino.

Como eu quero o LIRC (por razões que hei-de explicar daqui a uns dias) preciso de entender os resultados, talvez me possas ajudar mais rapidamente que o Google.

Um botão do comando RCX gera 100 "toggles". Assumindo que 1 bit dura 417 us consigo converter o "A Forward" para uma sequência de 221 bits. É muito bit para o LIRC, não que seja impossível mas é muita coisa, 92.158 milisegundos para enviar um simples comando.

O comando em si, de acordo com a teoria, tem «apenas» 11 bytes:
55 FF 00 D2 2D 00 FF 08 F7 DA 25
(header + mensagem = D2 00 08 + chksum = DA, sendo que tanto para a mensagem como para o chksum cada byte é seguido do seu complemento)

Juntando um start bit, um odd parity bit e um stop bit a cada byte dá 121 bits, ligeiramente mais de metade do que eu apanho.

A minha pergunta é:
Tens ideia se o commando RCX envia a mesma mensagem mais que uma vez?

«De génio, criança e louco... porquê só 1 pouco?»
Jorge Pereira - sócio 159
http://ofalcao.pt/
http://www.brickshelf.com/cgi-bin/gallery.cgi?m=jorgepereira

Online AVCampos

  • *****
  • 10677
  • Gatos e robots NÃO combinam bem
    • TechnicBRICKs
Re: [IR] Um comando que os comande a todos
« Responder #10 em: 13 Novembro 2017, 13:14:37 pm »
Queres dizer se envia um comando de "start" quando se prime o botão e "stop" quando se larga? Tenho idea de que transmite continuamente enquanto o botão está premido.

Em todo o caso, nunca mais consegui encontrar o meu comando, portanto não consigo confirmar. :'(

Offline CyberX

  • *
  • 2537
    • Brickshelf
Re: [IR] Um comando que os comande a todos
« Responder #11 em: 13 Novembro 2017, 13:39:43 pm »
Essa era uma hipótese (o comando dos Manas e dos RC Nitro Flash faz mais ou menos isso).
Outra hipótese era simplesmente enviar várias vezes o comando só porque alguém na LEGO achou que sim.

Consegui identificar o header no meio de tanto bit e efectivamente tenho dois headers em cada uma das minhas capturas.
Pelos vistos o sketch de Arduino que eu estou a usar pára a captura no byte #100 e por isso a segunda mensagem está incompleta (e desconheço se virão mais mensagens depois desta mas também não é importante).

Cortei o resultado da captura no início do segundo header e testei, funciona.
Assim tenho 6 comandos:

A Fwd com 58 toggles
A Rev com 54
B Fwd com 52
B Rev com 58
C Fwd com 54
C Rev com 54

Mastigando isto entre folha de cálculo e python dá só para o primeiro comando, "A Fwd":
- tem 121 bits como previsto
- em binário:
Código: [Seleccione]
0101010101101111111111000000000110010010111101011010011000000000110111111111100001000001011101111010010110110101010010001- em hexadecimal:
Código: [Seleccione]
0xaadff80325eb4c01bff082ef4b6a91
Se não me tiver enganado em nada é só meter isto no ficheiro de configuração do LIRC com mais meia dúzia de parâmetros.

To be continued...
«De génio, criança e louco... porquê só 1 pouco?»
Jorge Pereira - sócio 159
http://ofalcao.pt/
http://www.brickshelf.com/cgi-bin/gallery.cgi?m=jorgepereira

Offline CyberX

  • *
  • 2537
    • Brickshelf
Re: [IR] Um comando que os comande a todos
« Responder #12 em: 13 Novembro 2017, 23:48:19 pm »
@AVCampos case closed, agora é mesmo universal.



O formato tipico do LIRC não prevê comandos com mais que 64 bits e como o RCX e o Scout usam 121 não deu para usar duma ponta à outra o mesmo método que usei para o outro protocolo.
Felizmente o LIRC prevê um modo "raw codes" para comandos mais tagarelas como certos aparelhos de ar condicionado e lá consegui safar-me com um workaround na parte final.

Amanhã publico o método e o código.

Próximo passo: reforçar o meu transmissor LIRC ou arranjar um mais abrangente (o meu tem um alcance de cerca de 3 metros mas os LEDs têm uma abertura de apenas +/- 10º, tenho de colocar mais LEDs para abrir o leque e isso obriga-me a aumentar a potência).
«De génio, criança e louco... porquê só 1 pouco?»
Jorge Pereira - sócio 159
http://ofalcao.pt/
http://www.brickshelf.com/cgi-bin/gallery.cgi?m=jorgepereira

Online AVCampos

  • *****
  • 10677
  • Gatos e robots NÃO combinam bem
    • TechnicBRICKs
Re: [IR] Um comando que os comande a todos
« Responder #13 em: 14 Novembro 2017, 07:39:35 am »
os LEDs têm uma abertura de apenas +/- 10º, tenho de colocar mais LEDs para abrir o leque e isso obriga-me a aumentar a potência).
Podes lixar o topo aos LEDs para não fazer tanto efeito de lente, mas naturalmente a luz vai sair mais espalhada e portanto pode ser preciso à mesma mais LEDs.

Offline CyberX

  • *
  • 2537
    • Brickshelf
Re: [IR] Um comando que os comande a todos
« Responder #14 em: 20 Novembro 2017, 15:58:48 pm »
Conforme tinha dito, a explicação de como utilizar o LIRC com o RCX ou o Scout:

http://ofalcao.pt/blog/2017/decoding-rcx-ir-command-protocol

no final do artigo tenho os links para 3 ficheiros de configuração que permitem utilizar o LIRC para controlar:
  • LEGO OLD IR
  • LEGO PF
  • LEGO RCX

Mais tarde hei-de acrescentar outros ficheiros de configuração (o PF por exemplo, é tudo-ou-nada, não é o ideal para controlar comboios PF, para isso preciso PWM).

O ficheiro para LEGO RCX ainda não está completo, só permite controlar motores, falta-me adicionar os comandos para execução de programas e som. Um dia destes, quando tiver oportunidade, agora tenho outra coisa em mãos.

Antes que venham dizer que "ah e tal não é completamente universal, falta o EV3", testei com meu EV3 a correr o programa de origem que permite o comando por IR e funciona tb (o comando IR do EV3 é um comando PF disfarçado por isso basta enviar comandos PF).
«De génio, criança e louco... porquê só 1 pouco?»
Jorge Pereira - sócio 159
http://ofalcao.pt/
http://www.brickshelf.com/cgi-bin/gallery.cgi?m=jorgepereira