26018| 8
|
如何低成本自制一辆迷你的自平衡自行车? |
本帖最后由 RRoy 于 2021-7-8 20:17 编辑 前俩周,稚晖君在B站做了一个自平衡自行车项目,引起大家激烈讨论,我们在上周也发了一个用简单的Arduino与步进电机做的自平衡小车项目,大家也非常感兴趣。 今天给大家带来的是一个迷你的平衡自行车项目,4年前的老项目了,不过相信还是能从中学到一些新东西的。 ▼ 演示效果 自行车平衡DIY分为3部分介绍:
篇一:自行车平衡原理自行车是怎么平衡的,老外做过一个非常好的视频: 自行车是怎么保持平衡的? 这个视频很好地证明了常见的”角动量守恒”的说法是错误的,并且正确的说明了自行车平衡原理是和转向相关的,但没有具体指出平衡和转向的关系。 在这里我们就先来讨论一下”角动量守恒”这种最常见的猜测为什么是错误的,大致讨论一下转向是如何使自行车保持平衡的。 1、角动量守恒说角动量守恒说的意思就是:轮子跑的时候在转动,此时轮子就类似于陀螺,角动量守恒使自行车保持不倒。 小时候也有过这样的疑问,如果把自行车车轮固定从下坡推下,自行车能不能一直往前走? 到底能不能呢?老外的视频做了这个试验: 固定之后就会倒下,可见轮子的陀螺仪效应并不是维持自行车不倒的原因。另外还有老外做了一个没有陀螺仪效应的自行车,该自行车也可以稳定平衡: 以上足以说明陀螺仪效应不是维持自行车平衡的根本原因。 2、转向时的”离心力”是自行车平衡的根本原因 那么什么才是维持自行车平衡的原因呢? 自行车可以看做是一个倒立摆(左右方向不稳定),这个倒立摆受重力作用是一个不稳定系统,需要额外的回复力维持平衡,而提供回复力的正是自行车转向时的”离心力”。 离心力是速度和把手转向角的函数,在一个固定的速度下,可以认为控制把手转向角度就是控制回复力。 我们先记住这一点:维持自行车平衡,需要通过一种合适的算法控制把手角度才能使自行车稳定平衡。 机械自平衡 或许有人会奇怪,有些自行车只要推起来就可以自己平衡,如下面视频: 我自己也买过一个如下面这样的遥控摩托车想要研究一下: 拆开后发现里面并没有精确的转向控制结构,仿佛在行驶时根本没有转向控制,就类似于上面自行车一样自己就可以平衡了。 这到底是怎么回事呢?其实这就是结构设计者的牛逼之处,设计的机械结构自带回复功能,机械结构使得转向会根据车身倾斜而改变,这种改变的幅度正好可以使自行车稳定平衡。 如果我们改变车身结构,可能就会破坏原有的参数,使得自行车无法稳定平衡。如在前轮绑一个重物: 在老外的视频中,分析了车身倾斜对转向的三个影响因素:
以上是所谓”机械自平衡”,平衡根本原因还是转向,只不过巧妙的机械设计使得前轮转向特性恰好很容易维持平衡。 手动自平衡 手动自平衡的意思就是我们自己手动控制让它平衡。 我们既然分析平衡原理,还要做一个平衡自行车出来,这一部分要好好研究一下,将会在后面理论篇重点讨论一下控制方法。 篇二:平衡自行车-理论篇 一、模型分析1、倒立摆 很显然我们知道自行车在左右方向上不稳定,这是一个很常见的物理模型——倒立摆。 顾名思义,倒立摆的意思就是倒着的摆,比如一个倒着的杆, 倒立摆的特性:不稳定,只要偏离平衡位置,就会有一个力(重力的分力)使系统更加偏离平衡位置,这样偏差就会越来越大。 一般倒立的杆在前后左右方向都有可能倒下,在二维的平面上不稳定;而自行车仅在左右方向上可能倒下,是一维的倒立摆,这要简单一些。 以下是几个生活中常见的倒立摆例子: 2、自行车的平衡控制 自行车属于倒立摆模型,倒立摆是不稳定的,那么倒立摆应该如何控制才能平衡呢? 我们把问题拆分一下:
2.1 怎样的状态才叫平衡 我们要对”平衡”进行数学描述,所谓的平衡其实就是倒立摆的倾角稳定在一个我们想要的值。 通常我们想要平衡在θ = 0处。 2.2 我们能控制的是什么 对于倒立摆模型,通常我们能控制的是底端的 力 或 速度 或 位置,不同的控制量对应的控制方法不同。 对于自行车来说,它的控制方式不像通常的倒立摆那样直接控制底部,而是间接地通过转向来控制,当自行车以一个固定的速度前进时,自行车把手以一定角度进行转向(设为α),自行车会做相应半径的圆周运动,产生相应大小的”离心力”。 在自行车这个费惯性系里看来,只要对把手进行一定角度的转向(α),就会产生一个相应大小的横向力: 这就是我们进行平衡控制时的实际控制量——把手转角α,只要控制它就能控制回复力。 2.3 如何控制才能平衡 上面我们已经能够通过转向产生回复力,这个回复力可以把倒立摆”掰回”平衡位置,有往回掰的回复力就能稳定平衡了吗? 并不是这样,我们再来回顾一下中学物理:
结合到实际的自行车平衡中就是:
这是一个复杂的数学计算过程,回复力大小会在系统运行时不断地计算(本平衡自行车是20ms计算一次),用到的是PID算法,会在后面详细介绍。 3、自行车平衡需要解决的基本问题
这将会在下面详细讨论。 二、姿态检测1、检测的是什么 检测的是自行车左右倾斜的角度。 2、怎么检测 用一个叫gy521的模块,里面用的是mpu6050芯片,带有陀螺仪和加速度传感器。 gy521的具体使用会在第三篇-实践篇介绍,这里我们知道通过这个模块我们可以得到自行车各个方向的加速度和角速度。注意哦,我们不能直接得到倾斜角度,我们的到的是各个方向的加速度和角速度,需要进行一些复杂的计算才能得到正确的倾斜角度。 常用的算法有互补平衡滤波、卡尔曼滤波,由于篇幅和精力问题这部分暂不介绍,网上有大量资源,也可以查看本工程源码,以后有时间再写详细教程。 三、PID算法 前面已经分析了,我们通过控制把手转角来控制回复力,我们需要实时计算一个合适的回复力使系统稳定平衡。 这部分内容也不做详细介绍了,网上有大量资源,也可以查看本工程源码。 在这里引用动力老男孩[1]举的一个例子,帮大家简单理解一下需要解决的问题,以及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网站卡的同学也可以在文末下载打包好的文档。 一、材料机械 [td]
电路 [td]
二、动力部分传动方式 如图,我用的是皮带传送的方式,因为比较好实现。 电机选择 这个DIY是不考虑变速情况的,平衡的参数都是按照一个固定速度调的。 所以动力部分的作用就是提供一个恒定的速度,并且这个速度尽可能稳定,尽可能不受外部影响。 电机应选择扭力大一些、转速稳定的减速电机。 电机供电 电机是直接供电还是使用升压模块供电要根据电机特性,有些电机用升压模块可以提高功率,有些大电流电机用升压模块反而可能限制了电流。 我这里用升压模块升到12v给N20电机供电的。 另外,电机通过三极管受stm32控制,通过控制占空比也可以限制电机输出的功率。 三、转向部分 转向部分用一个舵机带动把手转动即可。 四、电路 在GitHub工程里有详细的引脚连接表 https://github.com/nicekwell/balance_bike 供电
下载 我是用串口给stm32下载程序的。 [td]
GY521 这个模块通过i2c通信,只需要连接4根线。
电机 点击用12v升压模块供电,由于不需要反转,用三极管即可直接驱动,电路图如下: 加三极管的目的是为了可以通过调节PWM占空比来限制输出功率,但我的实际情况是100%输出时动力才勉强足够。所以如果你不需要限制电机输出功率,或者通过其他方式限制输出功率,也可以不要三极管,不通过单片机控制。 舵机 舵机是用5v供电的,而单片机是3.3v电平,对于pwm控制脚可以通过2个三极管实现同相的电平转换: 蓝牙模块 下图是我使用的蓝牙串口模块,可以实现串口透传,只需要4根线连接:vcc、gnd、txd、rxd。 蓝牙模块是用来调试和遥控的,没有它也能跑。建议还是加上这个模块,在调试PID擦数时会非常方便。 关于调试方面的内容可以参考我写的另一片文章:谈一谈单片机开发的几种调试方案[2] 五、代码结构 代码提交在GitHub https://github.com/nicekwell/balance_bike 主要分为3个部分: 1、基础的驱动程序,实现电机、舵机、gy521数据读取; 2、平衡控制系统,核心是一个20ms定时器,每20ms进行一次数据采集、计算和响应; 3、遥控和调试系统,实现log输出、接收遥控信息。 驱动[td]
平衡控制 main函数会初始化一个定时器20ms中断一次,调用 main/balance.c 里的 balance_tick 函数,平衡算法在 main/balance.c 实现。 每20ms到来会执行一次:
遥控和调试 两部分:状态输出和指令接收。 状态输出 在main函数的while循环里,利用串口中断构建一个简单的界面显示状态。 指令接收 串口接收到的数据会传给main/control.c,该文件分析串口数据,解释成相应的操作。主要是PID参数调节。 参考资料[1] 动力老男孩: http://www.diy-robots.com/ 谈一谈单片机开发的几种调试方案: 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/ 项目作者: 老倪 转载请务必注明项目出处与原作者信息 相关项目回顾 ▼ 这位天才UP主,让自行车成精了 ▼ 用Arduino Nano和步进电机做一个自平衡机器人 |
403.83 KB, 下载次数: 3558
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed