由于我的其他对此没有产生任何结果,我做了以下工作:我有一个橙色Pi个人电脑,我想关闭一旦Arduino Lenoardo通过USB连接到它通过一个按钮获得一个输入到Pin 2。
整个通信应该通过串行方式进行,因为键盘输入不能正常工作。
我的Pi正在运行RetrOrangePi,这是Orange硬件的RetroPie的一个克隆。现在,如果我希望它关闭,我不想使用菜单,而是一个按钮,安装在硬件的情况下。
当按下此按钮(连接到Arduino上的Pin 2)时,它会向Orange Pi发送一个串行命令(byebyepi),Orange Pi运行一个python守护进程,该守护进程监听发送关机命令的准确行。
几乎所有的事情都很好。Arduino在pin 2接地时发送串行信号,并在windows上使用串行监视器进行检查。init.d服务正在运行。只有python脚本有问题,当我手动运行它时,因为缺少一个模块(序列)。我安装了pip,然后用pip安装了"pyserial“模块。从而消除了这个模块丢失的错误。
现在,当我手动运行python脚本时,arduino正在侦听,但是当我按下Pin 2时,什么都不会发生。Arduino亮起了led,所以发出信号发送关闭命令,但是Pi没有关闭,我不知道为什么。我也做了chmod 755在我的init.d/byebyepi。
这里有人能帮我吗?谢谢你好心!
我的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
发布于 2016-12-08 11:32:15
在发送命令之前发送空行可能是个好主意:
if (!digitalRead(abutton)){
Serial.println("");
Serial.println("byebyepi");
}
否则,由电噪声产生的字符可能最终出现在字符串的开头。一个新的行字符应该让python脚本在读取循环中运行一次,然后准备接收一个清晰的字符串。
否则,您可以在Python脚本中添加一些打印输出,这说明它即将重新启动。这样您就可以确认Python脚本接收到了ok命令。
还有一件事是,在init.d脚本中运行时,您的环境变量将与登录时不同。例如,路径和PYTHONPATH可以是不同的。因此,在python脚本中使用shutdown
的完整路径可能是个好主意。这句话是:
os.system("sudo FULLPATHHERE/shutdown -h now")
你得弄清楚你的系统里是什么。也许您也应该删除init.d脚本的sudo。
https://stackoverflow.com/questions/41025037
复制相似问题