2016-12-07 2 views
1

depuis mon autre prise sur cela n'a donné aucun résultat, j'ai fait ce qui suit: J'ai un PC Orange Pi que je veux éteindre une fois que l'Arduino Lenoardo connecté à l'USB obtient une entrée sur la broche 2 via un bouton.commande série à debian/armbian pour arrêter le système

Toute cette communication devrait se faire via le port série, car les entrées du clavier ne fonctionnaient pas bien.

My Pi exécute RetrOrangePi, un clone de RetroPie pour le matériel Orange Pi. Maintenant, si je veux qu'il s'arrête, je ne veux pas utiliser le menu, mais plutôt un bouton, monté sur le boîtier. Lorsque ce bouton (connecté à la broche 2 sur l'Arduino) est pressé, il envoie une commande série (byebyepi) à l'Orange Pi, qui exécute un démon python qui écoute cette ligne pour envoyer la commande shutdown.

Presque tout fonctionne bien. L'Arduino envoie le signal série lorsque la broche 2 est mise à la terre, vérifiée sur les fenêtres avec le moniteur série. Le service init.d est en cours d'exécution. Seul le script python avait un problème, lorsque je l'ai exécuté manuellement, car un module (série) était manquant. J'ai installé pip et ensuite avec pip j'ai installé le module "pyserial". Qui s'est débarrassé de l'erreur que ce module manquait.

Maintenant, quand je lance manuellement le script python, l'arduino écoute, mais quand je mets à la terre la broche 2, rien ne se passe. L'Arduino allume la led, alors signalez qu'il a envoyé la commande d'arrêt, mais le Pi ne s'arrête pas et je ne sais pas pourquoi. J'ai aussi fait chmod 755 sur mon init.d/byebyepi.

Quelqu'un peut-il m'aider avec ça? Merci de bien vouloir!

Le croquis pour mon arduino est la suivante:

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

Mon démon python utilise ceci:

import serial 
import os 

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

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

Et le script /etc/init.d/ est la suivante:

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

Vous pourriez peut-être ajouter plus de balises liées à votre question (par exemple 'arduino',' orange-pi', etc) et obtenir un peu plus d'attention – davedwards

+0

@downshift fait, merci. – Fleder

Répondre

0

Il serait sans doute une bonne idée d'envoyer une ligne vide avant d'envoyer la commande:

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

Sinon caractères générés par le bruit électrique pourrait se retrouver dans le début de la chaîne. Un nouveau caractère de ligne doit faire en sorte que le script python se répande une fois dans la boucle de lecture, puis être prêt à recevoir une chaîne d'effacement. Sinon, vous pouvez ajouter une sortie d'impression au script Python, qui indique simplement qu'il est sur le point de redémarrer. Juste pour que vous puissiez confirmer que le script Python reçoit la commande ok. Une autre chose est que lors de l'exécution dans un script init.d, vos variables d'environnement ne seront pas les mêmes que lorsque vous êtes connecté. Par exemple, les chemins PATH et PYTHONPATH peuvent être différents. Cela peut donc être une bonne idée d'utiliser le chemin complet vers shutdown dans le script python.C'est cette ligne:

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

Vous devrez trouver ce que c'est sur votre système. Peut-être que vous devriez supprimer le sudo aussi pour le script init.d.