我正在尝试使用 Arduino 上的 PWM 端口控制 LED 的强度,并用相机捕获给定设置下 LED 的亮度。 我期望的是,设置为零时,LED 功率最小化,设置为 1 时,功率最大化。
问题是我不知道如何在运行命令来捕获图像之前等待 Arduino 被写入,如下图收集的数据所示:
捕获的 LED 功率(4 个不同的 LED)作为 PWM 输入的函数:
如上所示,由于先前亮起的 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 在捕获之前有时间更新,但即使持续时间很长,问题仍然存在。
问题与我的代码中的前一行有关
# Arm the camera
cam.arm(frames_to_buffer=4)
显然这样做的结果是有一个缓冲区,当我运行这个片段时
frame = cam.get_pending_frame_or_null()
capture = frame.image_buffer
捕获的数据来自之前的 3 个数据点。