我正在使用Pointgrey Firefly MV(精确的FFMV-03M2M / C),并希望在每次快门启动时触发一些外部设备。根据{{3}},相机支持IIDC 1.31,并提供四个可用作触发和/或选通信号输出的GPIO。如the datasheet的4.11.3节所述,应该可以使用IIDC配置那些选通信号输出。
我的应用程序是用C ++实现的,并使用IIDC standard来访问和控制摄像头。到目前为止,一切都运行良好,但我无法配置选通信号输出。据我所知,libdc和IIDC应该可以按如下方式启用第一个输出(camera
是指向有效dc1394camera_t
的指针):
dc1394error_t err;
uint64_t strobe_offset = 0x200;
uint32_t strobe_settings = 0;
err = dc1394_get_strobe_register(camera, strobe_offset, &strobe_settings);
if (err == DC1394_SUCCESS) {
/* Set bits 6 (strobe on) and 7 (active-high level)
IIDC uses msb 0, so we need to shift by 25/24 instead of 6/7 */
strobe_settings = strobe_settings | (1 << 25) | (1 << 24);
err = dc1394_set_strobe_register(camera, strobe_offset, strobe_settings);
}
if (err != DC1394_SUCCESS) {
log(LOG_ERROR, "Failed to set strobe.");
}
这不会产生任何错误,但它也不会打开选通信号输出(即使相机正在捕捉帧)。我也通过使用不同的偏移量(0x204,0x208和0x20C)尝试了所有其他输出,但无济于事。然后,我检查了Strobe_CTRL_Inq
和Strobe_[0123]_Inq
处的所有可用性查询字段,但它们都报告了选通信号输出存在。但有趣的是,On/Off_Inq
中的Strobe_[0123]_Inq
字段告诉我,当Polarity_Inq
告诉我可以更改极性设置(我实际上是这样)时,无法打开或关闭输出不能,因为你只能在选通信号输出打开时更改设置)。我尝试使用Pointgrey提供的基于Windows的驱动程序实用程序配置输出,并且它可以毫无问题地工作。
任何想法我可能做错了什么?或者这个相机在这方面不兼容IIDC吗?
更新:好的,我尝试了三种方法来启用选通输出:使用我的原始代码,使用答案中建议的绝对偏移量0x1300,并使用PointGrey寄存器参考手册中记录的偏移量0x1110 / 0x1114。我还尝试设置延迟,持续时间和/或方向(即使PIO不与频闪输出混淆)。到目前为止,没有寄存器和标志的组合。也许这是libdc1394中的一个错误,或者PointGrey在其专有驱动程序中做了一些其他魔术。现在我放弃了,并试图找到一种不同的触发外部设备的解决方案。
答案 0 :(得分:2)
浏览(无法访问,无法获得技术参考)相机文档,您似乎需要为GPIO设置方向,即它们是输入还是输出。该文档描述了0x11F8处的PIO_DIRECTION寄存器,其中低有效位控制IO是输入(0)还是输出(1)。也许你的问题是方向没有设定?
http://ptgrey.com/support/downloads/documents/TAN2005002_Output_strobe_signal_pulse.pdf
将相机寄存器映射与标准相比较,相机似乎应支持此功能。我在libdc1394中找不到get / set_strobe_register API的任何文档。也许get或set_register使用相机记录的寄存器偏移将更好地工作。你是如何将0x200视为你的偏移?
这个http://www.cs.unc.edu/Research/stc/FAQs/Cameras_Lenses/PtGrey/DcamRegisterRefManual.pdf记录了你试图在0x1300访问的寄存器,所以可能有一些固定的已知偏移用于访问“strobe”寄存器?同样,也许使用set_register将允许直接访问所有相机寄存器,因此您可以使用记录的旧集。
另一件事是你需要为频闪设置延迟和计数。