因为我对此的其他看法没有产生任何结果,所以我做了以下事情:我有一台 Orange Pi PC,一旦通过 USB 连接到它的 Arduino Lenoardo 通过按钮在 Pin 2 上获得输入,我想关闭它。
这整个通信应该通过串行进行,因为键盘输入不能很好地工作。
我的 Pi 正在运行 RetrOrangePi,它是用于 Orange Pi 硬件的 RetroPie 的克隆。现在,如果我想让它关闭,我不想使用菜单,而是使用安装在硬件箱上的按钮。
当这个按钮(连接到 Arduino 上的 Pin 2)被按下时,它会向 Orange Pi 发送一个串行命令(byebyepi),Orange Pi 会运行一个 python 守护程序,该守护程序会监听这个确切的行以发送关闭命令。
几乎一切都运作良好。当引脚 2 接地时,Arduino 发送串行信号,在 windows 上使用串行监视器进行检查。init.d 服务正在运行。只有 python 脚本有问题,当我手动运行它时,因为缺少一个模块(串行)。我安装了 pip,然后用 pip 安装了“pyserial”模块。这消除了该模块丢失的错误。
现在,当我手动运行 python 脚本时,arduino 正在监听,但是当我将 Pin 2 接地时,什么也没有发生。Arduino 点亮了 LED,因此发出了关闭命令的信号,但 Pi 没有关闭,我不知道为什么。我还在我的 init.d/byebyepi 上做了 chmod 755。
这里有人可以帮我吗?非常感谢你!
我的 arduino 的草图是这样的:
#define abutton 2
//Pin 2 is now called abutton
void setup() {
pinMode(abutton,INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
if (!digitalRead(abutton)){Serial.println("byebyepi");
//send byebyepi via serial when abutton is used
delay(5000);
//wait for 5 seconds
}
}
我的 python 守护进程使用这个:
import serial
import os
ser = serial.Serial('/dev/ttyACM0', 9600)
while 1 :
line = ser.readline()
if line == 'byebyepi':
os.system("sudo shutdown -h now")
/etc/init.d/ 脚本是这样的:
#! /bin/sh
# /etc/init.d/byebyepi
#
case "$1" in
start)
echo "Starting byebyepi.py"
# run application you want to start
python /home/pi/shutdown/byebyepi.py &
;;
stop)
# kill application you want to stop
;;
*)
echo "Usage: /home/pi/shutdown/byebyepi.py {start|stop}"
exit 1
;;
esac
exit 0