Manual
do
Maker
.
com
"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.
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.
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"!
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 é.
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.
Apenas desça até a última linha desse arquivo e inclua o seguinte parâmetro:
dtoverlay=lirc-rpi
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"
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).
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
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 canal Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.