这辆迷你摩托车,很酷!

摘要:平衡小车大家应该见到过很多了,比如最有名的要数野生钢铁侠稚晖君的自行车平衡小车了。那个玩意太高级一般人做不出来,作为学生或者DIY爱好者做一辆小型的mini平衡小车还是可以实现的。928d966cd16b8a6bc1176933c0cba5e2.png

随着16届恩智浦杯全国大学生智能汽车大赛新增单车拉力组,平衡小车的实现正在成为电子爱好者最受欢迎的项目,如果你是电子专业爱好嵌入式开发,平衡小车你一定要做一辆。今天给大家带来的是一个博主老倪制作的迷你的平衡自行车项目,虽然时间有点久远,不过相信我们仍然能从中学到一些新东西。

下面两张图是龙邱科技为16届智能车竞赛生产的电单车K车模高配版摩托车图片

ae425121046fc604730196fea5c7f15c.png4f7849742d58b87727dd94ba54c03ede.png

684aa6332ca8ed4f04257440195a6763.gif

下图是本项目要说的简易mini版平衡小车

669dab6eca648c3bdb48e7271536f4f7.gif

自行车平衡DIY分为3部分介绍:

  • 第一部分介绍自行车平衡基本物理原理;

  • 第二部分理论篇,对平衡自行车的算法进行理论分析,包括模型分析、姿态检测方法、PID算法,控制算法;

  • 第三部分实践篇,具体介绍平衡自行车用到的元器件,动力、转向、电路及代码分析。

一、自行车平衡原理

自行车是怎么平衡的,老外做过一个非常好的视频,这个视频很好地证明了常见的”角动量守恒”的说法是错误的,并且正确的说明了自行车平衡原理是和转向相关的,但没有具体指出平衡和转向的关系。

在这里我们就先来讨论一下”角动量守恒”这种最常见的猜测为什么是错误的,大致讨论一下转向是如何使自行车保持平衡的。

1、角动量守恒说

角动量守恒说的意思就是:轮子跑的时候在转动,此时轮子就类似于陀螺,角动量守恒使自行车保持不倒。

小时候也有过这样的疑问,如果把自行车车轮固定从下坡推下,自行车能不能一直往前走?

到底能不能呢?老外的视频做了这个试验:

605440097827ef3834d48016036a329b.gif

固定之后就会倒下,可见轮子的陀螺仪效应并不是维持自行车不倒的原因。另外还有老外做了一个没有陀螺仪效应的自行车,该自行车也可以稳定平衡:

a55c10082704d9f696629ccf10547cd6.gif

以上足以说明陀螺仪效应不是维持自行车平衡的根本原因。

2、离心力是自行车平衡的根本原因

那么什么才是维持自行车平衡的原因呢?

自行车可以看做是一个倒立摆(左右方向不稳定),这个倒立摆受重力作用是一个不稳定系统,需要额外的回复力维持平衡,而提供回复力的正是自行车转向时的”离心力”。

离心力是速度和把手转向角的函数,在一个固定的速度下,可以认为控制把手转向角度就是控制回复力。

我们先记住这一点:维持自行车平衡,需要通过一种合适的算法控制把手角度才能使自行车稳定平衡。

机械自平衡

或许有人会奇怪,有些自行车只要推起来就可以自己平衡,如下面视频:

322dbf7e3fce560b6f8c0bb4202ba2d1.gif

我自己也买过一个如下面这样的遥控摩托车想要研究一下:

38471041c6523efd909d01a8e422f647.png

拆开后发现里面并没有精确的转向控制结构,仿佛在行驶时根本没有转向控制,就类似于上面自行车一样自己就可以平衡了。

这到底是怎么回事呢?其实这就是结构设计者的牛逼之处,设计的机械结构自带回复功能,机械结构使得转向会根据车身倾斜而改变,这种改变的幅度正好可以使自行车稳定平衡。

如果我们改变车身结构,可能就会破坏原有的参数,使得自行车无法稳定平衡。如在前轮绑一个重物:

570137c5580d274c398a5020aa7aae2f.gif

在老外的视频中,分析了车身倾斜对转向的三个影响因素:

  • 前轮转轴后倾,导致倾斜时前轮转向。

  • 把手安装在前面,导致倾斜时前轮转向。

  • 前轮转动时的陀螺仪效应,车身倾斜,陀螺仪效应使得前轮转向。

01:36

以上是所谓”机械自平衡”,平衡根本原因还是转向,只不过巧妙的机械设计使得前轮转向特性恰好很容易维持平衡。

手动自平衡

手动自平衡的意思就是我们自己手动控制让它平衡。

我们既然分析平衡原理,还要做一个平衡自行车出来,这一部分要好好研究一下,将会在后面理论篇重点讨论一下控制方法。

二、平衡自行车-理论篇

一、模型分析

1、倒立摆

很显然我们知道自行车在左右方向上不稳定,这是一个很常见的物理模型——倒立摆。

baf13190c4545ce42bc7fceaf54c4afb.png顾名思义,倒立摆的意思就是倒着的摆,比如一个倒着的杆,

d5f2d3b2c28ea423ca4050864bc33c3d.png

倒立摆的特性:不稳定,只要偏离平衡位置,就会有一个力(重力的分力)使系统更加偏离平衡位置,这样偏差就会越来越大。

一般倒立的杆在前后左右方向都有可能倒下,在二维的平面上不稳定;而自行车仅在左右方向上可能倒下,是一维的倒立摆,这要简单一些。

以下是几个生活中常见的倒立摆例子:

d64a62f11d8183e865e1902f223ae73f.png

2、自行车的平衡控制

自行车属于倒立摆模型,倒立摆是不稳定的,那么倒立摆应该如何控制才能平衡呢?

我们把问题拆分一下:

  • 怎样的状态才叫平衡?

  • 我们能控制的是什么?

  • 如何控制才能稳定平衡?

2.1 怎样的状态才叫平衡

我们要对”平衡”进行数学描述,所谓的平衡其实就是倒立摆的倾角稳定在一个我们想要的值。

860c57cca84190edd0619d23a4cd6b91.png

通常我们想要平衡在θ = 0处。

2.2 我们能控制的是什么

对于倒立摆模型,通常我们能控制的是底端的力或速度或位置,不同的控制量对应的控制方法不同。

对于自行车来说,它的控制方式不像通常的倒立摆那样直接控制底部,而是间接地通过转向来控制,当自行车以一个固定的速度前进时,自行车把手以一定角度进行转向(设为α),自行车会做相应半径的圆周运动,产生相应大小的”离心力”。

在自行车这个费惯性系里看来,只要对把手进行一定角度的转向(α),就会产生一个相应大小的横向力:

6e6c1ce712161e4c1c69219ebc2637ab.png

这就是我们进行平衡控制时的实际控制量——把手转角α,只要控制它就能控制回复力。

2.3 如何控制才能平衡

上面我们已经能够通过转向产生回复力,这个回复力可以把倒立摆”掰回”平衡位置,有往回掰的回复力就能稳定平衡了吗?

并不是这样,我们再来回顾一下中学物理:

过阻尼状态的摆会以较慢的速度回到平衡位置;欠阻尼状态的摆会很快回到平衡位置,但会在平衡位置来回摆动;临界阻尼状态的摆会以最快的速度稳定在平衡位置。

结合到实际的自行车平衡中就是:

如果恢复力不够大,就无法矫正,或者矫正速度很慢,这会导致系统不稳定;如果回复力过大,就会导致矫正过度,这也会导致系统不稳定;我们最希望的状态就是回复力刚刚好,刚好使倒立摆快速回到平衡位置,又不至于矫正过度。

这是一个复杂的数学计算过程,回复力大小会在系统运行时不断地计算(本平衡自行车是20ms计算一次),用到的是PID算法,会在后面详细介绍。

3、自行车平衡需要解决的基本问题

  • 获取左右方向倾角θ

  • 以合适的算法控制转角α使系统稳定平衡

这将会在下面详细讨论。

二、姿态检测

1、检测的是什么

检测的是自行车左右倾斜的角度。

2、怎么检测

用一个叫gy521的模块,里面用的是mpu6050芯片,带有陀螺仪和加速度传感器。

gy521的具体使用会在第三篇-实践篇介绍,这里我们知道通过这个模块我们可以得到自行车各个方向的加速度和角速度。注意哦,我们不能直接得到倾斜角度,我们的到的是各个方向的加速度和角速度,需要进行一些复杂的计算才能得到正确的倾斜角度。

常用的算法有互补平衡滤波、卡尔曼滤波。

三、PID算法

前面已经分析了,我们通过控制把手转角来控制回复力,我们需要实时计算一个合适的回复力使系统稳定平衡。

1147521b09343aeb0d3a9556efe358c3.png

有一个小球在光滑球面上,小球的位置是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网站卡的同学也可以在文末下载打包好的文档。

8cb8d74fa4f18a10f59a295d110e115f.png

一、材料

机械

名称数量备注
铜柱、铁丝、胶枪等基础材料和工具若干
辅助用具,果果小师弟
自行车架1自己做车架是很麻烦的,我是直接买的车架,淘宝上搜”自行车 拼装 DIY”能搜到很多
舵机1转向用的,对于我用的1:6车架,普通舵机有点大,我用的是9g舵机
N20电机1选扭力大一点,这样转速会比较稳定
皮带轮和皮带1如上面的图片,我是用皮带来传输动力的

电路

名称数量备注
电池、电池盒

lm1117-3.31降压芯片给控制系统供电
stm32f103c8t6核心板1
gy521模块1加速度传感器 + 陀螺仪
升压模块1升到12v给电机供电,根据电机特性选择是否使用升压模块
8050三极管板1驱动电机,由于自行车不需要反转,所以不需要使用电机驱动芯片,用三极管就能方便地实现。我用了两个三极管并联提高功率。
自锁开关1整个系统开关
led指示灯1配合1k限流电阻
蓝牙模块1可选,如果想要遥控的话就使用蓝牙

二、动力部分

传动方式

如图,我用的是皮带或者齿轮传送的方式,因为比较好实现。

0761b8db098da9065292c1e7a35fb3b6.png

电机选择

这个DIY是不考虑变速情况的,平衡的参数都是按照一个固定速度调的。

所以动力部分的作用就是提供一个恒定的速度,并且这个速度尽可能稳定,尽可能不受外部影响。

电机应选择扭力大一些、转速稳定的减速电机。

0d9b480bbb30651ad65eb81ee2f3ed0c.png

电机供电

电机是直接供电还是使用升压模块供电要根据电机特性,有些电机用升压模块可以提高功率,有些大电流电机用升压模块反而可能限制了电流。

我这里用升压模块升到12v给N20电机供电的。

29cbaf345c23658771a1ad2ebe591c17.png

另外,电机通过三极管受stm32控制,通过控制占空比也可以限制电机输出的功率。

三、转向部分

转向部分用一个舵机带动把手转动即可。

387135b79656407e37c4c08c5ed36353.png

四、电路

在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升压模块供电,由于不需要反转,用三极管即可直接驱动,电路图如下:

2285b7f60916b707e0770c0eb1565352.png

加三极管的目的是为了可以通过调节PWM占空比来限制输出功率,但我的实际情况是100%输出时动力才勉强足够。所以如果你不需要限制电机输出功率,或者通过其他方式限制输出功率,也可以不要三极管,不通过单片机控制。

舵机

舵机是用5v供电的,而单片机是3.3v电平,对于pwm控制脚可以通过2个三极管实现同相的电平转换:

4e1271392edf09f8cf6baa1c6513b58f.png

蓝牙模块

下图是我使用的蓝牙串口模块,可以实现串口透传,只需要4根线连接:vcc、gnd、txd、rxd。

f8a749899d5bd2350a16622e27556e59.png

蓝牙模块是用来调试和遥控的,没有它也能跑。建议还是加上这个模块,在调试PID擦数时会非常方便。

五、代码结构

代码提交在GitHub

https://github.com/nicekwell/balance_bike

主要分为3个部分:

1、基础的驱动程序,实现电机、舵机、gy521数据读取;

2、平衡控制系统,核心是一个20ms定时器,每20ms进行一次数据采集、计算和响应;

3、遥控和调试系统,实现log输出、接收遥控信息。

名称文件功能(智果芯)
i2ci2c/i2c.c, include/i2c.hIO 模拟i2c驱动,提供i2c基础操作
gy521gy521/gy521.c, include/gy521.hgy521模块驱动,基于i2c驱动,提供加速度和角速度的读取接口
motormotor/motor.c, include/motor.h电机驱动,提供占空比控制接口
angleangle/angle.c, include/angle.h舵机驱动,提供角度控制接口

平衡控制

main函数会初始化一个定时器20ms中断一次,调用 main/balance.c 里的 balance_tick 函数,平衡算法在 main/balance.c 实现。

每20ms到来会执行一次:

  • 读取传感器加速度和角速度信息。

  • 互补平衡滤波计算当前姿态。

  • 用PID算法计算出前轮转角。

遥控和调试

两部分:状态输出和指令接收。

状态输出

在main函数的while循环里,利用串口中断构建一个简单的界面显示状态。

指令接收

串口接收到的数据会传给main/control.c,该文件分析串口数据,解释成相应的操作。主要是PID参数调节。

96a8f71e9c5a9ef71fce42ee2187e8fb.gif

参考资料

[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

[4] 代码github :https://github.com/nicekwell/balance_bike

原文链接:http://nicekwell.net/

项目作者: 老倪

转载请务必注明项目出处与原作者信息


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux errno 线程,Linux errno 错误对照表

errno 在 中定义,错误 Exx 的宏定义在 /usr/include/asm-generic 文件夹下面的 errno-base.h 和 errno.h,分别定义了 1-34 、35-132 的错误定义。strerror() 函数依据 errno 值返回错误描述字符串,下面程序打印对照表:Code highli…

如何当好独立CIO(1)

如何当好独立CIO(1)出处:信息方略 文: 刘少东 评论( 0 )条 论坛 博客导读:独立CIO一般有比较丰富的信息化管理经历,具有新的想法和思路,视野也更加开阔,能够以局外人的身份冷静、客观地分析企业战略;同时,这…

提高单片机设计的10个细节

前言1 干扰对单片机应用系统的影响1.1测量数据误差加大1.2 控制系统失灵1.3 影响单片机RAM存储器和E2PROM等1.4 程序运行失常2 如何提高我们设备的抗干扰能力2.1 解决来自电源端的干扰2.2 模拟信号采样抗干扰技术2.3 数字信号传输通道的抗干扰技术2.4 硬件监控电路2.5 PCB电路合…

童继龙:论ERP顾问的创新分享与专业精神

童继龙:论ERP顾问的创新分享与专业精神出处:51CTO博客 文: 童继龙 评论( 0 )条 论坛 博客导读:公司的核心价值观中有一部分为“持续创新”,对实施同事的行为态度考核中有两项为“创新分享”和“专业精神”,因为上海实施部的新同事…

图解分析 Linux 网络包发送过程

大家好,下面的文章转发一个鹅厂同学的文章,这篇文章从应用到内核,写的非常不错,希望大家分析某个技术也可以从这方面入手。-----大家好,我是飞哥!半年前我以源码的方式描述了网络包的接收过程。之后不断有粉丝提醒我还…

[Pku 2774] 字符串(六) {后缀数组的构造}

{ 从这一篇开始介绍后缀数组 一个强大的字符串处理工具 可以先研读罗穗骞的论文 后缀数组——处理字符串的有力工具 再行阅读本文 本文仅作参考和补充 } 字符串的后缀很好理解 譬如对于字符串"aabaaaab" 后缀有{"b","ab","aab","…

linux下I2C驱动发送IO时序,笔记四:linux下IO口模拟实现I2C协议

一、i2c总线是什么?1、i2c总线是一种物理总线及实实在在的总线,通过板子pcb等图能看到。2、i2c总线是一种主从结构。3、i2c总线是一种通信协议。4、i2c总线是两线制半双工串行总线:两线制:数据线(SDA)——>数据传输、时钟线(SC…

rails3异步发邮件

actionmailer 3.0 结合ar_mailer_rails3 异步发送邮件3 次投票jerry 分享于 3 个月 前, 0 条回复, 244 次浏览Share|actionmailer 3.0 的用法有所改进,并结合ar_mailer_rails3做异步邮件的发送,是比较方便的一种选择,把邮件都交给后台任务来发…

我见过的极品代码bug

程序员写代码有bug是很难避免的,也是因为程序员的bug存在,才让另一个职业有了更好的发展,那就是软件测试行业。但是程序员写bug,对于自己肯定是一件非常难忘的事情。我记得我在之前做一个TP固件升级的功能,也就是开机的…

Linux监控服务并主动重启

Linux查询后台进程,如果没有进程号,则重启服务: #!/bin/sh basepath$(cd dirname $0; pwd) while true doprocnumps -ef|grep "服务名称"|grep -v grep|wc -lif [ $procnum -eq 0 ]then#启动命令echo date %Y-%m-%d date %H:%M:%S …

双一流大学毕业的我,应该何去何从?

内卷时代,万物皆可卷!什么是内卷,比如,你在电影院看电影,有一个人站起来了,那么就会有第二个人站起来,没一会儿所有的人就站起来了,但是和坐着相比,站着看电影体验感很差…

接上电就工作的单片机

对于手边的一盒STC单片机,测试一下它们使用相同的ISP方案在下载过程中是否都可以按照相同的方式完成程序的下载。同时对它们建立各自的元器件库,以便于后期的应用。通过这个实验,看到STC的单片机使用起来真实简捷明了,接上电就工作…

我的高中好友

很少写高中同学相关的文章,愿意是现在的生活上和原来的同学交集很少,他们的工作和我做的工作也有很大的差距。再一个是距离远,节假日不能互相走动。昨晚,我开直播。那时候是凌晨1点,然后我看到我一个高中的好朋友进了我…

类的初始化顺序详解

前言 先声明一个常识,类域和局部变量初始化的差异如下, 局部变量不初始化会报错: 类中属性(也称域)不赋初值,默认为0,如果是引用默认为空。 正题 一、类中属性按照定义的顺序初始化 我们声明一个Child类&#xff0c…

工程师的电脑桌面

【0】【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】【11】【12】【13】【14】声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。------------ END ------------转自黄工的公众号推荐阅读:专辑…

Jmeter JAVA请求

Jmeter Java请求 一、为什么要使用Java请求 现有的post 、 get 无法对加解密及鉴权的接口进行测试,需要进行封装,然后再请求,怎么进行封装?通常使用的方式是使用httpclient 工具类型来操作,下面举一个简单的Java自定义…

我的微信群里有一个外国人

最近,不知道怎么滴,我的微信群里面多了一个外国华人,然后他在群里面分享了他在国外的生活。实话说,我不曾羡慕过在美国生活的人们,我害怕走在街上突然遇到的枪击事件,也害怕每天面对的肯德基汉堡&#xff0…

第一次收到这么用心的感谢信

今天收到一个读者的感谢信心里特别暖,发出来给大家看看说明这很长时间的付出,说的很多话,是对别人是有帮助的,我也希望能够帮助到更多的人,希望大家有方向,有自己对生活的态度,然后坚持自己的理…

android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...

现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ、微信、购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容。它的实现方式也很多,以前大多使用TabHost来实现,但是现在我们有很多更好…

Http协议之报文·方法·状态码

【要点】 1. HTTP协议的主要特点2. HTTP报文的组成部分3. HTTP方法4. POST 和 GET的区别5. HTTP状态码【总结】HTTP协议的主要特点 主要特点:简单快速, 灵活, 无连接(非keep-alive),无状态 每个资源URI是固…