自制全尺寸自平衡车,智能度堪比机器人

自我上次发布博客后已有数月,而上个月我终于整理好我的工作记录可以在发布了。我的第一台自平衡机器人和自平衡单片机成功后,我就想做个自己能骑上去的全尺寸版本,就像赛格威自平衡车那样。

最后我决定和我一个好朋友,在丹麦科技大学一块上过课程的Mads Friis Bornebusch一块制作。

视频演示

机械结构

它的主要结构是一块菱形花纹铝板,尺寸为500x360x7毫米,用以放置马达。给定的限制宽度让它通过一扇普通的门不成问题。它的动力来源是两台MY1020Z 500瓦24伏12.6纳米有刷直流电机(译者注:作者本人选择了我国浙江出产的电机,鉴定为尤耐特电机制造,商品链接细节有说明)。

因为急需,所以我从德国把它们订购回来。你们大可以花很少钱直接从中国订购。

下图是我们在铝板上钻出供8毫米螺栓固定的洞眼。注意要打埋头眼,那样洞眼就与铝板表面平齐。建议使用保险螺母,那样的话螺栓不会走位,用乐泰胶水(一种厌氧粘合胶,可百度之)代替亦可。

菱形花纹铝板,已预备好安装电机。

带轴的电机

埋孔螺栓

栓在框架上的电机

钻了四个10毫米暗孔,用以在框架中央栓住两个SKF Y型轴承。在它们当中,放置了一条300毫米长0.5英寸口径钢管,并作了一些修整,使之与25毫米轴承吻合。

修整钢管

组装完成

在钢管末端盖子里,用环氧树脂封装有一个10千欧电位计,用以读取操纵杆的位置。然后电位计就被栓在一个铝支架上,而铝支架则螺接在铝板上我们钻的孔里。

在钢管另一端则接在90度的支架上。注意,因为在测试中杆子折了,我们在杆子末端里焊了一根铁条。所有的管子都是0.5英寸口径,在当地商店就能轻易取得。

控制机构的电位计

90度支架

1050毫米长,一端带有T型结构的操纵杆装在90度支架的另一端,两个带封口180毫米长的部分用作把手。我在此缠上一些自行车用胶带,增加握把的舒适感。

从旧洗衣机上拆下的两条弹簧连在了框架边缘和操纵杆230毫米高处之间,使操纵杆永远能中心归位。用管钳固定确保两条弹簧松紧程度相同。

弹簧结构

在把手上安装了一个紧急制动按钮,和电机控制重设引脚相连。这个安全装置是必需的,当释放按钮时,电机将停转。

紧急制动按钮

我们自制了个电机轴来连接轮子与电机。 
电机轴轮轴3D透视图在下图所示(一些移动设备或浏览器可能不支持)。注意轮轴延伸出来的圆柱体是用来作为增强结构,和电机轴是吻合的。我们担心负载会压垮电机内部零件,就做了这玩意出来。

可在[Github共享库](https://github.com/lauszus/balancingrobotfullsize/tree/master/motorhub 3d drawing)中得到3D设计图。

完成的电机轮轴

电子元件部分

主板的核心是一块5伏工作电压的16兆赫Arduino Pro Mini。它以500赫兹频率读取分析MPU-6050微处理器、三轴加速计和陀螺仪的数据,用以估算角度。测量数据用我之前写过的卡尔曼滤波算法融合分析。接着它利用算出的角度作为变量输入手动调谐PID控制器,得到脉宽调制输出量,用以保持机器平衡。

微控制器上也连接了一个蓝牙SPP模组,用以和安卓手机上我写的一个应用交互。

在LM324操作放大器上面的两个输入口用作缓冲,接收来自紧急制动开关的信息。因每个电机控制重设输入口上都有个20千欧制动电阻,放大器就成为必须(译者注:它将停止信号放大到控制板能够识别的程度,如果没有20千欧电阻,随随便便的电流杂讯就能把不该停的自平衡车停下来)。二极管D1则确保微控制器无法将信号输入到电机控制板上的紧急制动口。
 接着,电池电压测量信号也占用一个输入口。

一个输入端用作逆向放大器,用以放大来自操纵杆电位计的信号。10千欧电位器用作调整电压输出知道它大致接近2.5伏。

电路也连上了蜂鸣器作为基本用户反馈,在机器启动或电压太低时作为提醒。

发送信号往两个电机控制板的信号头也是可用的。

主板电路图

下图是完成的PCB板图片,留心MPU-6050微控制器是固定在双面泡沫胶上面的,用以减少震动。

以下链接是PCB最终板。 github

蚀刻PCB

即将完工的主板

你需要两块大功率电机控制板来控制电机运行,而我们用的则是Polulu大功率电机控制板,工作电压24伏,最大电流23安。每个控制板都能在23安持续电流下无散热片工作,但我们仍装上散热片确保它们能正常工作,因为据规格参数所示电机峰值电流能达到26.7安。经过这样处理,电机控制板甚至没有发热现象。

电机控制板正面

电机控制板背面

要控制电机,你只需将脉宽调制信号接入PWMH(脉宽高频)通道,用DIR输入控制方向。这样你只用两个引脚就能轻松控制小车。留意在最后设定上不会用到PWML(脉宽低频)通道。另外,电机控制板上有两个故障信号显示器,即FF1和FF2。在重设引脚输入信号可重设电机控制板–当紧急制动按钮释放时。
 最后它也作用于电流传感输出,将传感器引脚焊接上PCB板就能使用。更多信息请参阅产品页面

用这一款电机控制板,我能直接用微控制器输入/输出信号控制,比起其他类型电机控制的串行界面强多了。与其用慢速的串行通信,我还不如用微控制器直接在引脚输入信号。

同时请注意,微控制器和电机用同样的电池组而共地。如你要为微控制器用独立电源驱动,还是需要焊接一条地线。

下图是安装散热片前后的电机控制板。留心我们在用长螺栓固定安装散热片在电机控制板之前,切掉场效应管上的散热片改敷以散热膏。

电机控制

带散热片的电机控制板

我们的设计用三块3000毫安时6芯锂聚合物电池并联成总电量9000毫安时的电池组驱动所有部分。
 我还没做严格的续航力测试,但它们看起来也表现不俗,从早上10点到下午4点只用了两个电池组。

锂聚合物电池最高电压是25.2伏(每块电芯4.2伏),你不能就这样直接接入Arduino Pro Mini板的VIN/RAW端。我们先用个LM2596降压稳压模块将其降至8伏,再用PCB板上的7805稳压模块降至5伏。

用足量焊锡焊好接触节点是很重要的,它们因此能承受大功率运行环境。下图是自制的并联导线,我还是第一次在10号美制导线上下功夫。三条12号美制导线一端焊接起来,再用一条线捆扎固定起来。另一头也如法炮制。最后用一条导线扎在整个节点上,并赋以焊锡焊接。整个过程你需要用到一个不错的电烙铁和大烙头来反复焊接节点。

前接口及热缩管

电池导线完成图

下图是自制并联三节电池组。三个XT60母接口连接两块电机控制板和LM2596降压稳压模块。

电池接上并联导线

完成的PCB板随即装入机器底部的电器元件箱,箱子用双面泡沫胶固定,以减少对MPU-6050微控制器的震动。

内部搭载电子元件近貌

机器底部

机器全貌

程序代码

由自平衡Arduino板代码https://github.com/tkjelectronics/Balanduino所启发写成的代码,程序基本结构基本相同。代码以C/C 语言为基础,用Arduino库文件和函数写成,包括了Wire(I2C)库文件和计时函数millismicros。(译者注:自平衡车要求的时间控制精度达到了毫秒和微秒级,看函数词根可知一斑。)

代码循环流程图如图所示。

首先微控制器由接上电池的LM2596稳压模块供电,接着它有个初始输入,用以激活读取紧急制动按钮实时状态功能。随后,它将输出信号和蜂鸣器连线,读取EEPROM不同变量,包括PID值、卡夫曼运算结果等。当它检测到需要复位的EEPROM值(那是因为其中的变量对结构配置增减导致数据结构变化),它就启动蜂鸣器1秒,然后处理下面流程。
 下一步是初始化UART(通用异步接收/发射器)到57600波特率。连接到电机控制板的引脚将MPU-6050设定取样频率500赫兹,设定加速计范围在正负两倍重力加速度之间,陀螺仪范围正负250度每秒。接着它校正操纵杆,启动蜂鸣器100毫秒,初始化计时器。

现在进入主要循环。如流程图所示,只要电不停,车就一直跑。第一步是检查电机控制板上是否有判断信号引脚输出高电平,意味着哪里出错了。这种情况下,蜂鸣器启动提醒用户有故障发生。下一步是检查是否有新的惯性测量数据。配置好MPU-6050,如有新的测量变量,它会用将INT引脚锁定高电平。

如没有新的惯性测量数据,程序则检查串口是否有新数据,用以配置PID值、卡夫曼计算变量、运行总量等。

有新数据的话,程序将读取传感器返回数据,用卡夫曼滤波算法计算角度。接着它读取操纵杆电位计数据,检查自平衡车是否垂直,紧急制动按钮闭合。不属这种情况的话,意味着机器摔倒了,或是用户放开了按钮。于是,它关闭电机。正常情况下,它会用PID控制器计算电机所需脉宽信号值。(译者注:用以维持自平衡车保持平衡的补偿动力。)

给机器运行一个量,只要简单增加一台电机脉宽值,然后减去另一台。这个值来源于操纵杆上的电位计。这部分的程序片段在PID.cpp内可以找到。

最后检查电池电压,电压过低时则启动蜂鸣器。然后完成一次循环,重新开始。

这整个硬件和自平衡Arduino板之间的关键差别是在全尺寸版本上没有译码器,实际上它不能完全靠自己平衡。

同样,估计小车的速度变得困难。作为替代,用电机脉宽信号量计算能估计个大概。这个功能在车速增加时使车体向后倾斜,防止小车摔倒。

通过身体前倾/后仰就能简单控制小车往给定的方向运动,往两边倾斜操纵杆则为转弯。全部源代码在https://github.com/Lauszus/BalancingRobotFullSize可以找到。

安卓应用

我写了个安卓应用,用以方便调整PID值,及获取机器运行数据。

下图是安卓应用概略图。

第一个画面中,用户在特制速度计内会看到电机运转电流、转速、电量、运行时间,以及脉宽调制值等数据。

下个屏幕中,用户能够调节PID值、标定角度、及调节小车速度上限。

第三个画面显示地图实时位置,由安卓设备内置的GPS模组获取数据。

第四及最后一幅图显示用加速计、陀螺仪和卡夫曼滤波算法计算得知的实时倾角曲线。它同样允许用户对卡夫曼滤波算法系数进行调整。

微控制器与安卓应用之间通过蓝牙进行交互。为使数据准确解析,需要实行一套传输协议格式,包括一串字符串常量开头,一个字节表示指令及一个字节表示其后的数据长度。在数据之后是简单校验,用异或算法对除文件头以外的每个字节进行运算。关于传输协议的一系列代码可参阅:Protocol.cppBluetoothChatService.java 及BluetoothProtocol.java

手机安装在操纵杆上简单扣住的智能手机端口上。

手机应用屏幕截图

更多相关文档

关于项目的论文精简成六页纸的篇幅,在以下链接可以获得:GRP12_AUT2_Two_wheeled_robot.pdf。如你对自平衡车概念陌生,强烈建议你去精读它,它能解释两轮自平衡车工作原理及背后所应用的理论。

我们也做了份项目报告,链接如下:POSTER_GRP12_AUT2_Two_wheeled_robot.pdf

展望与改进

如我们所期望的,最终作品出厂了。因时间限制,我们仍留下了一些改进空间。

第一个是要替换现有轮胎,那些硬橡胶轮胎。我相信如果换上充气轮胎效果会更好,在坎坷路面能减震不少。

接着我想装上一些译码器,使之能够平衡自立,而我因此就能遥控它了,不错吧!这么一来,我就能精确测量小车的速度,而不用靠脉宽调制值来间接计算了。同时,这应该能让它运转得稍微畅顺些。

倘若需要重新制造小车,我会考虑为操纵杆设条槽,那么在小车不慎摔倒时操纵杆就不会直接装到地面。将操纵杆握把设计为可拆卸的就更棒了,那样可方便运输。

我也考虑过将紧急制动开关用类似体重开关机构代替,这样一来开车时就不用一直按着紧急制动开关了。(译者注:只要一下车,总重量减轻,车子就会停止,那就算开车玩撤把也是小开司了。)

升级电机也是蛮重要的改进。现有电机功率不及赛格威,后者每个电机功率达到1500瓦,在恶劣地形能很好操控,速度也快。选择无刷电机会使驾驶畅顺不少。

最后一步,我仍需为电池和电机控制板进行封装,确保防水及防物理损坏。

补充,我还要造一些电机控制板,原有的那些已经破了两次了。第一次集成电路连带上面的标识都被刮掉了,接着第二次其中一个场效应管罢工了。我本可以换个场效应管就了事了,但还是买了个新的电机控制板。杯具的是那玩意儿不开源,板上的集成电路身份标识不明!

当驾驶时,那电机控制板压根就没发热,我就怀疑它是否有设计缺陷。如果确定Pololu能弥补这个缺陷,将设计开源的话,那我就建议使用它们,但现阶段你还是该小心处理这类问题。

如有疑问和意见,敬请不吝赐教。需要什么细节部位图尽管提出,我会随即补上。

零件清单

MY1020Z 500瓦, 24伏, 12.6纳米直流有刷电机

SKF Y型轴承,你需要在口径0.5英寸钢管内做个25毫米接口,使之与轴承吻合。

口径0.5英寸钢管(各大五金店均有发售),90度支架、T型支架和三个管子封口也需入手。

3.00-8尼龙轮胎(直径约340毫米,宽度75毫米),是我从一辆旧摩托车上卸下来的。

[电机轮轴](https://github.com/lauszus/balancingrobotfullsize/tree/master/motorhub 3d drawing),尺寸大小取决于你用的轮子。

紧急制动按钮,可用任何瞬动式开关代替。

电机控制板,注意每台电机一个!

电机控制板用散热片

电池,还有锂电池充电器

电池警报,试驾时有了它就能确保不会欠压运行损坏电池。

工作电压5伏的Arduino Pro Mini板,工作频率16兆赫。

MPU-6050微处理器

12号、16号和22号美制覆硅树脂导线,其中12号导线用于电机导线。

XT60转接口

准备各种尺寸散热管,以防各种类型短路发热。

螺栓和相应的螺母。

LM2596降压稳压模块

蓝牙SPP模组

智能手机外接口(坞站)。

两条弹簧,从旧洗衣机上面拆下。

操纵机构上使用的10千欧电位计。

电气元件箱。(BOCUBE IP67型号,B 080805 ABS 7024)

用来装载所有元件的PCB板

自封扎带,用作最后整理线材。

via 作者:Lauszus 译者:Kalimov

坐沙发

发表评论

你的邮件地址不会公开


*