1

これに関する私の他の見解では結果が得られなかったので、次のことを行いました。 USB 経由で接続された Arduino Lenoardo がボタン経由でピン 2 に入力を取得したら、シャットダウンしたい Orange Pi PC があります。

キーボード入力がうまく機能しなかったため、この通信全体がシリアル経由で行われるはずです。

私の Pi は、Orange Pi ハードウェア用の RetroPie のクローンである RetrOrangePi を実行しています。今、シャットダウンしたい場合は、メニューを使用したくありませんが、代わりにハードウェア ケースに取り付けられたボタンを使用します。

このボタン (Arduino のピン 2 に接続) が押されると、シリアル コマンド (byebyepi) が Orange Pi に送信されます。Orange Pi は、この正確な行をリッスンしてシャットダウン コマンドを送信する Python デーモンを実行します。

ほとんどすべてがうまく機能します。Arduinoは、ピン2が接地されているときにシリアル信号を送信し、シリアルモニターを使用してウィンドウで確認します。init.d サービスが実行されています。モジュール(シリアル)が欠落していたため、手動で実行したときにpythonスクリプトのみに問題がありました。pip をインストールしてから、pip を使用して「pyserial」モジュールをインストールしました。このモジュールが見つからないというエラーを取り除きました。

ここで、python スクリプトを手動で実行すると、arduino はリッスンしていますが、ピン 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 スクリプトが読み取りループを 1 回実行し、クリア文字列を受け取る準備が整うはずです。

それ以外の場合は、印刷出力を Python スクリプトに追加することができます。これは、再起動しようとしていることを示しているだけです。Python スクリプトがコマンド ok を受け取ることを確認できるようにします。

もう 1 つのことは、init.d スクリプトで実行する場合、環境変数はログインしたときと同じではないということです。たとえば、PATH と PYTHONPATH は異なる場合があります。shutdownそのため、Python スクリプトでへのフル パスを使用することをお勧めします。それはこの行です:

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

システム上にあるものを見つける必要があります。init.d スクリプトの sudo も削除する必要があるかもしれません。

于 2016-12-08T11:32:15.050 に答える