
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 aos montes no Mercado Livre (onde tenho 112 compras efetuadas até a data desse artigo). 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:



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:



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.



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).



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’:



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:



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 newsletter, alí em cima à direita e receba novos posts por email.
Siga-nos no Do bit Ao Byte no Facebook.
Prefere twitter? @DobitAoByte.
Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.
Nossos grupos:
Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/
Próximo post a caminho!