在捕获图像之前等待 pyfirmata 子例程结束

问题描述 投票:0回答:1

我正在尝试使用 Arduino 上的 PWM 端口控制 LED 的强度,并用相机捕获给定设置下 LED 的亮度。 我期望的是,设置为零时,LED 功率最小化,设置为 1 时,功率最大化。

问题是我不知道如何在运行命令来捕获图像之前等待 Arduino 被写入,如下图收集的数据所示:

捕获的 LED 功率(4 个不同的 LED)作为 PWM 输入的函数:
figure 1

如上所示,由于先前亮起的 LED 尚未关闭,因此强度出现接近零的峰值。这是正在使用的代码片段:

# Iterate over each LED
for i in range(4):

    board.pass_time(0.4)
    time.sleep(0.4)

    # Reset all pins to zero
    for j in range(4):
        led_pins[j].write(0)
    
    # Select the relevant pin
    pin = led_pins[i]
    
    # Iterate over each data value
    for j in range(N):

        print(i, j)

        # Set the power of the given LED
        pin.write(vals[j])
        board.pass_time(0.4)
        time.sleep(0.4)
        # os.wait()

        # # Start a thread to take a capture
        # thread = threading.Thread(target=take_capture_thread, args=(cam,))
        # thread.start()
        
        # # Wait to rejoin with thread
        # thread.join()
        
        # Take a capture
        for k in range(10):
            cam.issue_software_trigger()
        frame = cam.get_pending_frame_or_null()
        capture = frame.image_buffer

        # Measure the average power at the center of the image
        data[i, j] = np.average(capture[selection])

即使在 board.pass_time() 和 time.sleep() 中输入更长的持续时间,问题也没有解决。 我认为问题在于这些命令是在代码完成写入 Arduino 之前运行的,这就是它们没有效果的原因。 我想知道如何确保在运行 time.sleep() 命令之前完成写入 Arduino 的命令,以确保相机捕获正确的数据,并且不会延迟。

我尝试使用 time.sleep() 和 board.pass_time() 来确保 Arduino 在捕获之前有时间更新,但即使持续时间很长,问题仍然存在。

python arduino-uno led pyfirmata
1个回答
0
投票

问题与我的代码中的前一行有关

# Arm the camera cam.arm(frames_to_buffer=4)

显然这样做的结果是有一个缓冲区,当我运行这个片段时

frame = cam.get_pending_frame_or_null() capture = frame.image_buffer

捕获的数据来自之前的 3 个数据点。

© www.soinside.com 2019 - 2024. All rights reserved.