Я пытаюсь заставить мой Raspberry Pi запускать код при загрузке, который позволит мне управлять драйверами мотора с помощью геймпада.Код, который у меня работает, работает при нормальном запуске, но не работает при запуске с rc.local
. Я создал версию (см. Ниже), которая должна написать «Нет подключенного геймпада. Пожалуйста, включите его!»каждый раз, когда он ищет геймпад, и как только он находит, он должен писать «Y» или «B» в один и тот же файл каждый раз, когда нажимается эта кнопка.
Он всегда пишет «Нет подключенного геймпада. Пожалуйста, включите егона!"в файл, но затем не записывает нажатые кнопки после этого.Опять же, когда я запускаю его не из rc.local, он работает нормально.
Поиск решений в Интернете. Я обнаружил, что python не может правильно записывать файлы при работе в фоновом режиме.Я попытался запустить его как «python -u» в rc.local, добавив «#! / Usr / bin / python -u» в начало файла и сбросив его, используя f.flush () и sys.stdout.flush () в разных комбинациях.
Это мой файл rc.local
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
#sudo python /home/pi/sample.py &
python -u /home/pi/Desktop/RPi_Bluetooth_RoboClaw/On_Boot_Motor.py &
exit 0
И это соответствующие части кода, который я запускаю.Сначала он проверяет, подключен ли геймпад, а затем должен начать запись выходных данных в файл.
#!/usr/bin/python -u
import time
from roboclaw import Roboclaw
from evdev import InputDevice, categorize, ecodes
import fnmatch
import os
f = open("/home/pi/Desktop/Output.txt","w")
gamepadConnect = False
while(not gamepadConnect):
try:
gamepad = InputDevice('/dev/input/event0')
gamepadConnect = True
except:
f.write("No Gamepad Connected. Please turn it on! \n")
time.sleep(0.5)
f.close()
#button code variables as found for 8bitdo gamepad
bBtn = 305
yBtn = 308
while(True):
f = open("/home/pi/Desktop/Output.txt","a")
try:
for event in gamepad.read_loop():
if event.type == ecodes.EV_KEY:
if event.value == 1:
#if the Y button is pressed
if event.code == yBtn:
#Turn Left
f.write("Y")
#if the B button is pressed
elif event.code == bBtn:
#Inch
f.write("B")
except KeyboardInterrupt:
break
f.flush()
sys.stdout.flush()
f.close()
По сути, я пытаюсь выяснить, почему он пишет «Нет подключенного геймпада. Пожалуйста, включите его.на!"а не нажатые кнопки, и в идеале я хотел бы получить решение, которое я мог бы использовать при отправке байтов драйверам двигателя, например что-нибудь о том, как rc.local запускает файл.