2016-12-07 3 views
1

zu beenden, da meine andere Übernahme auf diese Ergebnisse keine Ergebnisse ergab, habe ich Folgendes getan: Ich habe einen Orange Pi PC, den ich herunterfahren möchte, sobald der Arduino Lenoardo über USB angeschlossen erhält eine Eingabe auf Pin 2 über eine Schaltfläche.serieller Befehl zu debian/armbian System

Diese gesamte Kommunikation sollte über die serielle Schnittstelle erfolgen, da Tastatureingaben nicht gut funktionieren.

Mein Pi läuft RetrOrangePi, ein Klon von RetroPie für die Orange Pi Hardware. Jetzt, wenn ich möchte, dass es heruntergefahren wird, möchte ich nicht das Menü, sondern eine Taste stattdessen auf dem Hardware-Fall montiert verwenden. Wenn dieser Knopf (verbunden mit Pin 2 auf dem Arduino) gedrückt wird, sendet er einen seriellen Befehl (byebyepi) an den Orange Pi, der einen Python-Daemon ausführt, der genau auf diese Linie wartet, um den Shutdown-Befehl zu senden.

Fast alles funktioniert gut. Der Arduino sendet das serielle Signal, wenn Pin 2 geerdet ist, über Windows mit dem seriellen Monitor überprüft. Der init.d-Dienst wird ausgeführt. Nur das Python-Skript hatte ein Problem, wenn ich es manuell ausgeführt habe, seit ein Modul (seriell) fehlte. Ich habe pip installiert und dann mit pip das "pyserial" Modul installiert. Das hat den Fehler beseitigt, dass dieses Modul fehlte.

Jetzt, wenn ich manuell das Python-Skript ausführen, hört das Arduino, , aber wenn ich Pin 2 erden, passiert nichts. Der Arduino schaltet die LED ein, , also signalisieren Sie, dass er den Befehl zum Herunterfahren gesendet hat, aber der Pi wird nicht heruntergefahren und ich habe keine Ahnung warum. Ich habe auch chmod 755 auf meinem init.d/byebyepi.

Kann mir hier jemand helfen? Dankesehr!

Die Skizze für mein Arduino ist dies:

#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 
    } 
} 

Mein Python-Dämon verwendet diese:

import serial 
import os 

ser = serial.Serial('/dev/ttyACM0', 9600) 

while 1 : 
    line = ser.readline() 
    if line == 'byebyepi': 
     os.system("sudo shutdown -h now") 

Und das /etc/init.d/ Skript ist dies:

#! /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

Sie könnten vielleicht einige mehr verwandte Tags zu Ihrer Frage hinzufügen (z. B. 'Arduino',' Orange-Pi', etc) und bekommen Sie etwas mehr Aufmerksamkeit – davedwards

+0

@downshift getan, danke. – Fleder

Antwort

0

Es wäre wahrscheinlich eine gute Idee, eine leere Zeile zu senden, bevor Sie den Befehl senden:

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

Ansonsten Zeichen erzeugt durch elektrisches Rauschen könnten am Ende in dem Anfang des Strings. Ein neues Zeilenzeichen sollte das Python-Skript veranlassen, einmal in der Leseschleife zu gehen und dann bereit zu sein, eine klare Zeichenkette zu erhalten.

Sonst könnten Sie etwas Druckausgabe zum Python-Skript hinzufügen, das nur sagt, dass es kurz vor dem Neustart steht. Nur so können Sie bestätigen, dass das Python-Skript den Befehl ok empfängt.

Noch eine Sache ist, dass beim Ausführen in einem init.d-Skript, Ihre Umgebungsvariablen nicht die gleichen sind wie wenn Sie angemeldet sind. Zum Beispiel können die PATH und PYTHONPATH unterschiedlich sein. Es kann also sinnvoll sein, den vollständigen Pfad zu shutdown im Python-Skript zu verwenden.Es ist diese Zeile:

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

Sie müssen herausfinden, was es auf Ihrem System ist. Vielleicht solltest du das sudo auch für das init.d-Skript entfernen.