基于RT-Thread的两轮平衡小车设计
一、前言
最近参加了RT-Thread官方发起的RT-Robot Car DIY活动,借此机会想总结一些自己本科四年的所学的部分知识。
也可以帮助到那些需要的小伙伴(可以参考我的代码中对RT-Thread的can设备驱动的使用方法,对IIC驱动的使用方法,mpu6050+hmc5883的初始化和数据读取的方法,RT-Thread硬件定时器的使用方法,滑动窗口滤波的链表实现,pid结构的代码参考,pid参数调试方法等)
二、演示
github链接(包括整个keil工程的代码,原理图和PCB,机械图纸和一些参考资料):https://github.com/iamluoyijie/funny_car
小车实物:
两个演示视频链接:https://v.youku.com/v_show/id_XNDMzNzExODMyMA==.html
https://v.youku.com/v_show/id_XNDMzNzExODMxNg==.html
三、详细步骤
硬件上,MCU选用stm32f407zgt6,imu选用gy-86(mpu6050+hmc5883+ms5611)。电机为大疆无刷电机m2006,电机驱动为电调c610,所以选用6s航模锂电池,所以需要设计24V转5v,5v转3.3v稳压电路,分别使用lm2576-5.0和asm1117-3.3稳压芯片,由于电调使用can总线通信,所以需要单片机外接can芯片,选用TJA1050,除此之外就是MCU的一些接口电路,包括led,key,sw下载接口、多路串口、PWM和IO。总得来说比较简单(需要注意一点是:电池24v输出到电调24v输入,是在pcb上走线,单路额定电流10A,线宽需要注意,最好双面都布线)。这是AD18的PCB工程链接,。这是pcb的3d图:
机械上,需要根据电机尺寸单独设计电机支架和小车底板,三视图如下所示:
软件上,我是使用的这个目录下的bsp:https://github.com/RT-Thread/rt-thread/tree/v4.0.0/bsp/stm32f4xx-HAL,需要的功能可以在rtconfig.h文件中开启对应的宏。
- 用rtt的can设备驱动框架,完成了对电机电调的读写控制,具体见keil工程目录下的can_app.c文件,实现了对两个电机的正反转控制,读取电机转速,转矩等数据。
- 由于can读取的电机转速值数据的波动不稳定,再一个因为转速更新频率为1k,速度环控制周期是2ms,所以用滑动窗口滤波算法对数据做了平滑处理,最后pid调参的效果因此好了很多。
- 用rtt的IIC驱动完成了对gy-86传感器(mpu6050+hmc5883+ms5611)的初始化和数据读取,具体见gy-86.c文件,完成了对角速度,加速度,和磁力计数据的读取。
- 然后用Mahony算法(这算法是开源的)把读到的数据解算成欧拉角,见imu.c文件,需要注意的是sampleFreq要根据自己的控制周期来设置,角速度需要归一化。最后解算的pitch和roll角比较稳定,yaw角有一点漂移。
- 然后用rtt的软件定时器,将pid内环速度环控制周期设置为2ms,外环角度环控制周期设置为5ms, 见timer_app.c文件。
- pid参数整定是通过山外调试助手显示波形,通过rtt的FinSH组件在线去修改参数,极大的提高了效率,见timer_app.c文件,。
- pid控制框图如下图所示,其中的PID计算就是最简单的比例+积分+微分的结构,再加上了适当的限幅。
- 平衡车直立就是将下图期望角度设置为0,前进后退则是将期望角度设置为一个合适的正负的角度值,转弯就是在左右轮的期望速度上,加减一个合适的速度值,这角度值和速度值通过PS2摇杆的模拟量给定,就能完成遥控对平衡小车的控制。
- 利用rtt的多线程技术,完成了ps2遥控线程(ps2代码参考的这位朋友的,很好用,在此表示感谢),LED状态显示线程,电机电流保护线程,按键线程,很大程度上简化了程序的设计。
四、不足分析与接下来继续要做的工作。
1、速度内环的pid效果不太理想,500的电机目标转速,实际转速波动有正负50。角度外环0度的期望角度,有正负0.5度的波动,小车运动过程中,速度过快就会倒。我感觉最重要的原因就是电池太重,导致小车重心偏高,其次就角度更新频率太慢,电机转速值不准,pid参数也不是最优。
2、代码上,使用了太多全局变量。led的状态显示没好好弄,ps2的好多按键没利用上。
3、接下里的工作就是,使用RT-Thread的IPC机制,尽量减少全局变量的使用。 通过yaw角度或电机编码器,实现转向环 速度 的闭环控制。增加 前进 和 转向 的位置控制。(前面的都是速度控制),也就是说还要增加3组pid控制。
4、可能会重新设计电机支架,把电池放到电机下面,降低平衡车重心。会增加树莓派,用opencv实现简单的目标跟踪等工作。