stm32蓝牙遥控小车(hal库)
一.cubemx配置
我使用的板子是stm32f103rct6,这里我们使用串口1,选择异步模式,注意波特率的选择,一般是9600或者115200,如果波特率选择不对的话是不能进行通讯的(我小车怎么也动不了搞了好久最后发现是波特率选错了,气死了),我用的蓝牙模块是HC-05(ps:我的stm32f103rct6的板子的串口波特率时9600,stm32f407vgt6的板子的波特率是28800)
打开串口1的中断,中断优先级根据自己的实际需求选择。
这样就配置完了,连线的时候,注意蓝牙的RX连接PA9,TX连接PA10,不要连错了。
二.代码部分
代码直接从keil5里复制粘贴中文注释部分会乱码,过两天我再给修改一下,主函数循环前不要忘了开启串口1的接收中断。
HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1);
Car_Move.c
#include "tim.h"
#include "Car_Move.h"
#include "gpio.h"void Motor1Forward(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1, speed);
}void Motor2Forward(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, speed);
}
void Motor3Forward(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_3, speed);
}
void Motor4Forward(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_4);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_4, speed);
}
/************************************************/
void Motor1Stop(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,0);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,0);
}
void Motor2Stop(void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,0);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,0);
}
void Motor3Stop(void)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,0);
}
void Motor4Stop(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,0);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,0);
}
/*********************************************/
void Motor1Back(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1, speed);
}
void Motor2Back(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, speed);
}
void Motor3Back(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_3, speed);
}
void Motor4Back(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_4);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_4, speed);
}
/*********************************************/
void Move_Forward(uint16_t speed)
{ Motor1Forward(speed);Motor2Forward(speed);Motor3Forward(speed);Motor4Forward(speed);
}
void Move_Back(uint16_t speed)
{Motor1Back(speed);Motor2Back(speed);Motor3Back(speed);Motor4Back(speed);
}
void TurnLeft(uint16_t speed)
{Motor1Back(speed); Motor2Forward(speed);Motor3Back(speed); Motor4Forward(speed);
}
void TurnRight(uint16_t speed)
{Motor1Forward(speed);Motor2Back(speed);Motor3Forward(speed);Motor4Back(speed);
}
void Move_Stop(void)
{Motor1Stop();Motor2Stop();Motor3Stop();Motor4Stop();
}
void Move_Right(uint16_t speed)
{Motor1Forward(speed);Motor2Back(speed);Motor3Back(speed);Motor4Forward(speed);
}
void Move_Left(uint16_t speed)
{Motor1Back(speed);Motor2Forward(speed);Motor3Forward(speed);Motor4Back(speed);
}
void Move_UpRight(uint16_t speed)
{Motor1Forward(speed);Motor4Forward(speed);
}
void Move_UpLeft(int16_t speed)
{Motor2Forward(speed);Motor3Forward(speed);
}
void Move_DownLeft(int16_t speed)
{Motor1Back(speed);Motor4Back(speed);
}
void Move_DownRight(int16_t speed)
{Motor2Back(speed);Motor3Back(speed);
}
Car_Move.h
#ifndef __car_move_h__
#define __car_move_h__void Motor1Forward(int16_t speed);
void Motor2Forward(int16_t speed);
void Motor3Forward(int16_t speed);
void Motor4Forward(int16_t speed);void Motor1Stop(void);
void Motor2Stop(void);
void Motor3Stop(void);
void Motor4Stop(void);void Motor1Back(int16_t speed);
void Motor2Back(int16_t speed);
void Motor3Back(int16_t speed);
void Motor4Back(int16_t speed);void Move_Forward(uint16_t speed);
void Move_Back(uint16_t speed);
void TurnLeft(uint16_t speed); //ÆÕͨÂÖ×Ó
void TurnRight(uint16_t speed); //ÆÕͨÂÖ×Ó
void Move_Stop(void);
/*Âó¿ËÄÉÄ·ÂÖ*/
void Move_Right(uint16_t speed);
void Move_Left(uint16_t speed);
void Move_UpRight(uint16_t speed);
void Move_UpLeft(int16_t speed);
void Move_DownLeft(int16_t speed);
void Move_DownRight(int16_t speed);#endif
bluetooth.c
#include "bluetooth.h"
#include "control.h"uint8_t USART1_RX_BUF[USART1_REC_LEN];//接收缓冲,最大USART1_REC_LEN个字节
uint16_t USART1_RX_STA=0;//接收状态标记//bit15:接收完成标志,bit14~0:接收到的有效数字
uint8_t USART1_NewData;//当前串口中断接收的1个字节数据缓存void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口中断回调函数
{if(huart ==&huart1){if((USART1_RX_STA&0x8000)==0)//接收未完成{if(USART1_NewData==0x5A)//接收到了0x5A{USART1_RX_STA|=0x8000; //接收完成了,将USART1_RX_STA中的bit15置1}else{USART1_RX_BUF[USART1_RX_STA&0X7FFF]=USART1_NewData; //将接收到的数据放入数组USART1_RX_STA++; //数据长度计数加1if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收}}HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1); //因为每执行完一次中断回调函数会将接收功能关闭,所以最后要再次开启中断}if(USART1_RX_STA&0x8000) //判断中断接受标志位(蓝牙模块使用USART1) {if((USART1_RX_STA&0x7FFF)==5 //判断接收数量 && USART1_RX_BUF[0]==0xA5 //判断接接收第一个数据是不是包头0xA5&& USART1_RX_BUF[4]==(USART1_RX_BUF[1]+USART1_RX_BUF[2]+USART1_RX_BUF[3])%0x100) //判断接受校验码是不是原数据之和低8位{X=USART1_RX_BUF[1]; //接受并读取蓝牙发送过来的数据Y=USART1_RX_BUF[2];Z=USART1_RX_BUF[3];} USART1_RX_STA=0; //标志位清0,准备下一次接收}}
bluetooth.h
#ifndef __BLUETOOTH_H__
#define __BLUETOOTH_H__#include "main.h" //HAL库文件声明extern UART_HandleTypeDef huart1;//声明USART2的HAL库结构体#define USART1_REC_LEN 200//定义USART2最大接收字节数extern uint8_t USART1_RX_BUF[USART1_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节.末字节为校验和
extern uint16_t USART1_RX_STA;//接收状态标记
extern uint8_t USART1_NewData;//当前串口中断接收的1个字节数据的缓存void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);//串口中断回调函数声明#endif
蓝牙部分代码参考自这篇文章蓝牙小车(基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图)
Control.c
#include "gpio.h"
#include "Car_Move.h"
#include "Control.h"
#include "bluetooth.h"int X,Y,Z;void Control(void)
{if(Y==1){Move_Forward(3000);}else if(Y==2){Move_Back(3000);}else if(Z==1){TurnRight(3000);}else if(Z==2){TurnLeft(3000);} else if(X==1){Move_Right(3000);}else if(X==2){Move_Left(3000);} else{Move_Stop();}
}
Control.h
#ifndef __CONTROL_H
#define __CONTROL_Hextern int X,Y,Z;void Control(void);#endif
以上就是主要的代码了,主要我还是新手,代码有很多要改进的地方,后期我会再慢慢修改完善代码。
三.手机蓝牙调试app使用方法
蓝牙小车(基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图)
还是这篇文章,文章后半部分详细地讲解了app的使用方法。
(本片文章主要用于记录我的代码和其他一些东西以提醒我自己)
stm32蓝牙遥控小车(hal库)相关推荐
- 5.39 综合案例2.0 - STM32蓝牙遥控小车2(语音控制)
综合案例2.0 - 蓝牙遥控小车1- 语音控制 成品展示 案例说明 器件说明 小车连线 小车源码 语音模块遥控 语音遥控连线 模块使用说明 1.MLT-BT05 4.0 蓝牙模块 2.ASRPRO-2 ...
- 简单的STM32蓝牙遥控小车完整项目及资料分享,超全
自学新手的第一个项目,做的时也在论坛查了许多大佬的文章,但还是有许多疑问,我就从一个小白的角度出发来和大家分享,应该对许多自学不久的萌新来说比较友好易懂.欢迎大家交流,大佬轻喷~~ 简单的蓝牙小车,目 ...
- 基于HAL库-蓝牙遥控小车
stm32+HAL库制作蓝牙遥控小车 材料及其接线 蓝牙模块:HC05/6 材料均可在某宝上进行购买. 注意:蓝牙模块可进行串口调试也可不调试(及为默认设置),本文使用的为未调试状态下的蓝牙串口,有关 ...
- 基于STM32的最简易蓝牙遥控小车
基于STM32的最简易蓝牙遥控小车 硬件准备 硬件连接 STM32cubeMX配置 代码部分 视频演示 本篇博客主要针对的读者为有一定单片机基础,但是第一次自制蓝牙遥控小车的小白同学,所用物件型号选择 ...
- 【STM32】F103C8T6 蓝牙遥控小车
STM32F103C8T6 蓝牙遥控小车 前言 硬件部分 连线部分 软件部分 代码 问题与解决... 前言 本次项目使用的是STM32F103C8T6核心板作为主控,通过连接蓝牙模块,实现和手机APP ...
- 蓝牙遥控小车2.0版发布啦
蓝牙遥控小车2.0版发布啦! 蓝牙模块的主从机模式 1.主从机模式 2.设置主从机模式 蓝牙遥控器 1.硬件接线 2.程序设计 蓝牙小车 1.硬件接线 2.程序设计 今天要跟大家分享的是两个蓝牙模块之 ...
- MSP432蓝牙遥控小车
目录 前言 搭建 硬件 软件 原理 源码 前言 这个小车是去年电赛的时候准备的,很遗憾我们赛区因为疫情被取消了比赛,我们也都已经大二大三了,因此我们没有机会再参加两年一次的电赛了.但是这些成果总不能放 ...
- Arduino mega2560蓝牙遥控小车简介
Arduino mega2560蓝牙遥控小车简介 小车一览 主要模块如下: 一.电源 (1)BOM表:18650电池两节(单节3.6v,6800mAh) 18650 电池盒(两节带开关) 二.电机驱动 ...
- stm32直流电机PID控制hal库(Cubemx)
stm32直流电机PID控制hal库(Cubemx),一步步手把手教你怎么配置cubemx怎么写代码. 未对pid就行深入解析,不过相信您通过配置和写代码以后大概可以知道pid的主要作用. 文章目录 ...
最新文章
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)(转载)
- web图片铺满网页_web单页面实现多个echarts图表铺满整个div(柱状图,折线图,饼形图……)...
- 这周,我们作前端,实现统一的过滤搜索
- Linux中文件查找技术大全
- 霍尔传感器和直流无刷电机
- 生成模型与判别模型的区别
- Kettle计算器的使用以及字符串格式化
- 打不开gitHub的解决方法
- MySQL游标循环取出空值的BUG
- 计算机辅助药物设计中的分子动力学模拟
- JAVA基础知识点大全之一
- Windows系统下查询本机IP地址和MAC地址
- 用户需求变更和确认的注意事项
- 电子科技大学计算机考研题,电子科技大学820计算机考研真题题库
- python小游戏 记忆翻牌小游戏设计与实现
- Pytorch:基于转置卷积解码的卷积自编码网络
- Pycharm 小技巧-- filewacher+black自动格式化
- 咸鱼Micropython—GPIO
- 第七周项目5排队看病模拟
- 【Java培训】 IT行业是什么
热门文章
- cmi编码实验_CMI码型变换实验
- 【闲聊杂谈】深入剖析Java8新特性
- 想知道录音转文字哪个软件好吗?来看看这篇文章
- 机器学习——线性回归实践
- maven报错: previously initiated loading for a different type with name servlet/http/HttpServletReq
- 黑龙江省高级职称英语计算机,2017年起黑龙江基层专业技术人员取消职称英语能力要求...
- 想和太阳肩并肩?扒一扒那些上天入海的阿里小二
- Golang Go 安装 使用 VSCode
- LDO稳压出现振荡问题
- 局部变量和静态局部变量