Выполнение файла .py при запуске, чтобы вызвать кнопку GPIO

Я совсем новичок, и эта задача непростая, как я думал на первый взгляд. Я использую raspberryPi4 с Raspberry Pi OS Desktop с установленным рекомендованным программным обеспечением (действительно похоже на все Ubuntu, но GPIO работает с первой загрузки).

С успехом у меня есть написал программу .py (названную button_tab.py ), который изменяет мою вкладку chromium при нажатии физической кнопки , подключенной через контакты GPIO малины.
Мне нужно запустить этот .py-скрипт при запуске системы

#name of the file: button_tab.py
import RPi.GPIO as GPIO
import subprocess
import time

GPIO.setmode(GPIO.BOARD)


buttonPin = 36

GPIO.setup(buttonPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while True:
    buttonState = GPIO.input(buttonPin)
    if buttonState == False:
        subprocess.call(["xdotool", "key", "ctrl+Tab"])
        time.sleep(0.5) 
   

Эта программа отлично работает, когда я запускаю ее через:

python3 button_tab.py

Каждый раз, когда я нажимаю кнопку, она меняет вкладку в выбранном Окно хрома , как если бы я нажимал клавиши клавиатуры ctrl + tab , и у него есть время восстановления 0,5 секунды, чтобы не запускать его несколько раз одновременно.
Я даже создал сценарий listen_for_button.sh , чтобы выполнять его через bash.

#! /bin/sh
echo "Starting listen-for-button.py"
python3 /usr/bin/button_tab.py

Когда я запускаю его вручную, он тоже работает

./listen_for_button.sh

Теперь проблема:
Мне нужно запустить этот скрипт при запуске
, поэтому я установил все модули pip3 для sudo
(например, sudo -H pip3 install subprocess.run ) и начал пробовать разные решения:

  • для запуска через crontab: @reboot / home / pi /listen_for_button.sh (нет)
  • , чтобы переместить listen_for_button.sh в /etc/init.d/ и разрешить его через sudo rcconf (после установки через sudo aptitute install rcconf sysv-rc-conf ) (нет)
  • благодаря @Ra, я редактировал с помощью sudo nano / etc / profile файл конфигурации ~ / bashrc, добавляющий / bin / bash / home / pi / listen_for_button.sh внизу файла ( что-то перемещается , но логин застрял в моем процессе, вероятно, потому что рабочий стол не отображается, только черный экран)
  • для сборки / lib /systemd/system/button_tab.service (спойлер ... нет)

# файл button_tab.service :

[Unit]
Description=Button Tab Service
After=multi-user.target
Conflicts=getty@tty1.service
DefaultDependencies=false

[Service]
Type=simple
Environment="PATH=/home/{{ user }}/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
ExecStart=/usr/bin/python3 /usr/bin/button_tab.py
Restart=on-abort
User=pi
    
[Install]
WantedBy=multi-user.target

и включить его через:

sudo systemctl daemon-reload
sudo systemctl enable button_tab.service
sudo systemctl start button_tab.service

Процесс работает ( зеленый свет при запросе статуса через sudo systemctl status button_tab.service ), но кнопка не работает, даже если процесс запущен. Я пробовал разные конструкции файла .service: это последняя версия. Все изменения в файле .service приводят к одному и тому же результату: nope

Я обнаружил, что единственный способ заставить кнопку работать - это запустить вручную, либо скрипт button_tab.py , либо сценарий listen_for_button.sh .

Ни один из автоматических способов не работает.

Возможно, мне не хватает чего-то базового, например, поведения xdotool ... Я действительно не знаю!

Пожалуйста, я вызываю sudo help
Спасибо

0
задан 26 February 2021 в 14:00

1 ответ

Решено! Благодаря комментариям @Ray было достаточно, чтобы сделать это:

sudo nano /etc/profile

и добавьте в нижнюю часть файла:

nohup /bin/bash /home/pi/listen_for_button.sh

Это делает, ~ / Bashrc выполняют файл .sh на заднем плане, без вывода вообще. Таким образом, процесс входа в систему может продолжаться плавно, и файл .sh действует так, как если он выполняется пользователем <3

, я надеюсь, что это может помочь кому-то еще. Всего наилучшего

0
ответ дан 18 March 2021 в 23:31

Другие вопросы по тегам:

Похожие вопросы: