做一辆超mini平衡自行车,全开源!

大家好,我是张巧龙,今天给大家带来一个平衡自行车,我实验室一个19级的本科生做的,他今年也获得了全国电赛二等奖(F题)的成绩。

人嘛,非常帅的一个小伙子。B站ID:_旺仔小菠萝,欢迎大家围观!

好了,废话不多说,直接开整!先看展示视频,相关方案在后文。

文末开源所有文件(已经获得本人授权),程序、电路、3D打印文件。

01 

硬件篇

1.1  STM32F103C8T6最小系统(小蓝板)

eaa09e43758bd00c6ce2f23a96b03ff0.png

1.2 MPU6050姿态传感器(3.3V供电)

2dd0aed970c6d076bcdde2588375067d.png

1.3 0.96寸OLED显示屏(四针、IIC通信、3.3V供电)

6b585eba71ccdbf1dbce83e9ae6ab96d.png

1.4 HC-05蓝牙模块(串口通信、用于接收小车运动指令)

86cdbf1e7af958ea74d9aba4d7ca429b.png

使用教程链接:https://blog.csdn.net/weixin_44325419/article/details/110727911

1.5  无刷电机动量轮

4c6ea4e00b7888040089d9275bfaee87.png

1.6 N20电机及驱动(电机选型:DC 12V A12型)

cfe3ec3a5c9707303d7a5f19b5991198.png

1.7 无刷电机动量轮模组

该电机自带驱动和光电编码器。

b316b863b6c14ae56d1a51a813693dca.png

该自平衡自行车中我们使用万宝至无刷伺服电机,内置驱动,支持正反转,PWM调速,并且带有100线编码器AB相双通道信号输出。

5ce8839b3e1cc132fc9d0d697f46f720.png

该电机接线图如上图所示,实际小车中的线的颜色可能与上图有所不符,大家要按照位置来判断而不是线的颜色。

1.信号A相和信号B相为编码器脉冲输出端;

2.正反转切换的线我们直接用单片机的引脚3.3V电平控制,是完全没有问题的;

3.编码器供电接3.3V;

4.PWM接单片机的PWM输出,启动运行我们接单片机IO口,在电机初始化时置为高电平;

5.电源负极接GND,电源正极接12V。

1.8  舵机

项目中所使用,有点小贵,可以买便宜的。

3cc0f7c41ec59cc4905fffce31fee5ac.png

1.9  3S航模电池(注意电池尺寸)

00ae4f603f081b9f1d651e5fbb8c80e2.png

1.10 稳压模块及开关

将航模电池电压降至5V给单片机、舵机、蓝牙、超声波、电机编码器供电。

405af9f155a50795dbbb714ebe0f145d.png

1.11  轮子及轴承

由于小车后轮是通过皮带传动,为减小摩擦,使后轮转动更加顺滑,需在后轮安装微型轴承。(轴承根据车轴尺寸购买)

070a0729a92e363b62afa7030e401a68.png

ea1a796db82fd893b844c8bab5b31946.png

1.12  车架及转向结构(3D打印)

48fad227e1a6675bb284e06112882ffb.png

13. 电路PCB

将上述功能模块集成在一块PCB电路板上(6.5x7.8cm),为方便焊接,电容电阻及三极管均为直插式元件。

cba6f19a108248de758ed59c46b0efdc.png

87cb158ea6b8a53fa3076d13065971c0.png

02 

软件篇

2.1  main.c

#include "sys.h" 
float AdcValue;                       //电池电压数字量
float Pitch,Roll,Yaw;                 //角度
short aacx,aacy,aacz;                 //加速度传感器原始数据
short gyrox,gyroy,gyroz;              //陀螺仪原始数据
int PWM1;
int PWM_MAX=6500,PWM_MIN=-6500;  //PWM限幅变量
int Encoder_Motor;  //编码器数据(速度) 
int main(void)
{  
  NVIC_Config();
     delay_init();
    Led_Init();
    Beep_Init();
    Wave_SRD_Init();
     uart3_init(9600);
    OLED_Init();      //初始化OLED  
    OLED_Clear();
    adc_Init();
    MOTOR_1_Init();
    MOTOR_2_Init();
    PWM_Init_TIM3(7199,0);//定时器3初始化PWM 10KHZ,用于驱动动量轮电机 
    PWM_Init_TIM2(9999, 143);//定时器2初始化PWM 50HZ,用于驱动舵机
    TIM_SetCompare1(TIM2, 790);//舵机复位
    Init_TIM1(9998,7199);
    Encoder_Init_TIM4(65535,0);
    OLED_ShowString(25,4,"MPU6050...",16);
    MPU_Init();            //MPU6050初始化  
while(mpu_dmp_init())
    {
    OLED_ShowString(25,4,"MPU6050 Error",16);
    }  
    OLED_ShowString(25,4,"MPU6050 OK!",16); 
    Beep=1;
    delay_ms(400);
    Beep=0;
    MPU6050_EXTI_Init();
    OLED_Clear();
    OLED_ShowString(0,0,"Roll :         C",16);
    OLED_ShowString(0,3,"Speed:         R ",16);
    OLED_ShowString(0,6,"Power:        V ",16);    
    while(1)
    {          
        Wave_SRD_Strat();        
        AdcValue=11.09*(3.3*Get_adc_Average(ADC_Channel_4,10)/0x0fff); //ADC值范围为从0-2^12=4095(111111111111)一般情况下对应电压为0-3.3V
        OLED_Showdecimal(55,0,Roll,9,16);  
        OLED_Showdecimal(55,3,Encoder_Motor*0.25,9,16);         
        OLED_Showdecimal(50,6,AdcValue,9,16);       
  }
}

2.2  PID控制算法

学习视频:

4027c7b579059fd85bed8761a6dd74ac.png

该小车实现直立平衡需要用到两个闭环控制,即直立环(PD控制、负反馈),速度环(PI控制、正反馈),代码原理及调试过程与两轮平衡小车调试过程基本一致。

关于PID控制算法的学习,内容较多,不好详细展开,网上资源丰富,大家可自行学习。

这里推荐一篇知乎文章:https://zhuanlan.zhihu.com/p/39573490

2.3 代码阅读注意点

所有头文件都包含在sys.h中,每个.h文件都包含sys.h,方便函数调用。

#ifndef __SYS_H
#define __SYS_H
#include "stm32f10x.h"
#include "adc.h"
#include "oled.h"
#include "led.h" 
#include "beep.h"
#include "wave.h"
#include "control.h" 
#include "exti.h" 
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h" 
#include "motor.h"
#include "pwm.h"
#include "encoder.h"
#include "usart.h"   
#include "delay.h"
#include <math.h>
#include <stdlib.h>

STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些端口设置为普通I/O口。

使用JLINK向STM32烧录程序时,需要使用6个芯片的引脚(以STM32F103C8T6为例),分别是PB4 / JNTRST,PB3 / JTDO,PA13 / JTMS,PA14 / JTCK,PA15 / JTDI,NRST。

当芯片IO口资源比较紧张时,可选择SW模式烧录程序。

SWD只需用到PA13 / JTMS,PA14 / JTCK两根线,NREST可以接可不接,剩下的PB4 / JNTRST,PB3 / JTDO和PA15 / JTDI就可以当然普通IO使用,但是这三个口当然普通IO使用时需要先进行如下配置。(这里MPU6050模块用到PB3和PB4引脚)

03

最后

3.1 作品照片

3db9a384dca02ab2fa5b7317a1d43527.png

3e2e70f05d9c075af85cf27f5147c5cf.png

3.2 获取方式

加入星球的同学,可以直接到星球内下载。

未加入星球的的同学,可以添加微信:great_xiaolong,加好友记得备注:自行车。

203ae8860fea509f5d7dd7cc6b37b555.png

对了,借此推荐下知识星球,星球现在已有120+人加入,有兴趣加入的朋友可以添加上方微信咨询,现在加入有一定优惠。

d3381c4281b853763ce5a3bbd74836a6.png

528d8010572d57eeeced4b54b5fbed73.png

-END-

0994bedc577a2706add2e5838e8bf428.png

一个亿的融资在一家芯片初创公司可以烧多久?

cbc6623b57e4f95875405b52ff500a37.png

STM32为何在诸多的单片机中脱颖而出?

eb074f143614c84bf9f18c23ee96b4e9.png

搞硬件,别吹牛了,好好做个规划!

一名教电子的大学老师,欢迎关注!

版权声明:本文为CSDN博主「张巧龙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/best_xiaolong/article/details/122833775

生成海报
点赞 0

张巧龙

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32串口发送接收数据

1.串口通信 我用的32是stm32f10x最小系统没有UART4和UART5 USART : 通用同步异步收发器 UART : 通用异步收发器 nRTS : 请求发送 nCTS : 请求接收 区别:USART指单片机的一个IO端

TCRT5000循迹模块原理及应用

前言 本文将讲述TCRT5000循迹模块的原理及应用。本文应用于STM32,对于使用循迹模块的你有一定的帮助。 以下是本篇文章的正文内容 一、TCRT5000循迹模块介绍 TCRT5000就是一个红外发射和接收器&#xff0