Eu gostaria de poder desligar um Raspberry Pi sem cabeça com um controle remoto infravermelho. Eu segui este tutorial https://blog.gordonturner.com/2020/05/31/raspberry-pi-ir-receiver/ . Tudo correu bem no início. O comando ir-keytable -t -s rc0
funciona e responde ao pressionamento de teclas no meu controle remoto.
Depois disso, não posso fazer mais progressos. As udev
etapas não funcionaram, o que não é surpreendente depois da minha experiência anterior com udev
. (Não é relevante para este problema, mas pode ser encontrado em Como montar uma unidade USB específica somente leitura .)
Tentei triggerhappy
https://github.com/wertarbyte/triggerhappy , mas o thd
comando também não funciona:
thd --dump /dev/input/event0 /dev/input/event1
Não há saída quando os botões são pressionados. Ele nem registra teclas de um teclado, via ssh. thd
funciona parcialmente no meu desktop Linux, mostrando eventos do teclado e do mouse, mas não do sensor IR embutido no meu Asus PN-51.
Este post parece promissor https://hackernoon.com/shut-down-your-raspberry-pi-the-easy-way-9c7be0b4fff8 . Ele descreve como usar triggerhappy
para desligar um Raspberry Pi sem cabeça com um clique de um mouse USB. No entanto, não ajudou em nada na solução do meu problema.
Eu tentei executar todos os comandos com sudo
, pois os arquivos do dispositivo ( /dev/input/event*
) são apenas root. Isso não fez diferença.
Alguém sabe como posso configurar ou depurar triggerhappy
com um receptor infravermelho? Além disso, existe uma maneira moderna de ouvir ir-keytable
eventos e executar um comando?
Decidi não perguntar isso em raspberrypi.stackexchange.com/, pois é mais uma questão do Linux.
EDITAR - detalhes do udev
Eu criei um arquivo /etc/udev/rules.d/90-ir.rules
com a única linha:
ACTION=="add", SUBSYSTEM=="input", SUBSYSTEMS=="rc", KERNEL=="event*", ENV{.rc_sysdev}="$id", RUN+="/home/pi/test-udev.sh"
Eu não gastei muito esforço nisso. Não estou confiante, depois de saber que as versões recentes do udev
são muito menos poderosas do que as anteriores.
Eu sei que não testa qual chave foi capturada. O script test-udev.sh grava apenas uma linha em um arquivo de log, ele funciona quando executado a partir de um prompt do Bash.
Depois de executar, sudo udevadm control --reload
tentei o controle remoto. O arquivo de log não foi tocado.
Mais pesquisas me levaram a https://stackoverflow.com/a/70304099 que resolveu meu problema.
Espero que uma descrição completa possa ajudar outras pessoas.
Como usar o infravermelho para desligar o Pi
É muito fácil habilitar um controle remoto infravermelho para emitir comandos para um Raspberry Pi, mesmo sem cabeça. Segue-se um procedimento passo a passo para equipar um Pi para ser desligado com um controle remoto. O sistema pode ser facilmente estendido para executar outros comandos.
O processo abaixo também deve funcionar em outras máquinas Linux, se um receptor infravermelho estiver presente.
Nível de habilidade necessário
Familiaridade básica com um Pi:
Há muita ajuda online.
Reconhecimentos
Partes significativas vêm de:
Hardware e ir-keytable:
https://blog.gordonturner.com/2020/05/31/raspberry-pi-ir-receiver/
Python e evdev:
https://stackoverflow.com/a/70304099
https://pypi.org/project/evdev/
Requisitos
O seguinte hardware é necessário:
Montagem de hardware
Oriente o receptor IR com as pernas apontando para baixo e a protuberância na cabeça voltada para a frente. Os conectores são:
Observe que existem diferentes convenções para identificar os pinos GPIO. Os números dos pinos acima são números físicos, obtidos pela contagem dos pinos reais – o pino 1 está na parte inferior esquerda do diagrama, com o pino 2 acima dele. Há também um esquema de nomenclatura, conhecido como numeração GPIO ou numeração Broadcom.
Configuração do sistema operacional
Começando com um Raspberry Pi OS inicializável, adicione esta linha no final do arquivo
/boot/config.txt
:Se você quiser usar um pino diferente para o sinal do receptor, precisará ajustar o valor de
gpio_pin
nesta instrução, usando o número da Broadcom. Existe muita informação online, que pode variar de acordo com o modelo do seu Pi.Reinicie o Pi depois de alterar os parâmetros de inicialização.
Teste inicial
Esta seção testa a instalação do hardware, mas não é uma parte obrigatória da solução final.
Instale o ir-keytable com
e teste com:
que deve exibir uma saída semelhante a:
Nesse caso, podemos ignorar a primeira entrada (
/sys/class/rc/rc1/
) e focar na segunda (/sys/class/rc/rc0/
) porque ela tem o nomegpio_ir_recv
. Usaremos a classe (rc0
) e o dispositivo (/dev/input/event0)
em etapas posteriores.Teste o controle remoto com:
(ou um valor diferente da classe se identificado).
Em seguida, pressione os botões no controle remoto. Cada pressionamento de tecla deve produzir linhas como:
As linhas podem ser repetidas, se você mantiver o botão pressionado. Não se preocupe com isso. Além disso, não precisamos dos dados, apenas do fato de termos alguns.
Se os pressionamentos de botão remoto forem recebidos, você terá um sistema IR funcionando. A próxima etapa é fazê-lo fazer algo útil. Se não houver resposta do controle remoto, verifique todo o trabalho acima. Não se esqueça de verificar a bateria do controle remoto.
Software Necessário
Existem muitos guias online, mas muitos são antigos e desatualizados. Você não precisa de LIRC ou udev. Um pequeno script Python (mostrado abaixo) é tudo o que é necessário. Presume-se que você já tenha o Python3 disponível. Alguns dos comandos precisam ser ajustados, caso contrário, mas não sou usuário do Python e não posso realmente ajudar.
Instale
pip
(um sistema de gerenciamento de pacotes padrão para Python) e use-o para instalarevdev
(que fornece ligações para a interface genérica de eventos de entrada no Linux). É importante instalarevdev
em um diretório do sistema, para ser acessível ao root.ou
Pode ser necessário ajustar o caminho se você tiver uma versão diferente do Python.
Crie um script Python chamado digamos,
ir-test.py
contendo essas linhas.Verifique e, se necessário, corrija o nome do caminho do dispositivo de acordo com o que foi obtido em
ir-keytable
. Se você ignorou oir-keytable
estágio, veja em quais dispositivos estão/dev/input/
e teste cada um.Execute este script e pressione os botões no controle remoto.
Deve imprimir linhas como:
O primeiro número é a hora, o último ('
val
' ou 'value
') é o que queremos. Se os números forem zero (como na segunda linha), isso simplesmente indica que o botão foi pressionado – essas linhas podem ser ignoradas.Anote o
val
valor ' ' que corresponde ao botão que deseja acionar.Agora você tem informações suficientes para o estágio final. Você pode querer manter o script Python acima, para possível solução de problemas ou caso queira expandir seu sistema.
Sugiro que você crie outro script Python, chamado talvez
ir-read.py
. Contém:Novamente, ajuste o nome do caminho do dispositivo para o seu sistema. A linha de impressão é apenas para mostrar o que está acontecendo, você pode removê-la após o teste. Ajuste o número na
if
linha para o valor do botão que você deseja. O 'agora' na última linha diz para desligar imediatamente, você pode substituir um número se quiser um atraso - é um número de minutos para esperar.Teste
ir-read.py
e pressione os botões no controle remoto.Não espere que o comando shutdown funcione aqui; pois requer privilégio de root. Uma mensagem de erro mostrará que o script chegou a esse ponto.
Você pode adicionar mais
if
blocos, seguindo o mesmo padrão, se quiser ouvir e reagir a mais botões remotos.Por fim, adicione seu script ao root
crontab,
para que ele seja executado quando o Pi for iniciado.Adicione esta linha no final do arquivo:
Certifique-se de que os caminhos e nomes estejam corretos para o seu sistema.
Solução de problemas
Muitas vezes acontece que o script funciona como usuário 'pi' (ou o que quer que você esteja conectado), mas não como root. Isso ocorre porque o root tem um ambiente diferente. Por esse motivo, os caminhos completos são incluídos em todos os lugares.
Você pode depurar o script alterando a
crontab
linha para:e pode adicionar mais prints no script para ver o que está acontecendo. Lembre-se de reiniciar cada vez
crontab
que for alterado. Como alternativa, tente o script Python, como root, na linha de comando:pensamentos adicionais
É difícil pressionar um botão remoto brevemente o suficiente para que um único evento seja recebido. Para desligar, isso não importa, mas para outros comandos, pode ser um problema.
Existem opções no
ir-keytable
comando para ajustar o atraso e o período de repetições, consulte a página do manual para obter detalhes. Também deve ser possível estender o código Python para ignorar eventos duplicados.