设计一款基于事件驱动原理的树莓派追踪器
扫描二维码
随时随地手机看文章
固定式太阳能电池板会损失高达 30%的潜在能量,因为它们无法跟随太阳的移动。虽然存在商业化的双轴跟踪器,但它们价格昂贵,且采用基于光敏电阻的简单控制方式,在阴天条件下效果不佳。
我们的解决方案
我们在一台 Raspberry Pi 5 上构建了一个基于 C++17 的实时嵌入式应用程序,该程序利用基于摄像头的视觉技术来检测太阳,并驱动一个 3-RRS 斯特劳特型并联平台来调整太阳能电池板的方向。整个软件流程是基于事件驱动的,没有使用任何轮询循环——每个传感器都是通过阻塞式 I/O 来唤醒其线程的。
它是如何运作的
该软件流程的运行方式为:
•相机 → 太阳追踪器 → 控制器 → 三自由度运动学系统 → 执行器管理器 → 伺服驱动器
•IMX219 串行摄像头通过 libcamera 回调机制以每秒 30 帧的频率捕获图像帧。
•太阳追踪器会检测出最亮的区域,并计算出其中心位置。
•控制器将像素误差转换为倾斜/平移设定值
•逆运动学将平台的方位转换为三个伺服角度
•执行器管理器会实施安全夹紧机制和速度限制措施
•伺服驱动器通过 PCA9685 借助 I2C 与三个伺服电机进行通信。
•平均端到端延迟时间为 8.37 毫秒——远低于 33 毫秒的帧周期。
主要技术特点
•事件驱动架构:timerfd、signalfd、eventfd、GPIO 边缘中断、条件变量——完全没有使用轮询机制
•多线程:相机、控制、执行器以及图形用户界面调度器线程都会从事件中唤醒。
•使用 std::function 和抽象接口实现的基于回调的类间通信
•通过 MPU6050 的数据就绪 GPIO 中断实现 IMU 反馈,以进行平台倾斜补偿。
•通过电位器(ADS1115 的 ALERT/RDY GPIO)或 Qt 图形用户界面进行手动控制
•基于帧的定量延迟监测及 CSV 文件导出功能
60 多个自动化测试用例,涵盖视觉、控制、运动学、状态机以及线程安全等方面。
硬件
•树莓派 5(4GB)
•IMX219 串行摄像头模块
•PCA9685 交流伺服驱动器(I2C 通信地址为 0x40)
•3 台 DS3230 大扭矩伺服电机
•ADS1115 16 位 ADC(I2C 接口地址为 0x48),配备 2 个音量调节旋钮
•MPU6050/ICM-20600 加速度计/陀螺仪(I2C 总线地址为 0x68)
•5-6 伏外部电池,用于伺服电机供电
•3D 打印的 3-RRS 斯图尔特平台
代码
本文编译自hackster.io





