2016-12-07 20 views
1

私の他のテイクでは何の結果も得られなかったので、私は次のことをしました: Arduino LenoardoがUSB経由でシャットダウンするオレンジパイPCボタンを使用してピン2に入力を取得します。Debian/Armbianのシャットダウンシステムへのシリアルコマンド

この完全な通信は、キーボード入力がうまくいかなかったため、シリアル経由で動作するはずです。

My Piは、Orange PiハードウェアのRetroPieのクローンであるRetrOrangePiを実行しています。 これをシャットダウンするには、メニューを使用するのではなく、代わりにハードウェアケースにマウントされたボタンを使用します。

このボタン(Arduinoの2番ピンに接続)を押すと、シリアルコマンド(byebyepi)が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 
+0

あなたの質問に関連するタグをいくつか追加することができます(例: 'arduino'、' orange-pi'など)。もう少し注意を払うことができます。 – davedwards

+0

@downshift done、ありがとうございます。 – Fleder

答えて

0

おそらくコマンドを送信する前に空白行を送信するために良いでしょう:

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

そうでない場合は、電気的ノイズによって生成された文字は、文字列の先頭に終わるかもしれません。新しい行の文字は、Pythonスクリプトを読み込みループの中を一度移動してから、クリアストリングを受け取る準備ができているはずです。

そうでなければ、再起動しようとしていると言われるPythonスクリプトに印刷出力を追加することができます。 Pythonスクリプトがコマンドokを受け取ったことを確認できます。

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

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

あなたのシステム上の内容を調べる必要があります。 init.dスクリプトのsudoも削除してください。

関連する問題