2013-05-09 5 views
1

Это сценарий timelapse для перемещения камеры вдоль тележки. Проблема в том, что когда я запускаю код, иногда (например, на итерации 7), тележка движется, и камера одновременно снимает фотографию. Это как если бы команды не блокировались до того, как следующий будет выполнен. Как вы можете видеть, я пробовал рассеивать сон в коде безрезультатно.Сценарий не блокируется

Вот рабочий процесс:

  1. Raspberry Pi посылает команды на камеру (оснастка фото) и 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? –

ответ

3

Есть (потенциально) две причины, почему это не блокируют при необходимости:

  1. последовательной связи буферизуется, так что до тех пор, как длина данных передается Serial.write() меньше, чем буфер, этот вызов может вернуться до того, как данные будут прочитаны эскизом Arduino. Фактически, в зависимости от длины данных и размера буфера, несколько вызовов до Serial.write() могут завершиться до того, как Arduino выполнит все чтения.
  2. Эскиз Arduino не может блокироваться до тех пор, пока шаговый двигатель не завершит свое движение. Было бы полезно увидеть эскиз, чтобы определить, так ли это.

Сон между вызовами может помочь, но даже если вы можете заставить это работать, вероятно, вы столкнетесь с нечетным, невоспроизводимым поведением.

Решение обеих проблем, описанных выше, заключается в синхронизации действий в коде. Для последовательной связи это может быть достигнуто путем отправки «готового» сообщения из эскиза Arduino в сценарий python, который будет считываться из последовательного порта, пока он не получит это сообщение. Как синхронизировать шаговый двигатель с эскизом Arduino (если необходимо) будет зависеть от того, как кодируется связь Arduino с шаговым двигателем.

Смежные вопросы