:你应该见过很多平衡车,比如最有名的车自行车平衡车。那东西太高级了,普通人做不到。作为学生或学生DIY爱好者做小的mini平衡车还是可以实现的。
全国16届恩智浦杯大学生智能汽车大赛新增,平衡车的实现正成为电子爱好者最受欢迎的项目。如果你是电子专业的嵌入式开发爱好,你必须做一辆平衡车。今天,我们将为您带来一个由博主老倪制作的迷你平衡自行车项目。虽然时间有点长,但我相信我们仍然可以从中学到一些新东西。
下面两张图是龙邱科技为16届智能车竞赛生产的电单车K车模高配版摩托车图片
下图是本项目的简单描述mini版平衡小车
自行车平衡DIY介绍分为三部分:
第一部分介绍了自行车平衡的基本物理原理;
第二部分理论分析了平衡自行车的算法,包括模型分析、姿态检测方法PID算法,控制算法;
第三部分实践介绍了平衡自行车使用的部件、动力、转向、电路和代码分析。
一、自行车平衡原理
如何平衡自行车,外国人做了一个很好的视频,很好地证明了常见的角动量守恒是错误的,正确地表明自行车平衡原理与转向有关,但没有具体指出平衡与转向的关系。
我们先来讨论一下。为什么最常见的猜测是错误的,大致讨论转向是如何平衡自行车的。
角动量守恒说
角动量守恒意味着车轮在运行时旋转,此时车轮类似陀螺,角动量守恒使自行车保持不下降。
当我还是个孩子的时候,我也有这样一个问题,如果自行车轮从下坡固定,自行车可以继续前进吗?
到底能不能呢?老外的视频做了这个试验:
固定后,它会倒下。可以看出,车轮的陀螺仪效应不是保持自行车不倒下的原因。此外,外国人还制造了一辆没有陀螺仪效应的自行车,它也可以稳定平衡:
这足以说明陀螺仪效应不是维持自行车平衡的根本原因。
2.离心力是自行车平衡的根本原因
那么保持自行车平衡的原因是什么呢?
自行车可视为倒置摆(左右方向不稳定)。这种倒置摆在重力作用下是一个不稳定的系统,需要额外的回复来保持平衡,而提供回复的是自行车转向时的离心力。
离心力是速度和手柄转向角的函数,在固定速度下,控制手柄转向角是控制回复力。
让我们先记住这一点:
机械自平衡
有些人可能会想,有些自行车只要推起来就能平衡自己,比如下面的视频:
我自己也买了一辆遥控摩托车,想研究一下:
拆卸后发现里面没有准确的转向控制结构,好像开车时根本没有转向控制,就像上面的自行车一样。
这到底是怎么回事?事实上,这就是结构设计师的力量。设计的机械结构具有自己的回复功能。机械结构使转向根据车身倾斜而变化。这种变化的范围可以稳定和平衡自行车。
如果我们改变车身结构,我们可能会破坏原始参数,使自行车无法稳定平衡。例如,将重物绑在前轮上:
在外国人的视频中,分析了车身倾斜对转向的三个影响因素:
前轮轴向后倾斜,导致前轮向后倾斜。
将把手安装在前面,导致前轮倾斜。
陀螺仪效应、车身倾斜、陀螺仪效应使前轮转向。
01:36
以上是所谓的机械自平衡。平衡的根本原因是转向,但巧妙的机械设计使前轮转向特性很容易保持平衡。
手动自平衡
手动自平衡意味着我们手动控制平衡它。
既然我们分析了平衡原理,我们就应该做一辆平衡自行车。我们应该仔细研究这一部分,并将重点讨论控制方法。
二、平衡自行车-理论文章
一、模型分析
1、倒立摆
显然,我们知道自行车在左右方向不稳定,这是一种非常常见的物理模型——倒立摆。
顾名思义,倒立摆就是倒立摆,比如倒立杆,
倒立摆的特点:不稳定,只要偏离平衡位置,就会有力(重力分离)使系统更偏离平衡位置,使偏差越来越大。
一般来说,倒立杆可能在前后左右方向倒下,在二维平面上不稳定;自行车只能在左右方向倒下,这是一个一维的倒置摆,这更简单。
以下是生活中几个常见的倒立摆例子:
2.自行车的平衡控制
自行车属于倒立摆模型,倒立摆不稳定,那么如何控制倒立摆才能平衡呢?
让我们分解问题:
平衡是什么状态?
我们能控制什么?
如何控制稳定平衡?
2.1 平衡是什么状态?
我们需要数学地描述平衡。所谓平衡,其实就是倒立的倾角稳定在我们想要的值上。
我们通常想要平衡θ = 0
处。
2.2 我们能控制什么?
对于倒置摆模型,我们通常可以控制底部的力、速度或位置,不同的控制量对应不同的控制方法。
对于自行车来说,它的控制模式不像通常的倒立摆那样直接控制底部,而是间接地通过转向控制。当自行车以固定速度前进时,自行车把手从一定角度转向(设置为α),自行车会做相应半径的圆周运动,产生相应大小的离心力。
在自行车的习惯性系统中,只要把手转向一定角度(α),会产生相应大小的横向力:
这就是我们平衡控制时的实际控制量——把手转角α,控制它可以控制回复力。
2.3 如何控制平衡?
以上我们已经能够通过转向产生回复力了,这种回复力能把倒立摆掰回平衡位置,有回复能稳定平衡吗?
不是这样。让我们回顾一下中学物理:
“过阻尼的摆动会以较慢的速度回到平衡位置;欠阻尼的摆动会很快回到平衡位置,但会在平衡位置来回摆动;临界阻尼的摆动会以最快的速度稳定在平衡位置。
”
结合实际的自行车平衡是:
“如果恢复不够大,无法纠正,或者纠正速度慢,会导致系统不稳定;如果回复过大,会导致过度纠正,也会导致系统不稳定;我们最希望的状态是回复正确,只是使倒置快速回到平衡位置,而不是过度纠正。
”
这是一个复杂的数学计算过程,系统运行时会不断计算回复力大小(本平衡自行车为20辆)ms计算一次),用的是PID以后会详细介绍算法。
3.自行车平衡需要解决的基本问题
左右倾角θ
转角用适当的算法控制α使系统稳定平衡
这将在下面详细讨论。
二、姿势检测
什么是检测?
检测自行车左右倾斜角度。
2、怎么检测
用一个叫gy521模块,里面用的是mpu带陀螺仪和加速度传感器的6050芯片。
gy521的具体使用将在第三篇实践文章中介绍。在这里,我们知道通过这个模块,我们可以从自行车的各个方向获得加速度和角度速度。请注意,我们不能直接获得倾斜角度。我们得到的是各个方向的加速度和角度速度。为了获得正确的倾斜角度,我们需要进行一些复杂的计算。
常用的算法包括互补平衡滤波和卡尔曼滤波。
三、PID算法
根据之前的分析,我们需要实时计算适当的回复力来稳定和平衡系统。
光滑球面上有一个小球。小球的位置是x,光滑球面顶部在L处,我们可以控制小球的水平方向力F,现在需要稳定和平衡球x0处。
先看简单情况x0=L
,此时偏差为L-x
,
给出一个比例项(P) F = kp*(L-x)
,这样就会有回复力,当偏差存在时,就会有力把球拉回L。
问题是小球接近L时会有一定的速度,小球越来越接近L,这时,球的力仍然拉到L,这将导致球到达L(我们想要的位置),球不能立即停止,但会冲过去。
这样,球就会在L附近来回摆动,这是一种不稳定的状态,属于欠阻尼状态。
为解决上述问题要加一个微分项(D) F = kd*dx/dt = kd*v
,所谓”微分”指的是位置x对时间的微分,说白了就是速度。
意思就是当速度越大,就产生一个反向的力使速度减小,这样就可以防止出现上面小球冲过去的。
可以认为这一项具有”预测”功能,预测小球下一时刻的状态从而提前做出反应(预测小球将要到达L处,提前减速),
也可以认为这一项具有阻尼作用,相当于系统中有一个和速度成比例的阻尼力。
这个”阻尼力”调得过小会导致欠阻尼状态,调得过大会导致过阻尼状态。
积分项此时可以不用,积分项是当平衡位置x0
不等于L
时使用的,
当平衡位置不是L
处,那么当小球静止在平衡位置x0
时,由于在坡道上会有一个恒定的横向偏移力,此时比例调节作用为0(Δx=0)
,微分调节作用也是0(v=0)
,所以小球在该处无法平衡,会在更远离平衡位置处达到平衡,那么就会有一个长时间存在的偏差。
积分作用就是检测偏差进行累积,对于上面这个长时间存在的偏差进行积分(累积叠加),使系统在长时间范围可以稳定在要求的平衡位置。
三、平衡自行车-实践篇
在本文将会介绍平衡自行车的具体制作过程,包括机械、电路和代码。
平衡自行车完整的代码托管在https://github.com/nicekwell/balance_bike
上GitHub网站卡的同学也可以在文末下载打包好的文档。
一、材料
机械
名称 | 数量 | 备注 |
---|---|---|
铜柱、铁丝、胶枪等基础材料和工具 | 若干 | 辅助用具,果果小师弟 |
自行车架 | 1 | 自己做车架是很麻烦的,我是直接买的车架,淘宝上搜”自行车 拼装 DIY”能搜到很多 |
舵机 | 1 | 转向用的,对于我用的1:6车架,普通舵机有点大,我用的是9g舵机 |
N20电机 | 1 | 选扭力大一点,这样转速会比较稳定 |
皮带轮和皮带 | 1 | 如上面的图片,我是用皮带来传输动力的 |
电路
名称 | 数量 | 备注 |
---|---|---|
电池、电池盒 | ||
lm1117-3.3 | 1 | 降压芯片给控制系统供电 |
stm32f103c8t6核心板 | 1 | |
gy521模块 | 1 | 加速度传感器 + 陀螺仪 |
升压模块 | 1 | 升到12v给电机供电,根据电机特性选择是否使用升压模块 |
8050三极管板 | 1 | 驱动电机,由于自行车不需要反转,所以不需要使用电机驱动芯片,用三极管就能方便地实现。我用了两个三极管并联提高功率。 |
自锁开关 | 1 | 整个系统开关 |
led指示灯 | 1 | 配合1k限流电阻 |
蓝牙模块 | 1 | 可选,如果想要遥控的话就使用蓝牙 |
二、动力部分
传动方式
如图,我用的是或者传送的方式,因为比较好实现。
电机选择
这个DIY是不考虑变速情况的,平衡的参数都是按照一个固定速度调的。
所以动力部分的作用就是提供一个恒定的速度,并且这个速度尽可能稳定,尽可能不受外部影响。
电机应选择扭力大一些、转速稳定的减速电机。
电机供电
电机是直接供电还是使用升压模块供电要根据电机特性,有些电机用升压模块可以提高功率,有些大电流电机用升压模块反而可能限制了电流。
我这里用升压模块升到12v给N20电机供电的。
另外,电机通过三极管受stm32控制,通过控制占空比也可以限制电机输出的功率。
三、转向部分
转向部分用一个舵机带动把手转动即可。
四、电路
在GitHub工程里有详细的引脚连接表
https://github.com/nicekwell/balance_bike
供电
用3.3v稳压芯片给整个控制系统供电,包括单片机、GY521模块、蓝牙模块。
用5v稳压芯片给舵机供电。
用12v升压模块给电机供电。
下载
我是用串口给stm32下载程序的。
引脚 | 功能 |
---|---|
PA9 | 下载TXD |
PA10 | 下载RXD |
GY521
这个模块通过i2c通信,只需要连接4根线。
3.3v
GND
PB0 GY521 I2C SCL
PB1 GY521 I2C SDA (用的是IO模拟i2c)
电机
点击用12v升压模块供电,由于不需要反转,用三极管即可直接驱动,电路图如下:
加三极管的目的是为了可以通过调节PWM占空比来限制输出功率,但我的实际情况是100%输出时动力才勉强足够。所以如果你不需要限制电机输出功率,或者通过其他方式限制输出功率,也可以不要三极管,不通过单片机控制。
舵机
舵机是用5v供电的,而单片机是3.3v电平,对于pwm控制脚可以通过2个三极管实现同相的电平转换:
蓝牙模块
下图是我使用的蓝牙串口模块,可以实现串口透传,只需要4根线连接:vcc、gnd、txd、rxd。
蓝牙模块是用来调试和遥控的,没有它也能跑。建议还是加上这个模块,在调试PID擦数时会非常方便。
五、代码结构
代码提交在GitHub
https://github.com/nicekwell/balance_bike
主要分为3个部分:
1、基础的驱动程序,实现电机、舵机、gy521数据读取;
2、平衡控制系统,核心是一个20ms定时器,每20ms进行一次数据采集、计算和响应;
3、遥控和调试系统,实现log输出、接收遥控信息。
名称 | 文件 | 功能(智果芯) |
---|---|---|
i2c | i2c/i2c.c, include/i2c.h | IO 模拟i2c驱动,提供i2c基础操作 |
gy521 | gy521/gy521.c, include/gy521.h | gy521模块驱动,基于i2c驱动,提供加速度和角速度的读取接口 |
motor | motor/motor.c, include/motor.h | 电机驱动,提供占空比控制接口 |
angle | angle/angle.c, include/angle.h | 舵机驱动,提供角度控制接口 |
平衡控制
main函数会初始化一个定时器20ms中断一次,调用 main/balance.c 里的 balance_tick 函数,平衡算法在 main/balance.c 实现。
每20ms到来会执行一次:
读取传感器加速度和角速度信息。
互补平衡滤波计算当前姿态。
用PID算法计算出前轮转角。
遥控和调试
两部分:状态输出和指令接收。
状态输出
在main函数的while循环里,利用串口中断构建一个简单的界面显示状态。
指令接收
串口接收到的数据会传给main/control.c,该文件分析串口数据,解释成相应的操作。主要是PID参数调节。
参考资料
[1]动力老男孩: http://www.diy-robots.com/
[2]图中龙邱小车图片来自B站江小鉴、菜狗同学两位up
[3]
谈一谈单片机开发的几种调试方案: http://nicekwell.net/blog/20170411/tan-%5B%3F%5D-tan-dan-pian-ji-kai-fa-de-ji-chong-diao-shi-fang-an.html
原文链接:http://nicekwell.net/
项目作者: 老倪
转载请务必注明项目出处与原作者信息
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
关注公众号,后台回复「」获取学习资料网盘链接。