AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 753554
Accepted
Peter bill
Peter bill
Asked: 2023-08-08 23:40:07 +0800 CST2023-08-08 23:40:07 +0800 CST 2023-08-08 23:40:07 +0800 CST

Como desligar o Linux com um controle remoto infravermelho

  • 772

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 rc0funciona e responde ao pressionamento de teclas no meu controle remoto.

Depois disso, não posso fazer mais progressos. As udevetapas 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 thdcomando 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. thdfunciona 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 triggerhappypara 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 triggerhappycom um receptor infravermelho? Além disso, existe uma maneira moderna de ouvir ir-keytableeventos 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.rulescom 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 udevsã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 --reloadtentei o controle remoto. O arquivo de log não foi tocado.

linux
  • 1 1 respostas
  • 50 Views

1 respostas

  • Voted
  1. Best Answer
    Peter bill
    2023-08-11T19:23:47+08:002023-08-11T19:23:47+08:00

    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:

    • setting-up the SD card,
    
    • editting files, with your preferred editor,
    
    • access to root, via `sudo`
    
    • attaching a device to the GPIO.
    

    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:

    • A Raspberry Pi with an SD card, Raspberry Pi OS and wifi or an ethernet connection. The network is only required to install software. Other operating systems probably work, but Linux is assumed here.
    
    • A TSOP38238 infra-red receiver. These are very cheap to buy in bulk, but small orders often attract a hefty handling and package charge.
    
    • An infra-red remote control. You may be able to find a working device from a discarded television or similar. I used a Philips handset from a broken DVD player. There are many for sale through online suppliers – you may want a cheap, simple device, or something more complex if you envisage programming lots of commands.
    
    • Breadboard and jumper wires, for prototyping.
    

    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:

    • Left-most: Signal, connect to pin 8 of the Pi, named GPIO14.
    
    • Centre: Ground, connect to one of the ground pins of the Pi, e.g. pin 6.
    
    • Right-most: Power, connect to pin 1 of the Pi, 3.3 volts.
    

    Montagem do receptor IR

    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:

    dtoverlay=gpio-ir,gpio_pin=14
    

    Se você quiser usar um pino diferente para o sinal do receptor, precisará ajustar o valor de gpio_pinnesta 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

    sudo apt install -y ir-keytable
    

    e teste com:

    sudo ir-keytable
    

    que deve exibir uma saída semelhante a:

    Found /sys/class/rc/rc1/ with:
        Name: vc4-hdmi
        Driver: cec
        Default keymap: rc-cec
        Input device: /dev/input/event1
        Supported kernel protocols: cec 
        Enabled kernel protocols: cec 
        bus: 30, vendor/product: 0000:0000, version: 0x0001
        Repeat delay = 0 ms, repeat period = 125 ms
    Found /sys/class/rc/rc0/ with:
        Name: gpio_ir_recv
        Driver: gpio_ir_recv
        Default keymap: rc-rc6-mce
        Input device: /dev/input/event0
        LIRC device: /dev/lirc0
        Attached BPF protocols: Operation not permitted
        Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon 
        Enabled kernel protocols: lirc rc-6 
        bus: 25, vendor/product: 0001:0001, version: 0x0100
        Repeat delay = 500 ms, repeat period = 125 ms
    

    Nesse caso, podemos ignorar a primeira entrada ( /sys/class/rc/rc1/) e focar na segunda ( /sys/class/rc/rc0/) porque ela tem o nome gpio_ir_recv. Usaremos a classe ( rc0) e o dispositivo ( /dev/input/event0)em etapas posteriores.

    Teste o controle remoto com:

    sudo ir-keytable -t -s rc0
    

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

    211.610167: event type EV_MSC(0x04): scancode = 0x4601
    211.610167: event type EV_SYN(0x00).
    

    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 instalar evdev(que fornece ligações para a interface genérica de eventos de entrada no Linux). É importante instalar evdevem um diretório do sistema, para ser acessível ao root.

    sudo apt install -y python3-pip
    sudo pip install -y evdev --target /usr/lib/python3/dist-packages
    

    ou

    sudo pip3 install evdev --target /usr/lib/python3/dist-packages
    

    Pode ser necessário ajustar o caminho se você tiver uma versão diferente do Python.

    Crie um script Python chamado digamos, ir-test.pycontendo essas linhas.

    from evdev import InputDevice
    dev = InputDevice('/dev/input/event0')
    
    for event in dev.read_loop():
        print(event)
    

    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 o ir-keytableestágio, veja em quais dispositivos estão /dev/input/e teste cada um.

    Execute este script e pressione os botões no controle remoto.

    python ir-test.py
    

    Deve imprimir linhas como:

    event at 1691579255.159091, code 04, type 04, val 17921
    event at 1691579255.159091, code 00, type 00, val 00
    

    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 valvalor ' ' 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:

    # Production program to process IR input
    import subprocess
    from evdev import InputDevice
    
    dev = InputDevice('/dev/input/event0')
    
    for event in dev.read_loop():
        print(event.value) # Debug only
        if event.value == 18119:
            subprocess.run(["/usr/sbin/shutdown", "now"])
    

    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 iflinha 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.pye pressione os botões no controle remoto.

    python ir-read.py
    

    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 ifblocos, 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.

    sudo crontab -e
    

    Adicione esta linha no final do arquivo:

    @reboot /usr/bin/python /home/pi/ir-read.py
    

    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 crontablinha para:

    @reboot /usr/bin/python /home/pi/ir-read.py >>/home/pi/irdebug.log
    

    e pode adicionar mais prints no script para ver o que está acontecendo. Lembre-se de reiniciar cada vez crontabque for alterado. Como alternativa, tente o script Python, como root, na linha de comando:

    sudo /usr/bin/python /home/pi/ir-read.py
    

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

    • 2

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve