1

这是一个用于沿着小车移动相机的延时脚本。问题是,当我运行代码时,有时(例如,在第 7 次迭代中)小车正在移动,而相机会同时拍摄一张照片。就好像命令在执行下一个命令之前没有阻塞一样。如您所见,我尝试在代码中分散睡眠无济于事。

这是工作流程:

  1. Raspberry Pi 向相机(快照)和 Arduino(移动小车)发送命令
  2. Arduino 与EasyDriver 步进电机驱动器对话,后者与步进器对话并导致小车移动。
  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)
4

1 回答 1

3

这没有按要求阻止有(可能)两个原因:

  1. 串行通信是缓冲的,因此只要传递给的数据长度Serial.write()小于此调用可以在 Arduino 草图读取数据之前返回的缓冲区。事实上,根据数据的长度和缓冲区的大小,Serial.write()可以在 Arduino 完成任何读取之前完成几次调用。
  2. 在步进电机完成移动之前,Arduino 草图可能不会阻塞。查看草图以确定是否是这种情况将很有用。

在通话之间睡觉可能会有所帮助,但即使您可以使其正常工作,您也可能会遇到奇怪的、不可重现的行为。

上述两个问题的解决方案是同步代码中的操作。对于串行通信,这可以通过将“完成”消息从 Arduino 草图发送回 python 脚本来实现,该脚本将从串行端口读取,直到收到此消息。如何将步进电机与 Arduino 草图同步(如果需要)将取决于 Arduino 到步进电机通信的编码方式。

于 2013-05-09T09:03:13.047 回答