硬件
-
Arduino Nano R3 × 1 -
SparkFun步进电机驱动板A4988 × 2 -
步进电机,迷你步进 × 2 -
DFRobot MPU-6050 6 DOF传感器 × 1
建模
模拟情况:https://www.kaggle.com/zjor86/simulations-self-balancing-robot
我在上面的链接中,详细描述了项目的模型以及模拟的情况。
强烈建议大家也能在建立系统之前进行模拟,并在一个虚拟环境中调整好参数。
设备选择
到目前为止,采用的设置如下:
-
Arduino Nano,16MHz,我试图尽可能地压榨更多板子的计算能力,后续可能会用BlackPill(100MHz)或ESP32 WROOM(80-240MHz)取代它。实验证明频率是一个很重要要素。 -
Nema 17步进电机 × 2 -
A4988步进驱动器 × 2 -
MPU6050 - 陀螺仪和加速度计,带有板载的DMP,我也试过用更高级的芯片MPU9250,不过目前还没有找到好的库支持。
反馈控制回路
我使用了2个嵌入式PID控制回路,一个用于保持直立位置;
另一个用于稳定速度或位置。
实施说明
步进控制
机器人通过施加一个与角度大致成正比的力来平衡自己。这意味着,电机应该随着加速度转动。由于我们有步进电机,我们需要计算下一步的延迟,最好是在每一步之后(或尽可能快)。
但是,步进本身在时间上是精确的,所以我使用了一个定时器中断来进行步进和40kHz的频率(试过用从8kHz到100kHz的频率,效果很好,但是它占用了CPU周期,而且控制不是很流畅)。这个过程应该尽可能地快,而且不应该包含任何浮点计算。
速度更新
下一个对时间敏感的任务是更新速度和重新计算步长延迟,这应该比测量路由运行的速度快;否则“力”将没有足够的时间作用和产生效果。
控制循环
这个程序负责读取IMU(MPU6050),计算必要的控制信号,例如速度更新回路的加速度。
使用DMP
DMP(数字运动处理器)负责合并来自陀螺仪和加速度计的数据,为你提供漂亮而平滑的偏航-俯仰-滚动数据。它卸载掉了Arduino运行缓慢的CPU,在实践中,与手写的互补滤波器相比,我在改用DMP后得到了5倍的主循环速度。
电路图
▲ 可以点击放大观看
项目的后续
我会分享我的改进和后续的升级计划,如果大家有兴趣,也欢迎一起加入进来。
后续将考虑:
-
使用更强大的CPU(BlackPill, ESP32) -
通过WiFi或BLE或nRF24L01增加遥控的功能 -
把它做成一个教育套件,更加易于组装和大家理解 -
把这个机器人变成一个有API的平台,这样就有可能把其他设备安装在上面
原文始发于微信公众号(21ic电子网):超牛DIY!用步进电机和Arduino Nano做一个自平衡机器人
文章评论