Manual

do

Maker

.

com

Sensor infra-vermelho com Raspberry

Sensor infra-vermelho com Raspberry

Sensor infra-vermelho

"Por que utilizar um sensor infra-vermelho com Raspberry 3, sendo que ele tem WiFi, Bluetooth LE e ethernet?" - Talvez você se pergunte isso, mas tudo tem sua razão. E posso afirmar seguramente; é mais um protocolo disponível e isso aumenta a convergência digital, de modo que você poderá concentrar diversos dispositivos com diferentes protocolos em um único hardware. Estou me apoiando nessa opinião com segurança porque estou certo de que não é só minha, já que a Orange Pi e a Banana Pi vem com o sensor IR nativo na board.

Sensor infrared na Raspberry

Eu gostei bastante da RPi 3, fiz dois artigos a respeito para configurar o Bluetooth em modo beacon (e escreverei outras configurações de beacon com outros dispositivos), mas depois que recebi minha Banana Pi M3, confesso que senti falta do IR na RPi.

Kit infrared (infra-vermelho) para Raspberry

Obviamente não existe um kit especifico para Rasbperry, qualquer um serve e isso você encontra aí nos parceiros do blog, no carrossel que fica no início de cada página. Mas eu peguei um com um "pequeno" diferencial e, pra ver, os detalhes fazem toda a diferença! Eu comprei esse kit (recomendo esse vendedor, já fiz várias compras com ele e é rápido e confiável) que vem os jumpers fêmea-fêmea, o controle, o receptor (e ótima qualidade, como você pode ver. É igual ao da BPi) e um LED infra-vermelho extra justamente para fazer interface com dispositivos inteligentes.

Eu já escrevi um artigo sobre como fazer controle remoto com Arduino e eu só tinha o emissor do controle remoto, que desmontei para poder fazer o artigo. Dessa vez não preciso "destruí-lo"!

Wiring do infra-vermelho com o Raspberry Pi

Primeiro, estou utilizando o RPi 3, mas obviamente serve para qualquer RPi e o GPIO pode variar conforme a sua vontade, já que isso é configurável via software. No exemplo tentei utilizar o GPIO do pino 40 porque fica na borda e assim fica mais visível o wiring. Estratégico não é, porque a alimentação fica do outro lado:

01a-raspberry-infra-vermelho-300x198.webp

O módulo que aí está é um exemplo porque não achei o módulo real no Fritzing, mas o módulo real não vem devidamente marcado para o wiring. Na verdade, tem um sinalzinho "escondido" de "+" e no lado oposto, um "S". Para não haver dúvidas, o wiring do sensor é o oposto disso, ou seja, vire-o de cara para os sinais e tudo estará certo. Eu conectei desse modo que está no desenho e queimei o sensor e o dedo:

02a-ir-wiring-300x91.webp

Por sorte eu tinha aqui um outro receptor para poder continuar com o artigo, mas confesso que fiquei triste de queimar o receptor, tão bonito que é.

Configurando o LIRC

O programa LIRC é o nosso antigo herói para manipulação de comunicação por infra-vermelho em Linux, não seria diferente em Linux embarcado. A grande vantagem de sua utilização é que dependendo do conjunto utilizado, você poderá escolher tanto o controle quanto o receptor IR, que já terão os drivers e protocolos devidamente especificados.

Como estamos tratando aqui de um controle e receptor genéricos comunicando através do GPIO, obviamente teremos que mapear os controles. Não fique desanimado por isso, é muito mais simples do que fazê-lo em Arduino.

Primeiro passo, instale o programa e as recomendações adjuntas:

sudo apt-get install lirc liblircclient-dev lirc-x setserial

Não faça nenhuma configuração prévia nem orientada pelo post-install do pacote, apenas confirme no "Ok" se algo lhe for perguntado.

Se desejar (ou se for necessário), você pode consultar a documentação oficial aqui. Vou deixar um diagrama sem muita explicação e deixarei comentários dentro do script de configuração, pra você não esquecer mais os detalhes.

03a-lirc-diagrama.webp

Após instalado, você já pode editar o arquivo de configuração (/etc/lirc/hardware.conf), deixando-o no seguinte formato:

# /etc/lirc/hardware.conf
# Argumentos que voce deseje passar durante a execucao de carga
#uinput conecta o lirc aos eventos lidos pelo kernel, de forma
#que ele tambem passa a enxerga-los em /dev/input, como voce pode
#ver na imagem que antecede essa configuracao
LIRCD_ARGS="--uinput"
 
# Esse comando previne uma execucao sobre um arquivo mal configurado.
#Repare que ele esta configurado como um boolean, ja que nao tem protecao
#por aspas.
# START_LIRCMD=false

# Do mesmo modo que o item anterior, modo precavido de execucao.
# START_IREXEC=false

# Os modulos estao definidos no arquivo /etc/modules, como exemplificado.
#De qualquer modo, ele tentara fazer o load quando executado. Melhor 
#previnir do que remediar. Mais uma vez, boolean.
LOAD_MODULES=true 

#Esse modulo esta ja definido em /etc/modules como exemplificado. Como o
#parametro anterior tenta fazer a carga do driver, aqui indica-se de qual
#driver se trata.
MODULES="lirc_rpi"
  
# Execute "lircd --driver=help" para ver todos os dispositivos suportados
#Porem, voce sempre pode fazer um 'sudo dpkg-reconfigure lirc' para
#escolher por um dos protocolos pre-existentes. 
DRIVER="default"

#Na utilizacao de udev no sistema, o dispositivo criado para a leitura do
#sensor IR deve ser similiar a /dev/lirc0. Confirme a existencia apos
# o reboot.
DEVICE="/dev/lirc0"

#Se tratar-se de um hardware com protocolo pre-definido, voce pode 
#apontar o arquivo de configuracao.
LIRCD_CONF=""
LIRCMD_CONF=""

Você pode fazer em qualquer ordem, mas sempre que instalo um programa que depende de carga de módulo, mesmo que o primeiro load seja automático, eu confirmo se ele foi inserido em /etc/modules e se não foi, faço a inserção manualmente em seguida, porque depois é fácil acreditar que houve algum problema em um próximo reboot (ou sabe-se lá quando, da próxima utilização do programa).

04a-ir-modules-167x300.webp

Perceba que o primeiro módulo é o lirc_dev e na segunda linha aponto o GPIO que será utilizado, fácil assim; só que não. Por alguma razão, não carregou o módulo no pino 40 (GPIO21), mas sim no GPIO18 (terceiro pino após o ground do desenho mais acima). Vou falar disso um pouco mais adiante.

/boot/config.txt

Apenas desça até a última linha desse arquivo e inclua o seguinte parâmetro:

dtoverlay=lirc-rpi

/lib/udev/rules.d/85-lircd.rules

Aqui você pode ter (ou não) um arquivo de configuração do lirc para udev. No meu caso, substitui o conteúdo de 85-lircd.rules por isso:

KERNEL=="lirc[0-9]*",   SUBSYSTEM=="lirc", SUBSYSTEMS=="platform", GOTO="begin"

...e após reiniciar o sistema...

Já podemos então fazer um teste inicial, mas somente "se" tudo deu certo "e" nada deu errado (redundância ciclica para afirmar que "tem" que seguir sem problemas).

Infelizmente o serviço LIRC não tem um status, portanto, exceto deseje ver como estão as coisas através de um comando 'ps aux', parta direto para o seguinte processo:

[ -c /dev/lirc0 ] && service lirc stop && mode2 -d /dev/lirc0

É um charme bobo, mas a condicional que antecede os comandos verifica previamente a existência do dispositivo de caractere lirc0 e só então permite a execução dos próximos dois comandos. Bem, como você poderá  ver no video (que publicarei posteriormente com todos os passos), o primeiro momento o comando não funcionou porque o dispositivo não existia. É isso que acontecerá se você não inserir o parâmetro de overlay no config.txt. Também, de nada adiantou apontar para o GPIO21 no arquivo /etc/modules, o default ficou sendo o GPIO18, como eu consegui descobrir analisando o log com o comando 'dmesg':

05a-gpio-18-300x201.webp

O comando mode2 fará a leitura do dispositivo e gerará uma sequência dessa leitura no formato 'pulse/space'. Se você chegar a esse ponto, comece a sorrir e vamos caminhar para a etapa final dessa configuração. Confesso que sequer procurei algum modo de selecionar o pino desejado, tamanha foi minha preguiça unida à ansiedade de concluir esse artigo (porque para os próximos dias virão outros bastante interessantes).

Mapear o controle remoto com o irrecord

Reiniciado o serviço lirc (sudo service lirc start), podemos agora iniciar o mapeamento do controle. Eu filmei por uma conexão SSH porque desse modo eu faço screencast a partir do notebook.

Para iniciar a captura,  digite o comando:

cd && irrecord -d /dev/lirc0 lircd.conf

O processo será guiado, mas não é tão claro, então prefiro detalhar, apesar de que você pode ver no video também (que será publicado posteriormente no canal no youtube). Primeiro, quando chegar na tela para iniciar a captura, vcê deve segurar um botão até que apareça a mensagem de que o comprimento foi mapeado. Seguidamente, você deverá apertar todos os botões (um por vez, obviamente) por um intevalo de até 1 segundo, para que apareça um ponto na tela. Quando terminar, aguarde. O próximo passo será identificar os botões. Para tal, será solicitado o nome do botão, conforme o namespace. Se quiser ver os nomes padrão (e claro que você precisará), use esse comando em outro terminal:

irrecord --list-namespace

Você pode capturar um nome específico pelo início do nome. Por exemplo, POWER:

irrecord --list-namespace| grep POW

Isso deverá retornar entre as opções, a KEY_POWER. Então você digita esse nome, pressiona enter e será solicitado que você pressione o botão power para seu mapeamento. Seguidamente ele solicita outro nome e então o processo se repete até que todo o controle esteja devidamente mapeado. Ao término, apenas pressione Enter e o programa finalizará, deixando o arquivo de mapeamento no mesmo nível de diretório em que o comando foi executado (porque 'cd' sem parâmetros te leva de volta ao home do usuário em questão).

Se você comprar o kit desse vendedor, poderá poupar o trabalho do mapeamento pegando o meu:

# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.0-pre1(default) on Fri May  6 02:23:43 2016
#
# contributed by 
#
# brand:                       ircode.conf
# model no. of remote control: 
# devices being controlled by this remote:
#

begin remote

  name  lircd.conf
  flags RAW_CODES|CONST_LENGTH
  eps            30
  aeps          100

  gap          107834

      begin raw_codes

          name KEY_POWER
             9086    4434     642     491     640     492
              639     491     641     491     640     491
              640     491     641     491     640     491
              640    1622     641    1621     648    1615
              641    1622     641    1621     642    1621
              642     495     636    1621     641     492
              640     492     639     492     640     492
              640     492     637     493     641     496
              635     492     641    1621     642    1622
              642    1621     641    1627     637    1623
              641    1622     644    1630     631    1624
              646

          name KEY_VOLUMEUP
             9089    4438     642     491     640     492
              640     492     641     490     641     492
              640     491     642     491     640     492
              645    1617     643    1622     640    1624
              640    1623     641    1623     641    1623
              641     492     641    1623     641    1622
              641     493     638     493     642     491
              640     492     640     491     640     492
              641     492     640     492     640    1629
              635    1623     641    1623     640    1624
              645    1619     641    1623     642    1622
              642

          name KEY_STOP
             9057    4463     618     515     616     516
              617     515     617     515     616     521
              612     515     616     515     617     515
              617    1646     617    1645     618    1651
              613    1646     618    1646     617    1646
              617     515     618    1649     614     516
              616    1645     618     515     617     515
              616     516     616     516     616     515
              622     510     616    1646     617     516
              617    1645     618    1645     618    1628
              634    1647     640    1623     638    1625
              638

          name KEY_REWIND
             9068    4456     617     516     616     516
              617     515     637     494     618     514
              617     515     617     515     616     516
              617    1645     618    1646     637    1626
              617    1645     617    1646     618    1646
              617     515     616    1645     618     516
              636     496     616    1646     617     526
              605     516     617     514     638     495
              636     495     616    1646     617    1646
              640     492     617    1647     616    1646
              617    1646     639    1624     618    1646
              617

          name KEY_PLAYPAUSE
             9089    4438     642     492     640     492
              640     492     641     491     640     491
              641     497     635     492     641     491
              640    1623     638    1625     641    1623
              645    1618     642    1622     641    1623
              642     490     641    1623     642    1622
              642     490     640    1623     642     492
              640     492     640     492     640     492
              641     490     642     491     640    1623
              641     492     640    1623     641    1623
              617    1646     642    1622     642    1630
              634

          name KEY_FORWARD
             9060    4465     613     520     613     517
              615     517     615     517     615     517
              616     516     614     517     615     517
              616    1645     618    1645     617    1647
              617    1646     617    1646     617    1646
              617     516     615    1646     621     511
              615    1648     614    1649     590     543
              613     518     591     541     590     541
              596     536     591    1671     592     540
              592     540     592    1670     617    1646
              622    1640     619    1645     592    1670
              617

          name KEY_DOWN
             9064    4461     619     514     617     515
              618     514     617     515     617     515
              618     513     617     515     617     515
              618    1645     618    1646     617    1644
              619    1644     620    1644     619    1645
              618     514     618    1644     619     515
              617     515     617     514     618    1644
              618     515     618     514     622     510
              619     513     617    1645     618    1645
              618    1645     617     520     612    1640
              624    1644     619    1645     618    1645
              618

          name KEY_UP
             9070    4462     616     513     620     512
              619     512     620     513     618     513
              620     512     619     513     620     511
              619    1644     620    1643     620    1644
              618    1645     619    1644     620    1644
              622     511     616    1646     618     515
              618    1644     619     514     619    1643
              620     513     629     503     618     514
              619     512     623    1640     618     514
              618    1644     621     512     618    1645
              620    1648     616    1642     620    1644
              619

          name KEY_NUMERIC_0
             9064    4462     617     516     616     516
              616     516     616     515     617     516
              616     517     636     495     637     494
              617    1646     619    1644     617    1646
              618    1646     617    1647     617    1645
              618     515     617    1646     621     512
              616     515     616    1646     618    1646
              616     516     617     516     636     495
              621     511     616    1645     618    1646
              617     516     616     515     617    1645
              618    1645     618    1646     617    1647
              637

          name KEY_EQUAL
             9072    4456     629     505     622     510
              622     510     622     510     622     510
              622     509     623     509     622     510
              623    1644     619    1641     623    1640
              624    1640     623    1645     619    1640
              624     509     622    1641     624    1640
              624     508     623    1645     619    1641
              623     509     623     509     622     510
              622     509     624     509     622    1644
              620     510     622     509     623    1640
              624    1640     624    1643     621    1639
              623

          name KEY_MEDIA_REPEAT
             9063    4466     612     520     613     519
              611     522     585     551     607     521
              612     519     584     548     585     546
              610    1653     611    1652     585    1684
              610    1648     584    1679     585    1679
              583     550     587    1675     582     550
              607    1656     608    1656     580    1683
              606     527     579     554     579     553
              578     555     577    1682     581     554
              601     530     579     552     585    1679
              579    1683     577    1687     580    1684
              578

          name KEY_NUMERIC_1
              355    4806    3160    6302     625     517
              619     518     621     686     471     534
              621     517     596     541     620     517
              621     523     619    1648     620    1651
              619    1650     597    1671     621    1647
              598    1670     622     522     616    1647
              622     516     622     519     622     515
              622     518     622    1647     357    5711
              625    4074     633    1665     609    5409
              601    1670     623    2937    9158    2203
             9146    2177    9175    2202    9110

          name KEY_NUMERIC_2
             9095    4438     642     491     641     491
              640     491     640     492     641     491
              640     492     641     491     641     492
              640    1623     641    1622     641    1623
              641    1623     638    1630     636    1622
              641     492     640    1624     641    1622
              641     491     640     493     640     491
              641    1622     640     493     640     492
              641     490     639     494     640    1628
              636    1623     640    1628     635     493
              639    1624     641    1627     636    1622
              641

          name KEY_NUMERIC_3
             9092    4434     642     491     640     492
              639     493     641     490     640     492
              640     492     640     491     641     491
              640    1623     642    1626     637    1627
              636    1622     642    1622     641    1621
              643     491     639    1623     641     492
              642    1595     667     491     640     491
              641    1627     636     492     641     491
              641     491     640    1622     642     491
              640    1622     646    1617     640     493
              642    1620     643    1622     641    1622
              640

          name KEY_NUMERIC_4
             9088    4438     641     493     640     491
              641     491     639     493     642     490
              640     491     641     490     641     492
              640    1622     646    1618     641    1621
              641    1622     643    1621     642    1628
              610     517     641    1621     642     491
              641     491     641    1622     641     491
              642    1622     641     491     642     490
              641     492     641    1621     642    1627
              636     491     641    1623     641     491
              642    1621     640    1623     646    1618
              641

          name KEY_NUMERIC_5
             9095    4435     641     492     639     492
              641     493     639     491     640     492
              640     492     640     491     641     492
              640    1622     643    1626     637    1621
              642    1622     642    1623     641    1622
              642     491     640    1622     642    1622
              642     492     640    1606     660     488
              645    1619     641     491     640     492
              640     492     639     492     641    1622
              641     492     644    1619     641     491
              640    1623     641    1622     642    1622
              646

          name KEY_NUMERIC_6
             9104    4440     642     492     619     515
              618     516     618     516     619     515
              619     515     644     489     621     514
              641    1625     642    1625     619    1646
              642    1624     630    1641     637    1625
              621     515     620    1643     644     494
              619    1645     649    1618     620     516
              618    1646     642     495     619     515
              620     515     620    1645     621     516
              620     514     644    1623     642     494
              620    1646     642    1625     622    1645
              622

          name KEY_NUMERIC_7
             9092    4458     622     513     620     513
              621     512     622     511     619     514
              622     511     621     512     624     509
              620    1644     622    1642     618    1646
              618    1646     617    1651     632    1627
              616     517     637    1609     657     492
              637     494     639     497     634    1624
              640    1623     640     493     616     516
              638     493     640    1627     635    1624
              639    1626     638     493     638     495
              637    1625     638    1626     617    1646
              618

          name KEY_NUMERIC_8
             9094    4459     625     512     621     509
              622     510     623     509     623     509
              621     511     620     512     620     513
              618    1648     615    1645     617    1646
              618    1645     640    1624     622    1643
              638     494     640    1622     641    1623
              641     491     642     491     644    1618
              641    1622     643     491     637     494
              640     492     640     492     639    1624
              639    1624     640     492     640     492
              640    1623     641    1627     638    1620
              644

          name KEY_NUMERIC_9
             9126    4446     637     513     623     515
              641     495     621     515     621     516
              623     514     628     513     629     513
              630    1641     626    1646     634    1642
              638    1639     639    1640     639    1640
              641     510     625    1671     636     514
              635    1644     646     507     643    1645
              644    1646     646     513     643     516
              626     540     626    1670     671     579
              594    1667     632     540     646     511
              622    1668     690    1650     694    1652
              662

      end raw_codes

end remote

Como o mapeamento foi um sucesso, agora basta copiá-lo para o diretório de configuração do lirc e reiniciar o serviço para que o arquivo seja lido:

cp lircd.conf /etc/lirc/lircd.conf && service lirc restart

Interagindo com o comando IR

Apenas para exemplificar, crie um arquivo .lircrc em /root/ e coloque o seguinte conteúdo:

begin
   prog = irexec
   button = KEY_POWER
   repeat = 0
   config = echo "ligado"
end

begin
   prog = irexec
   button = KEY_NUMERIC_9
   repeat = 0
   config = echo "9"
end

Esse arquivo rc irá definir que a saída do botão KEY_POWER será enviada para o programa irexec. O comando enviado será um echo dizendo "ligado". Em segunda, também enviando para irexec, mas dessa vez o botão 9, ecoando o número do botão. Isso é ótimo para interagir com shell script, como pode ser visto no video que será publicado posteriormente no canal.

Agora façamos um script shell chamado 'action.sh' para testar isso:

#!/bin/sh
OLD="none"
RESULT="none"

RESULT=`tail -n1 /root/saida`

while [ True ]; do
    [ "$RESULT" != "$OLD" ] &&{
        echo -n "diferente: "
        echo $RESULT
        OLD="$RESULT"
    }
    sleep 1
    RESULT=`tail -n1 /root/saida`
done

E dá-se então o modo de execução para o script:

chmod 750 action.sh

Você pode ver a execução do processo no video que será publicado no canal, não se preocupe. Após fazer isso, em um terminal execute:

ircat irexec

E em outro terminal, execute:

irexec > /root/saida&

Isso executará o receptor em segundo plano. Agora você pode executar o action.sh nesse segundo terminal:

./action.sh

E pressionando os botões 'power' e '9', os resultados correspondentes serão exibidos pelo script action.sh:

06a-saida.webp

Esse script é uma porquice só para prova de conceito; poderia ser pipe, arquivo em memória, leitura de banco de dados e tudo o que você imaginar, só depende do tempo que você está disposto a dispensar  fazendo a tarefa. Gostou? Então leia as linhas abaixo e veja quais dessas opções podem lhe interessar.

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.