设计一款专为鸟类设计的喂食器,由 Arduino UNO Q 供电
扫描二维码
随时随地手机看文章
我们的鸟食器总是遭到松鼠、金花鼠以及其他非鸟类动物的频繁侵扰——以至于“鸟食器”这个名称几乎都不合适了。所以我想利用 Arduino UNO Q 强大的物体检测功能来制作一个只供鸟类使用的食器。
开始步骤
UNO Q 的使用灵活性极高,因为它既可以像普通的 Arduino 开发板在 PC 主机模式下直接连接到您的电脑上,也可以在网络模式下进行远程连接,甚至还能在单板计算机模式下成为一台完整的计算机。完成初始设置后,我通过 USB-C 集线器连接了键盘、鼠标和显示器,并直接在设备上探索了 UNO Q 的开发环境——App Lab。摄像头检测物体的示例听起来与我的构想非常契合,所以我连接了一个 USB 摄像头并进行了测试。
“在摄像头上检测物体”这个示例使用了 App Lab 的“视频对象检测”模块,它为您的项目添加了拖拽式对象检测功能。我对该预训练模型的速度和准确性印象深刻,它内部使用了 Edge Impulse 的 FOMO(更快的物体,更多的物体)机器学习算法。我原本期望需要自己训练模型,但使用 yolox-object-detection 并结合视频对象检测模块能够可靠地检测出鸟类,为我节省了大量的工作量!我发现该对象检测算法将板子推到了极限,使得在 SBC 模式下运行时难以与图形用户界面进行交互,但将屏幕分辨率降低到 1280×720 似乎有所帮助。
利用双脑模式
虽然 UNO Q 可以作为单板计算机(SBC)使用,但它还配备了一个 STM32 微控制器(MCU),其与常见的 Arduino 开发板中的“大脑”部分更为相似。这便于与传感器和执行器进行交互,并且桥接库使得 SBC 和 MCU 能够进行通信,例如通过与 MCU 连接的引脚响应 Linux 部分通过网络摄像头检测到的内容来移动一个伺服电机。
一个简单的 Python 脚本会启动检测过程,并在检测到物体时执行一个回调函数:
当检测到鸟类时会调用“bird_detected()”函数,而当检测到任何物体时则会调用“anything_detected()”函数,这样便于进行调试,并能更清楚地了解摄像头所拍摄到的内容。两者都使用“print()”来表明它们已被触发,但“bird_detected()”还会通过“Bridge”调用项目中“Arduino 代码部分”的“bird()”函数。
除了将“鸟!”这一信息输出到串行监视器以表明该函数已执行完毕之外,bird() 函数还会对连接到数字引脚 D9 的一个舵机进行 5 次扫描操作,这会将种子通过储物槽中的一个隔板推出来,供检测到的鸟儿食用。
既然我的应用程序已按预期正常运行,我就在“应用实验室”中将其设置为开机自动启动,并且断开了键盘、鼠标和显示器的连接。
实地测试
由于我在户外时很难让任何鸟类或金花鼠在镜头前摆姿势,所以我便打印了一些照片,并将它们举到镜头前。这些照片效果不错,但由于伺服器被嵌入到了鸟食器内部,我之前用作指示设备正常运行的那声嗡嗡声变得变得模糊不清了。起初,我使用我心爱的 Openterface Mini-KVM 来监控这个项目,但最终我希望它能够无需任何计算机设备连接就能运行,于是决定利用 UNO Q 的 8×13 液晶矩阵来帮助传达应用程序的状态。通过使用 LED 矩阵绘制器示例,我绘制了粗糙的鸟和 X 像素艺术,并将生成的六边形数组添加到我的草图中:
随后,我使用了“loadFrame()”函数,在检测到鸟类时显示鸟类图形,而在没有检测到时则显示“X”。这样就便于从远处判断检测结果是否准确了。
注意:专为 UNO R4 的 8×12 液晶矩阵设计的出色网络版 LED 矩阵编辑器并不适用于 UNO Q。
结果与结论
使用 YOLOX 检测技术结合视频对象检测模块,即可立即实现无需额外训练即可达到的精准鸟类识别功能,相比训练自定义模型而言,节省了大量时间。UNO Q 的双脑 SBC/MCU 架构使得在 Linux 端对检测结果做出响应来驱动伺服电机变得十分容易。如果您想亲自尝试一下,只需将 USB 摄像头和带电源的 USB-C 集线器连接到 UNO Q 上,将一个伺服电机连接到 5V/GND/D9 端子,并将我的 GitHub 仓库压缩包导入 App Lab 即可。我简直被自己能够如此迅速且轻松地实现这个想法的能力所震撼!
下一步措施/未来改进措施
尽管我之前使用预制模型已经取得了成功,但我仍想利用当地的动物来训练自己的模型——或许不必排除松鼠和金丝雀,而是可以在检测到它们时为它们提供单独的食物,使用第二个伺服电机和种子储存器即可。或者反其道而行之,实施某种威慑措施!我希望能用激光切割的亚克力材料替换纸板储存器的侧壁/伺服电机安装座,并改进种子舀取装置,使其比使用简单的伺服臂的装置更有效。此外,使用外部电源为伺服电机供电也是一种最佳实践,而不是直接使用板子供电。为抵御恶劣天气并可能在夜间访客被检测到时提供小灯,这些措施都能进一步延长设备的实用性。
代码
本文编译自hackster.io





