quarta-feira, 5 de outubro de 2016

Como conectar um sensor infravermelho (IR) VS1838B ao Raspberry Pi e controlar o Kodi

raspberry pi e sensor vs1838b

Os sensores digitais IR capturam a luz infravermelha transmitida por um emissor IR digital. Existe uma grande quantidade de modelos, com diferentes especificações de frequência e com ou sem amplificador embutido. Há ainda modelos específicos para codificações diferentes. Um dos maiores fabricantes de sensores IR é a Vishay, que conta com uma linha com vários modelos de diversos tamanhos e invólucros.

Um dos modelos de IR mais baratos e fáceis de se achar é o VS1838B (que não é da Vishay). Esse modelo já conta com amplificador embutido. Ele é fabricado para utilizar a frequência de 38Khz, uma das mais comuns.

Esse tutorial funciona em todos os modelos do Raspberry Pi exceto os antigos modelos A e B revisão 1 onde no local do GPIO2 era o GPIO0. Para esses será necessário as devidas alterações no software para o GPIO0.


Especificações do sensor VS1838B


As especificações básicas retiradas do datasheet em chinês são as seguintes:

- Tensão de operação 2,7v à 5,5v
- Frequência: 38Khz
- Fbw de 2 à 5Khz, sendo 3,3Khz típica
- Distância máxima de recepção: 20 metros
- Ângulo de recepção: +- 45 graus
- Uso de corrente em repouso: 0,4 - 1,5mA
- Temperatura de operação: -20 à 85°
- Temperatura de armazenamento: -40 à 125°


Conexão elétrica do VS1838B ao Raspberry Pi


A conexão elétrica é simples. O mínimo necessário para funcionar é o componente e um resistor PULL-UP. Em nosso caso iremos utilizar o resistor Pull-up que já existe na placa para o GPIO2. Caso for utilizar outro GPIO (com exceção do GPIO3 que também tem um Pull-up na placa), será necessário ativar o Pull-up interno do gpio. Um exemplo para a placa de expansão Pizula v0.2 que utiliza o GPIO14 seria o comando: gpio mode 15 up. A utilização de outro GPIO também implica na alteração do parâmetro gpio_in_pin no próximo passo.

Ligaremos o sensor no GPIO2, GND e tensão de 3.3v como abaixo.

ligação esquema raspberry pi e sensor ir vs1838b

 

Software inicial para a utilização do receptor infravermelho


Embora a conexão elétrica seja fácil, a parte de software pode ser bem trabalhosa. Usaremos como base o sistema oficial Raspbian Jessie.

Utilizaremos o amplamente conhecido (e antigo) software LIRC (Linux Infrared Remote Control).

Abra o terminal e instale ele com o comando:

$ sudo apt-get install lirc

Aceite a instalação digitando Y e aperte enter.

Primeiramente será necessário realizar algumas modificações para o driver lirc_rpi utilizar o GPIO2. Execute o comando abaixo que irá gravar essa modificação no arquivo /boot/config.txt.

$ sudo sh -c 'echo "\ndtoverlay=lirc-rpi,gpio_in_pin=2" >> /boot/config.txt'

Após isso reinicie o sistema e execute o comando abaixo:

$ dmesg|grep lirc|grep GPIO
[    5.108407] lirc_rpi: auto-detected active low receiver on GPIO pin 2

Ele deverá retornar uma mensagem similar a anterior identificando como "GPIO pin 2"

Para testar se nosso sensor IR está recebendo dados, executamos:

$ mode2 -d /dev/lirc0

Quando alguma tecla do controle remoto for pressionada o retorno deverá ser algo similar a isso, embora não com os mesmos códigos:

pulse 335
space 42843
pulse 3254
space 3355
pulse 361
space 42824


Aperte CTRL+C para sair. Caso não retorne nada reveja as conexões.

O próximo passo será você identificar o modelo do controle remoto que irá usar, seja pelo modelo da TV/SOM/etc, seja verificando alguma etiqueta externa ou interna. A forma mais fácil de se utilizar um controle é se ele já existir na lista de suportados pelo LIRC. A base de dados dele contém todos os arquivos de configuração suportados, algumas das entradas possuem inclusive fotos dos controles, veja nesse link e baixe o arquivo para o seu modelo.

Caso seu controle realmente não estiver na lista, ainda existe a possibilidade de captura e identificação das teclas, um trabalho manual bem chato de se fazer.


Capturando manualmente as teclas com o irrecord


Caso tenha encontrado seu arquivo de configuração, passe para o próximo tópico.

A captura utilizando o utilitário irrecord depende da conclusão correta dos diversos passos que ele irá realizar.

Inicialmente execute o comando:

$ irrecord -d /dev/lirc0 SEUARQUIVO.conf

O arquivo de nome SEUARQUIVO.conf é a configuração do seu controle que será gravada. Observação: caso o foco final for a utilização do controle no kodi, deixe o nome do arquivo como devinput sem .conf que irá facilitar a configuração.

Algumas mensagens de aviso irão aparecer, com "Press RETURN to continue." no final, aperte ENTER. Um outro aviso explicando o próximo passo também irá aparecer, com a mensagem "Press RETURN now to start recording." ao final. Após apertar ENTER novamente, você deverá apontar o controle para o sensor IR e apertar diversas teclas do controle remoto, cada uma por cerca de 1 segundo.

Diversos pontos aparecerão na tela e se a mensagem "Please keep on pressing buttons like described above." aparecer continue apertando. Se tudo ocorreu corretamente a mensagem "Please enter the name for the next button" irá aparecer na tela.

Agora é a hora em que você irá programar cada tecla que queira do seu controle. Será necessário digitar o nome específico interno do LIRC para cada uma. Uma lista dos comandos válidos pode ser vista em outro terminal com o comando: irrecord -l

Continuando o processo do irrecord, se queremos por exemplo programar a tecla de Liga e Desliga, utilizaremos (embora não seja obrigatório, é uma convenção para facilitar) o comando KEY_POWER. Digite no terminal os comandos exatamente como descritos e aperte ENTER. Agora segure a tecla no controle remoto referente. Se a tecla conseguir ser identificada aparecerá a mensagem "Please enter the name for the next button" novamente. Quando acabar de gravar os botões basta apertar ENTER sem escrever nada. Se a mensagem "Checking for toggle bit mask." aparecer, aperte ENTER novamente e aperte uma tecla qualquer do controle remoto o mais rápido possível.

Se tudo ocorrer bem a mensagem "Successfully written config file." irá aparecer na tela.

Caso na hora da detecção das teclas apareça:

"Something went wrong. Please try again."

Você poderá tentar gravar ela novamente 10 vezes, após isso o programa fechará.

Os erros de gravação podem ter diversos motivos, desde frequência de operação do controle diferente, protocolo não suportado, pilhas com pouca carga, controles com defeito, etc. Caso a mensagem acima ocorra e o programa feche após as 10 tentativas, você pode apagar o arquivo SEUARQUIVO.conf e tentar novamente. Se mesmo assim não resolver, há ainda a opção de tentar forçar o modo RAW utilizando a opção -f.

$ irrecord -f -d /dev/lirc0 SEUARQUIVO.conf

O processo de gravação das teclas é igual ao apresentado acima. A diferença ficará na detecção e gravação do arquivo com as teclas no formato RAW.

Se mesmo após algumas tentativas nesse modo também não tiver sucesso, minha sugestão é você tentar outro controle.


Inicialização do daemon lircd e testes


Vamos testar nosso arquivo de configuração SEUARQUIVO.conf ou o que você tenha baixado para o seu modelo. Rode o daemon lircd com seu arquivo:

$ sudo lircd -d /dev/lirc0 SEUARQUIVO.conf

No comando acima levei em conta que o arquivo estava no mesmo diretório. Execute o comando:

$ irw

O aplicativo de testes ficará rodando no terminal a espera de códigos vindos do controle remoto. Ao apertar a tecla power no meu por exemplo, tenho o seguinte retorno no terminal:

0000000000fd9a65 00 KEY_POWER SEUARQUIVO.conf

Se tudo estiver correto você terá um retorno parecido para essa tecla. CTRL+C para fechar.


Executando comandos via IR com um botão específico


Será necessário a criação de um arquivo oculto .lircrc com seu editor preferido na pasta /home do seu usuário (ex do padrão /home/pi/) com o seguinte conteúdo:

begin
prog = irexec 
button = KEY_POWER 
config = echo "Ligando"
end

Os parâmetros button e config deverão ser alterados para o botão e comando desejado. No caso desse exemplo a tecla power já mapeada irá disparar o comando echo "Ligando".

Execute o comando irexec para teste:

$ irexec

Aperte o botão que irá disparar o comando configurado.

Você poderá rodar o irexec em modo daemon também:

$ irexec -d


Utilização do controle no KODI


Uma das coisas mais úteis de um controle é sua utilização com sistemas de media center. Embora seja possível controlar o Kodi via HDMI-CEC nas TVs modernas, você pode querer um controle dedicado somente para isso.

Caso ainda não tenha o kodi instalado, use o comando:

$ sudo apt-get install kodi

Aqui por algum motivo o kodi estava procurando por padrão um arquivo do lirc em /dev, portanto precisei criar um link com:

$ sudo ln -s /var/run/lirc/lircd /dev/lircd

Há outras formas de fazer isso caso queira.

Para o funcionamento no KODI o daemon lircd já tem que estar rodando como foi feito anteriormente. Utilizando o nome do arquivo de devinput o dispositivo automaticamente também terá esse nome e utilizará os parâmetros já definidos em /usr/share/kodi/system/Lircmap.xml. Caso você ache um arquivo de configuração predefinido para seu controle, abra-o e edite o name para "name  devinput".

Após isso basta abrir o KODI e testar seu controle. No meu caso como não havia um arquivo de configuração pré definido, configurei as teclas direcionais do controle, esquerda (KEY_LEFT), direita (KEY_RIGHT), para cima (KEY_UP), para baixo (KEY_DOWN) e a tecla ok (KEY_OK) para teste. Com essa configuração consegui entrar nos menus do KODI e selecionar o que queria. Outra tecla importante para se ter é alguma de exit/voltar para voltar dos menus.


Colocando os programas na inicialização


Para ativar sua configuração do lircd na inicialização, copie o arquivo de configuração para o diretório com o comando abaixo.

$ sudo cp devinput /etc/lirc/lircd.conf

Abra o arquivo /etc/lirc/hardware.conf como root com o editor leafpad:

$ sudo leafpad /etc/lirc/hardware.conf

Altera a linha DRIVER para DRIVER="default" e a linha DEVICE para DEVICE="/dev/lirc0".

Salve o arquivo. Caso queira inicializar o irexec copie o arquivo .lircrc previamente criado para /etc/lirc/lircrc:

$ sudo mv .lircrc /etc/lirc/lircrc

Caso queira inicializar o sistema direto dentro do Kodi, abra o arquivo /etc/default/kodi.

$ sudo leafpad /etc/default/kodi

Altere a linha ENABLED para ENABLED=1. Ao fazer isso o Kodi irá inicializar com as configurações zeradas com outro usuário (kodi), caso queira permanecer com o mesmo usuário (geralmente pi) basta alterar no mesmo arquivo a linha USER para o desejado.


Conclusão


A utilização de controles remotos infravermelho podem auxiliar diversas aplicações. Caso tenha algum problema coloque nos comentários abaixo que tentarei ajudar assim que possível.

3 comentários:

  1. Olá, obrigado! Infelizmente não mexo com java, entretanto você precisa descobrir como capturar os dados direto do LIRCD, que já irá te passar eles mastigados.

    ResponderExcluir
  2. Ótimo o seu post amigo. Estou tentando acender um led pelo controle remoto. Se conseguir acender o led no Raspberry pelo controle remoto, o segundo passo será ligar um ar condicionado, uma lampada, etc.Fiz o código em Python, segui todos os passos conforme o seu exemplo e também de outros posts, e conforme teste que fiz, percebi que na linha lirc.nextcode não está trazendo nenhuma informação, no print sai apenas []
    Segue abaixo o código que utilizei para teste:
    import lirc
    import time

    while 1:
    sockid = lirc.init("LigaLed", blocking = False)
    codeIR = lirc.nextcode()
    print (codeIR)
    time.sleep(2)
    Pesquisei na internet e muitos tem a mesma dúvida, mas em nenhum encontrei uma solução, se você puder dar uma luz, fico muito grato.

    ResponderExcluir
  3. Ola, sou leigo na área, estou querendo instalar android no mesmo e gostria de saber se tem como instalar o IR para usar no android?

    ResponderExcluir