1

因为我对此的其他看法没有产生任何结果,所以我做了以下事情:我有一台 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
4

1 回答 1

0

在发送命令之前发送一个空行可能是个好主意:

if (!digitalRead(abutton)){
    Serial.println("");
    Serial.println("byebyepi");
}

否则,由电噪声产生的字符可能会出现在字符串的开头。换行符应该让 python 脚本在阅读循环中运行一次,然后准备好接收一个清晰的字符串。

否则,您可以向 Python 脚本添加一些打印输出,这只是表示它即将重新启动。这样您就可以确认 Python 脚本收到了 ok 命令。

另一件事是,在 init.d 脚本中运行时,您的环境变量将与您登录时不同。例如 PATH 和 PYTHONPATH 可以不同。因此,shutdown在 python 脚本中使用完整路径可能是个好主意。就是这一行:

os.system("sudo FULLPATHHERE/shutdown -h now")

你必须找出它在你的系统上是什么。也许您也应该为 init.d 脚本删除 sudo。

于 2016-12-08T11:32:15.050 回答