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. Muito bom seu post amigo.
    Estou procurando algo parecido porem utilizando Java e PI4J. Você sabe como eu conseguiria consumir dados de um receptor de infravermelho com JAVA e PI4J?

    ResponderExcluir
    Respostas
    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.

      Excluir
  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