2016-12-07 5 views
1

다른 하나의 결과는 아무런 결과도 가져 오지 않았기 때문에 다음을 수행했습니다. Arduino Lenoardo가 USB를 통해 연결되면 종료 할 오렌지 파이 PC가 있습니다. 버튼 2를 통해 입력을받습니다.debian/armbian에 대한 시스템 종료 명령

이 전체 통신은 키보드 입력이 제대로 작동하지 않으므로 직렬로 작동해야합니다.

My Pi는 Orange Pi 하드웨어 용 RetroPie의 복제본 RetrOrangePi를 실행 중입니다. 이제 종료하려면 메뉴 대신 하드웨어 케이스에 장착 된 단추를 사용하고 싶습니다.

이 버튼 (Arduino의 2 번 핀에 연결됨)을 누르면 직렬 명령 (byebyepi)이 Orange Pi로 보내집니다.이 명령은이 정확한 행에서 shutdown 명령을 수신하는 데 사용되는 python 데몬을 실행합니다.

거의 모든 것이 잘 작동합니다. Arduino는 핀 2가 접지 될 때 직렬 신호를 보내고, 은 직렬 모니터로 창에서 확인합니다. init.d 서비스가 실행 중입니다. 모듈 (직렬)이 없기 때문에 파이썬 스크립트에만 문제가있었습니다. 수동으로 실행했을 때 . pip를 설치 한 후 pip로 "pyserial"모듈을 설치했습니다. 이 모듈이 누락되었다는 오류를 없앴습니다.

이제 수동으로 파이썬 스크립트를 실행하면 arduino가 듣고 있습니다. 하지만 핀 2를 접지하면 아무 일도 일어나지 않습니다. Arduino가 led가 켜지면, 신호로 shutdown 명령을 보냈지 만, Pi는 을 종료하지 않고 이유를 모르겠습니다. 나는 또한 init.d/byebyepi에 chmod 755를했다.

누구나 나를 도와 줄 수 있습니까? 감사합니다!이

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

내 파이썬 데몬이 사용 :

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, thank you. – Fleder

답변

0

아마도 명령을 전송하기 전에 빈 줄을 보낼 좋은 생각 일 것입니다 : 전기 노이즈에 의해 생성

그렇지 않으면
if (!digitalRead(abutton)){ 
    Serial.println(""); 
    Serial.println("byebyepi"); 
} 

문자는 문자열의 시작에서 끝날 수 있습니다. 새 줄 문자는 파이썬 스크립트를 읽어 루프에서 한 번 이동 한 다음 명확한 문자열을받을 준비가되어 있어야합니다.

그렇지 않으면 파이썬 스크립트에 일부 인쇄 출력물을 추가 할 수 있습니다. 단지 재부팅이 필요하다고 말합니다. 파이썬 스크립트가 ok 명령을 받는다는 것을 확인할 수 있습니다.

한 가지 더 중요한 것은 init.d 스크립트에서 실행될 때 로그인 할 때와 환경 변수가 같지 않다는 것입니다. 예를 들어 PATH와 PYTHONPATH가 다를 수 있습니다. 따라서 파이썬 스크립트에서 shutdown의 전체 경로를 사용하는 것이 좋습니다.이 줄은 다음과 같습니다.

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

시스템에 무엇이 있는지 찾아야합니다. 어쩌면 init.d 스크립트에 대해서도 sudo를 제거해야한다.