2013-05-09 1 views
1

이것은 돌리를 따라 카메라를 움직이는 시간 경과 스크립트입니다. 문제는 내가 코드를 실행할 때, 가끔씩 (예를 들어 반복 7에서) 돌리가 움직이고 동시에 카메라가 사진을 찍는다는 것입니다. 다음 명령이 실행되기 전에 명령이 차단되지 않는 것과 같습니다. 보시다시피, 코드에서 아무렇지도 않은 수면을 시도했습니다. 여기 스크립트가 차단되지 않습니다.

워크 플로입니다 :

  1. 라즈베리 파이 카메라에 명령을 전송한다 (사진 스냅)와 아두 이노 (돌리 이동) 아두 이노는 스테퍼로 이야기하는 EasyDriver Stepper Motor Driver 회담 및 이동 돌리가 발생
  2. .
  3. 반복.

여기 내 파이썬 스크립트입니다.

import os, commands, string, gps 
from subprocess import Popen, PIPE 
from time import sleep 
import serial 

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

for i in range(0, 20): 
    #To write information 
    steps = 1000*(i+1) 
    ser.write('1,'+str(steps)+'/n') 
    sleep (4) 

    bashCommand = "sudo /home/mh00h/Timelapse/camerareset.sh" 
    os.system(bashCommand) 
    sleep (2) 
    bashCommand = "sudo gphoto2 --capture-image" 
    os.system(bashCommand) 
    sleep (1) 
+0

Arduino 스케치는 어떻게 생겼습니까? –

답변

3

이것으로 차단하지 않는 이유 (잠재적으로) 두 가지 이유가있다 필수 : ​​

  • 직렬 통신 버퍼링
      너무 긴 Serial.write()에 전달 된 데이터의 길이가보다 작아지면 이 호출은 데이터가 Arduino 스케치에 의해 읽히기 전에 리턴 할 수 있습니다. 실제로 데이터의 길이와 버퍼 크기에 따라 Arduino가 읽기를 완료하기 전에 Serial.write()에 대한 여러 번의 호출이 완료 될 수 있습니다.
    1. 스테퍼 모터의 움직임이 완료 될 때까지 Arduino 스케치가 차단되지 않을 수 있습니다. 이것이 사실인지를 결정하기 위해 스케치를 보는 것이 유용 할 것입니다.

    전화 중 잠자기가 도움이 될 수 있지만 작동하도록 설정해도 이상하고 재현 할 수없는 동작이 발생할 수 있습니다.

    위의 두 가지 문제에 대한 해결책은 코드의 작업을 동기화하는 것입니다. 직렬 통신의 경우 Arduino 스케치에서이 메시지를받을 때까지 직렬 포트에서 읽는 Python 스크립트로 '완료된'메시지를 보내면됩니다. Arduino 스케치 (필요한 경우)와 스테퍼 모터를 동기화하는 방법은 Arduino가 모터 통신을 스테핑하는 방법에 따라 달라집니다.

  • 관련 문제