2013-05-09 101 views
1

這是一個沿着小車移動攝像機的延時腳本。問題是,當我運行代碼時,有時(例如,第7次迭代)移動攝像機移動,相機同時捕捉照片。就好像這些命令在下一個執行之前沒有被阻塞。正如你所看到的,我試圖在代碼中散佈睡眠,但無濟於事。腳本不阻擋

下面是工作流程:

  1. 樹莓裨將命令發送到相機(單元照片)和Arduino的(移動臺車)
  2. Arduino的談話EasyDriver Stepper Motor Driver,其中談到到步進並且使臺車移動。
  3. 重複。

這是我的Python腳本。

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草圖是什麼樣的? – 2013-05-09 08:49:46

回答

3

有(潛在地)兩個原因,這並不阻止根據需要:

  1. 串行通信緩衝,所以只要將數據傳遞給Serial.write()的長度比小在Arduino草圖讀取數據之前,該調用可以返回緩衝區。實際上,取決於數據的長度和緩衝區的大小,在Arduino完成任何讀取之前,可能會完成對Serial.write()的多次調用。
  2. 直到步進電機完成其運動後,Arduino草圖才能阻止。查看草圖以確定是否是這種情況會很有用。

在通話之間睡覺可以提供幫助,但即使您可以使用此功能,您也可能會遇到奇怪的,不可重複的行爲。

解決上述兩個問題的方法是同步代碼中的操作。對於串行通信,這可以通過從Arduino草圖中將「完成」消息發送到將從串行端口讀取的python腳本直到它接收到該消息來實現。如何將步進電機與Arduino草圖同步(如果需要)將取決於Arduino與步進電機通信的編碼方式。