8.0 KiB
自平衡莱洛三角形可充电版
介绍
在B站“基于LQR控制器的自平衡莱洛三角形”基础上添加了充电模块 主控芯片使用ESP32,并配置了调参上位机,可以很方便的通过wifi无线调参。无刷控制使用灯哥开源FOC。制作出一个方便复刻的自平衡莱洛三角形,在桌面上作为一个摆件还是非常不错的 展示视频
左:使用灯哥开源FOC2.0板测试
中:13*13cm立创紫PCB
右:10*10cm最终版本
1 软件架构
自平衡控制为LQR算法输出期望速度,使动量轮加速运动从而控制三角形左右方向。并且代码的调参都可以通过连接ESP32的wifi调整。具体特性如下:
- 基于 Arduino:运行在 ESP32 Arduino 上
- 自带测试模式:电压测试和速度测试,可以单独输出电压让电机转动,也可以设置指定速度让电机保持速度
2 硬件特性
说明 | 参数 |
---|---|
莱洛三角形尺寸 | 100*100 mm |
动量轮尺寸 | 80*80 mm |
电池*3 | 厚x长x宽:7.9mmx25mmx40mm 规格内均可 |
输入电压 | 3.7v锂电池*3 |
充电电压 | 5V 从Type-C口输入 |
充电芯片CS5095 | 5V输入,最大1.2A充电电流 |
串口芯片CH340C | 需要 打开开关 才能下载 |
主控芯片 | ESP-WROOM-32 |
电机驱动芯片L6234PD | 引脚:32, 33, 25, 22; 22为enable |
AS5600 编码器 | SDA-23 SCL-5 芯片要离磁铁有 2mm以上高度 |
MPU6050六轴传感器 | SDA-19 SCL-18 |
3 使用说明
-
前往灯哥开源FOCgit下载Arduino开发环境(
也可自行下载Arduino并安装SimpleFOC)并打开本项目内的Arduino内的main。 -
烧录程序到ESP32:选择工具-开发板-esp32 Arduino-ESP32 Dev module,然后连接USB口选择对应的com口,编译上传。
- 如无法正常编译
- 情况1:wifi库重复,删除文件夹Arduino\libraries内的wifi文件夹。
- 情况2:可能与原有arduino冲突,请卸载原有的arduino。
- 情况3:文件夹路径含有非法字符,可以把Arduino移动到硬盘根目录下,如D:\Arduino
- 如无法正常编译
-
打开本项目内的
python_gui
内的可执行文件_main
内的main.exe并连接上WIFI:ESP32 密码:12345678。点击设置开始调参。 -
连接成功后,点击disable,然后逆时针拨动动量轮,查看上位机中V参数是否为正值。注意!如果 逆时针转为为负值 那么需要将电机线任意两线互换。
-
如果电机不能正常运行可以,点击上位机中最下方的 测试部分 ,打开电压或者速度测试,滑动滑条,查看电机能否正常运行。如还不能请检测硬件电路部分。
-
如果不能摇摆直立,推荐调整的参数为TA、SA、SV
-
K值可以用滑块调整,拖动滑块就会发送参数命令,但是调整到合适值之后需要自行在Arduino的main中修改再烧录一次
-
滑条:最左边输入框为滑块下限,右边是滑块上限,滑条等分成200份,命令是字符串,滑动滑块发送字符串 + 数值
比如让平衡角度为90度,则输入:TA90,并且会存入eeprom的位置0中 注:wifi发送命令不能过快,因为每次都会保存进eeprom,K参数没有保存到EEPROM所以可以使用滑条调整。
参数命令 | 说明 |
---|---|
TA | target_angle平衡角度 例如TA89.3 设置平衡角度89.3 |
SV | swing_up_voltage摇摆电压 左右摇摆的电压,越大越快到平衡态,但是过大会翻过头 |
SA | swing_up_angle摇摆角度 离平衡角度还有几度时候,切换到自平衡控制 |
VP1 | 速度环的PID的P,1是稳定在平衡角度之前的P值 |
VI1 | 速度环的PID的I,1是稳定在平衡角度之前的I值 |
VP2 | 速度环的PID的P,2是稳定后的P值 |
VI2 | 速度环的PID的I,2是稳定后的I值 |
K为LQR参数 | 3和4是速度控制稳定前和后 |
K31 | LQR的参数1:稳定前的角度差值 |
K32 | LQR的参数2:稳定前的左右倾倒加速度 |
K33 | LQR的参数3:稳定前的当前速度 |
K41 | LQR的参数1:稳定后的角度差值 |
K42 | LQR的参数2:稳定后的左右倾倒加速度 |
K43 | LQR的参数3:稳定后的当前速度 |
LQR算法解释:当三角形向←倾斜时,需要产生向→的力回正。 |
在电压控制下:回正力F直接和输出电压值挂钩,向←倾斜,电机提供正电压V动量轮向左加速转动,产生向右的力F。
期望电压 = 角度差值x参数1 + 左右倾倒加速度x参数2 + 当前速度x参数3
在速度控制下:回正力F和动量轮转速加速度a有关,F = ma,向←倾斜,电机需要向左加速转动,产生向右的力F。
期望速度 = 角度差值x参数1 + 左右倾倒加速度x参数2 + 当前速度x参数3
两者区别:电压和速度控制都可以实现平衡,但因为使用simpleFOC控制电机转速无法无限加速,本电机实验最高转速180转,电压到上限12v。
使用电压控制会遇到,电机一下子就到了转速上限,就不能提供稳定的力F,参数调起来比较困难。
速度控制可以在偏差变大的时候,根据期望速度产生最大电压12v,并且不会超过电机最高转速。
4 硬件设计
使用立创EDA绘制电路原理图,LaserMaker绘制莱洛三角形和动量轮(有激光切割机可以事先切割结构作为参考)。将绘制完的图形导入到立创EDA中可作为PCB的外框。丝印图案分别是Gawr Gura、ouro kronii helicopter
LaserMaker绘制的plt在莱洛三角结构文件夹内,需要重新绘制电路图可以使用
感谢嘉立创的PCB制板,使DIY电路制作变得非常便利,点击下方超链接可以前往嘉立创进行PCB制板
具体需要购买的物品在物料清单.xlsx中,如果缺货请自行某宝更换
5 Ctrl+C +V(参考)
Arduino上的控制算法是原作者的LQR,无刷电机控制是灯哥开源FOC。电机控制引脚定义与传感器定义和灯哥开源FOC控制板2.0版一样。
Python的GUI是SimpleFOC的SimpleFOCStudio。
充电电路是立创广场开源的CS5095充电方案。
- 原作者:基于LQR控制器的自平衡莱洛三角形BV19v411n7mN
- 灯哥开源FOC https://gitee.com/ream_d/Deng-s-foc-controller
- 充电芯片电路https://oshwhub.com/Aknice/cs5095e-san-jie-li-dian-chi-sheng-ya-chong-dian-dian-lu
6 有用的地方
-
Arduino的程序中的command.h、command.cpp可以支持任意的字符串输入。在其他项目中一样可以用,无论是wifi接收到的字符串数据或者是串口的字符串数据。
-
GUI上位机可以在其他wifi项目中可以继续使用,用来调参还是很方便。
7 未解之谜
问题1:在传感器读取当前角度pitch在0和360来回切换时候,卡尔曼滤波值会慢慢变化,得到的值无法反映正确的当前角度。导致有一个面无法摇摆平衡。
问题2:摇摆到平衡态时,参数不太好时,可能会摇摆过头,或者一直左右摇摆不能到平衡态。就算调好参数也会偶尔发生摇摆过头现象。
8 交流Q群
45coll电子交流QQ群:824113552
欢迎交流与沟通
群文件内有PCB、元器件下单以及软件安装的教程视频