平衡自行车-实践篇

平衡自行车-实践篇转载自 http nicekwell net blog 20180123 ping heng zi xing che shi jian pian html 本人是一名 16 届智能车比赛单车组的备赛学生 竞速组选择的是单车拉力组 从单车群车友的链接找到三篇文章学习 这是其中的第三篇

大家好,我是讯享网,很高兴认识大家。

转载自:http://nicekwell.net/blog/20180123/ping-heng-zi-xing-che-shi-jian-pian.html
本人是一名16届智能车比赛单车组的备赛学生,竞速组选择的是单车拉力组,从单车群车友的链接找到三篇文章学习,这是其中的第三篇,这一篇介绍平衡自行车的具体制作过程,包括机械、电路和代码。
欢迎大家一起就16届单车组比赛进行讨论交流。

正文

原作者的平衡自行车完整代码托管在https://github.com/nicekwell/balance_bike
balance_bike
讯享网

材料

机械

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

电路

名称 数量 备注
电池、电池盒
洞洞板
lm1117-3.3 降压芯片给控制系统供电
stm32f103c8t6核心板 1
gy521模块 1 加速度传感器 + 陀螺仪
升压模块 1 升到12v给电机供电,根据电机特性选择是否使用升压模块
8050三极管 2 驱动电机,由于自行车不需要反转,所以不需要使用电机驱动芯片,用三极管就能方便地实现。我用了两个三极管并联提高功率。
自锁开关 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

这个模块通过 IIC 通信,只需要连接4根线。

引脚 功能 备注
3.3v
GND
PB0 GY521 I2C SCL
PB1 GY521 I2C SDA 用的是IO,模拟IIC

电机

电机用 12V 升压模块供电,由于不需要反转,用三极管即可直接驱动,电路图如下:
电机供电电路

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

舵机

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

蓝牙模块

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

代码结构

主要分为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参数调节。
小讯
上一篇 2025-04-04 09:31
下一篇 2025-02-19 13:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/63856.html