在本文将会介绍平衡自行车的具体制作过程,包括机械、电路和代码。
平衡自行车完整的代码托管在 https://github.com/nicekwell/balance_bike

balance_bile.jpg

一、材料

机械

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

电路

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

二、动力部分

传动方式

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

1.jpg

电机选择

这个DIY是不考虑变速情况的,平衡的参数都是按照一个固定速度调的。
所以动力部分的作用就是提供一个恒定的速度,并且这个速度尽可能稳定,尽可能不受外部影响。
电机应选择扭力大一些、转速稳定的减速电机。

电机供电

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

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

2.jpg

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

三、转向部分

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

3.jpg

四、电路

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

4.jpg

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

舵机

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

5.jpg

蓝牙模块

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

6.jpg

蓝牙模块是用来调试和遥控的,没有它也能跑。建议还是加上这个模块,在调试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到来会执行一次:

  1. 读取传感器加速度和角速度信息。
  2. 互补平衡滤波计算当前姿态。
  3. 用PID算法计算出前轮转角。

遥控和调试

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

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

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

六、广告

老婆做毕业设计,给我下了死命令,一定要找300个程序员研究一下,请各位同行做个调查问卷,可扫描下面二维码或者直接点击此链接:https://www.wjx.cn/jq/17710478.aspx,多谢!

ad.jpg


本站所有文章欢迎转载,但请保留作者信息和原文地址。

Comments