脚本没有阻止

时间:2013-05-09 02:14:28

标签: python arduino raspberry-pi timelapse

这是一个用于沿着小车移动相机的游戏中时光倒流脚本。问题在于,当我运行代码时,有时(例如,在迭代7中),小车正在移动并且相机同时拍摄照片。就好像命令在下一个命令执行之前没有阻塞。正如你所看到的,我已经尝试在代码中散布睡眠无效。

以下是工作流程:

  1. Raspberry Pi将命令发送到相机(快照照片)和Arduino(移动小车)
  2. Arduino与EasyDriver Stepper Motor Driver交谈,{{3}}与步进器对话并导致小车移动。
  3. 重复。
  4. 这是我的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)
    

1 个答案:

答案 0 :(得分:3)

(可能)有两个原因可以解释为什么不按要求阻止:

  1. 串行通信被缓冲,因此只要传递给Serial.write()的数据长度小于缓冲区,该调用就可以在Arduino草图读取数据之前返回。实际上,根据数据的长度和缓冲区的大小,在Arduino完成任何读取之前,可以完成对Serial.write()的多次调用。
  2. 在步进电机完成运动之前,Arduino草图可能无法阻挡。查看草图以确定是否是这种情况会很有用。
  3. 在通话之间休息可能会有所帮助,但即使你能让它发挥作用,你也可能会遇到奇怪的,不可重复的行为。

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