实战小项目——基于STM32的蓝牙小车
目录
前言
一、所需材料
二、连接电路
三、具体代码
总结
前言
我相信看到这篇文章的人,一定对单片机有所了解。我猜测许多人都是看视频学习的吧,但是学习效率不高,总是处在一种似懂非懂的状态。我当初也是这种状态,后面意识到学单片机要多做项目,这样印象更加深刻,做项目也能检验自己的学习状态。下面介绍蓝牙遥控小车的制作,这个也是当初的第一个小项目。这个小项目主要用到了单片机定时器和串口。
一、所需材料
1、一块stm32f103c8t6最小系统开发板
2、一块HC05蓝牙模块
3、一块L298电机驱动模块
也可使用其他电机驱动,例如TB6612
4、一个带电机的车模
5、两节3.7v 18650电池和电池盒
可以用别的电池,电池最好是7.2V的。
6、AMS117 3.3V稳压芯片 (单片机是3.3v供电的,而电池电压是7.2V,因此不能直接将电池接单片机,需要稳压芯片将电压稳到3.3V)
6、杜邦线若干,焊接的一些设备
7、用手机做遥控器——蓝牙调试器
蓝牙调试器具体使用:https://blog.csdn.net/qq_53022278/article/details/120579388
二、连接电路
1、AMS1117稳压电路
2、下面是用到的单片机引脚
引脚 | 功能 |
PB6 | PWM1 |
PB7 | PWM2 |
PB8 | PWM3 |
PB9 | PWM4 |
PB10 | UART3_TX |
PB11 | UATR3_RX |
3、L298电机驱动真值表:
直流电机 | 旋转方式 |
IN1 (这里对应PB6) |
IN2 (这里对应PB7) |
IN3 (这里对应PB8) |
IN4 (这里对应PB9) |
电机A | 正转(调速) | 1/PWM | 0 | ||
反转(调速) |
0 | 1/PWN | |||
待机 | 0 | 0 | |||
刹车 | 1 | 1 | |||
电机B | 正转(调速) | 1/PWN | 0 | ||
反转(调速) | 0 | 1/PWM | |||
停止 | 0 | 0 | |||
刹车 | 1 | 1 |
注:“1”代表高电平;“0”代表低电平;“PWM”代表脉宽调制,调节占空比改变转速。IN1,INT2控制直流电机A;IN3,IN4控制直流电机B;两路完全独立的。输入端INx有防共态导通功能,悬空时等效于低电平输入。
4、具体连接:
单片机引脚PB6、PB7、PB8、PB9分别连接L298N的IN1、IN2、IN3、IN4。这里使用的车模有四个电机,但是我们一个L298n只能控制两个电机,因此我们采用左侧两个电机并联用一个电机控制口来控制,右侧同理。所以左侧电机连接电机A控制口,右侧电机连接电机B控制口。HC05的引脚VCC、GND、TXD、RXD分别连接单片机5V、G、PB11、PB10引脚。稳压芯片稳出的电压直接连接单片机随便一个3.3v引脚给单片机供电。L298n供电直接连接电池
三、具体代码
1、串口初始化函数:
void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使 能USART1,GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//USART3_TX GPIOB.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10//USART3_RX GPIOB.11初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11 //Usart3 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬 件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式USART_Init(USART3, &USART_InitStructure); //初始化串口3USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART3, ENABLE); //使能串口3}
2、PWM初始化和电机控制函数
void motor_init(int arr,int psr)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //定时器使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); //GPIO 口使能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //TIM4 CH1,CH2,CH3,CH4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO//初始化 TIM4TIM_TimeBaseStructure.TIM_Period = arr; //设置下一个更新事件活动重装载值寄存器周期TIM_TimeBaseStructure.TIM_Prescaler =psr; //预分频值TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); ////初始化TIM3 Channel2 PWM模式TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉宽调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出极性高TIM_OCInitStructure.TIM_Pulse=0;TIM_OC1Init(TIM4, &TIM_OCInitStructure); //初始化外设TIM4 OC1TIM_OC2Init(TIM4, &TIM_OCInitStructure); //初始化外设TIM4 OC2TIM_OC3Init(TIM4, &TIM_OCInitStructure); //初始化外设TIM4 OC3TIM_OC4Init(TIM4, &TIM_OCInitStructure); //初始化外设TIM4 OC4TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4 CCR2上的预装载值TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4 CCR2上的预装载值TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4 CCR2上的预装载值TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4 CCR2上的预装载值TIM_Cmd(TIM4, ENABLE); //使能TIM4}void motor_use(int motor1,int motor2)
{//左边电机if(motor1>0){TIM_SetCompare1(TIM4,motor1);TIM_SetCompare2(TIM4,0);}else{TIM_SetCompare1(TIM4,0);TIM_SetCompare2(TIM4,-motor1);}//右边电机if(motor2>0){TIM_SetCompare3(TIM4,motor2);TIM_SetCompare4(TIM4,0);}else{TIM_SetCompare3(TIM4,0);TIM_SetCompare4(TIM4,-motor2);}}
3、串口中断和数据接收函数
具体的串口接收发送请我的以前的文章:
https://blog.csdn.net/qq_53022278/article/details/120579388
总结
以上就是蓝牙小车的内容,上面只是介绍了主要的电路连接方式和主要代码,若有不懂的可以向我私信。
实战小项目——基于STM32的蓝牙小车相关推荐
- 基于STM32的蓝牙小车(来自LLC团队)
基于STM32的蓝牙小车(来自LLC团队) 引言 1.系统概述 1.1.设计任务 2 .方案设计与论证 2.1.芯片选择方案 2.2.系统概述: 2.3设计要求: 2.4系统总体设计思路 2.5.各功 ...
- 基于STM32的智能小车(一)
## 基于STM32的智能小车 在假期自学了STM32,一直想做一个智能小车,刚好这次有时间就在家自己制作了这个基于STM32的智能小车,小车基本功能包括循迹.壁障及手机蓝牙控制,本人是第一次制作小车 ...
- 【敬初学者】Python基础学完了,该怎么知道自己学的怎么样呢?十个经典实战小项目附源码
前言 1.街霸游戏 1.1 KO街霸 程序完整源码 程序的输出界面 1.2 春丽VS巴洛克 参考源码 2.猜谜游戏 2.1简单的猜数字游戏 项目要求 参考源码 2.2 进阶的猜姓名游戏 项目要求 参考 ...
- 我用Python把抖音上的美女图片转字符画,期望的AI目标更进一步【机器学习算法实战小项目,k聚类算法图片转化字符画】
大家好,我是辣条. 最近在学习算法,今天给大家带来一个机器学习实战小项目 项目效果展示 学习目标 1.cv2转换图片数据 2.numpy提取图片矩阵数据 3.k均值算法获取图片的分类 工具使用 开 ...
- 基于STM32的智能小车方案设计
基于STM32的智能小车设计 前言 一.什么是STM32智能小车? 二.模块汇总 1.主控板(STM32F103ZE) 2.底板 3.电机 4.避障模块(超声波传感器,红外传感器) 5.寻迹模块(3路 ...
- 毕业设计 基于Stm32的蓝牙便携手环 - 物联网 单片机
基于STM32的蓝牙手环 本次时基于STM32单片机的简易蓝牙手环 手指放在心率检测处,心率传感器就能实时的检测使用者的心率的变化,并在显示屏上进行显示: 通过DS18B20检测体温,体温数值也会在显 ...
- 基于STM32的智能小车--舵机云台设计
基于STM32的智能小车 第一章 基于STM32的智能小车方案设计 第二章 基于STM32的智能小车–电机驱动设计 第三章 基于STM32的智能小车–循迹设计 第四章 基于STM32的智能小车–避障设 ...
- 基于STM32的智能小车--电机驱动设计
基于STM32的智能小车 第一章 基于STM32的智能小车方案设计 基于STM32的智能小车--电机驱动设计 基于STM32的智能小车 前言 一.电机是什么? 二.常见电机分类 1.有刷电机 2.无刷 ...
- libhv tcp实战小项目
libhv Tcp小项目实战 一.概述 1.包头 2.心跳 3.任务队列 二.包头 2字节 2字节 4字节 4字节 2字节 1字节 1字节 起始标志 版本号(N) Command(命令ID) 消息体长 ...
- SparkSQL实战小项目之热门商品top3
SparkSQL实战小项目之热门商品top3 一.说明及需求分析 二.准备测试数据 三.思路分析 四.编码实现 五.验证结果 一.说明及需求分析 软件及环境: centos7 + hive-2.3.3 ...
最新文章
- Oracle定时执行存储过程
- 知识图谱基本概念工程落地常见问题
- evga x58服务器芯片组,为六核980X而生 EVGA发布X58 FTW3主板
- nginx+php-fpm动静分离
- 垃圾回收GC Roots
- MySQL查看数据库相关信息
- centos6.5 rpm安装mysql_CentOS6.5系统下RPM包安装MySQL5.6(转)
- Java框架体系架构的知识,轻松拿下offer
- Spark基础学习笔记02:Spark运行时架构
- ip变更 mysql无法启动_MySQL 重装MySQL后, mysql服务无法启动
- supervivi的一点秘密
- 《深度学习工程师》听课笔记,编程作业和课后练习
- python是什么类型的编程语言-Python是个什么语言?
- android电商组件化分配,android电商组件化设计(含源码):MVP+dagger+组件化
- 过程生产excel_通用Excel做销售订单动态展示板
- 基于STM32CUBE MX 的TM1640的使用例程
- WMS仓库管理系统与ERP仓储系统的区别与联系
- altium 网口差分走线长度_Altium Design 中差分走线的设置
- 【超融合】超融合“火不火”?
- 在线查看相机快门次数_我是亲民_新浪博客
热门文章
- linux常用操作命令总结
- octet和byte的差异
- C#获取电脑MAC地址(物理地址)的几种方法
- 从零开始之uboot、移植uboot2017.01(三、lowlevel_init)
- 微软输入法怎么打开软键盘?
- win7系统获得管理员取得所有权的方法【系统天地】
- c语言gets和puts的区别,C 语言 gets()和puts()
- 转载--自动化测试 (一) 12306火车票网站自动登录工具
- CityBuilder+DataV制作次世代3D城市大屏,一秒俘获甲方的心!
- VMware 配置局域网内访问