基于stm32f103令HC-05蓝牙模块控制舵机及led灯的亮度
1. 基本介绍
单片机蓝牙通讯的原理是通过蓝牙模块实现无线数据传输。以下是一般的单片机蓝牙通讯原理:
选择合适的蓝牙模块:蓝牙模块通常是一种带有蓝牙通讯功能的芯片,它可以接收和发送与蓝牙标准兼容的无线信号。在选择蓝牙模块时,需要考虑通讯距离、功耗、通讯速率等参数。
串口通信:蓝牙模块通常与单片机通过串口进行通信,实现数据的收发。通常情况下,蓝牙模块的TX(发送)引脚连接到单片机的RX(接收)引脚,蓝牙模块的RX(接收)引脚连接到单片机的TX(发送)引脚。通过串口通信,单片机可以向蓝牙模块发送指令和数据,同时从蓝牙模块接收数据。
配置蓝牙模块:在单片机中,需要按照蓝牙模块的规格和文档,通过串口发送适当的指令来配置蓝牙模块的参数,例如波特率、工作模式、配对码等。
通信协议:单片机与蓝牙模块之间需要定义一种通信协议,以确保数据的正确传输和解析。通常情况下,可以定义一个简单的协议,例如先发送固定长度的数据帧头,然后发送实际的数据,最后发送一个校验和。蓝牙模块在接收数据时,根据协议进行解析和处理。
数据传输:在单片机中,可以通过串口的发送和接收函数,将数据发送到蓝牙模块或从蓝牙模块接收数据。通过发送和接收数据,实现与其他蓝牙设备的数据交换。
软件开发:通过在单片机上编写适当的软件代码,可以实现蓝牙通讯的功能。根据单片机的类型和编程语言,可以使用相应的串口通信函数或库函数来实现与蓝牙模块的通信。
总的来说,单片机蓝牙通讯的原理是通过串口通信,利用蓝牙模块进行无线数据传输。单片机向蓝牙模块发送数据或指令,蓝牙模块接收并解析数据,然后将其发送到其他蓝牙设备,或者通过蓝牙接收其他蓝牙设备发送的数据。这样,就实现了单片机与其他蓝牙设备之间的无线通信。
以下是利用uart串口通信令HC-05蓝牙模块控制舵机及led灯的亮度的简单配置和程序
2. 基础配置
打开cubamx,因为需要控制led和舵机,我们需要设置两个定时器,控制两个舵机,可以给定时器设置两个通道
定时器和PWM通道设置非常简单,还有时钟树选择最大的72MHZ,定时器1给led使用,通道一设置成PWMgeneration ch,psc设置为72-1,preload设置为2000-1,同理定时器2,但preload需设置成20000-1,设置两个pwm通道(一个舵机一个通道)
还需要蓝牙控制,设置串口usart1,异步通信,中断优先级为0,定时器与串口,配置引脚如下。
生成工程
3.配置bluetooth函数
在工程目录下新建一个文件夹bluetooth,存放bluetooth的c和h文件
在工程里新加空白文本,保存后选择bluetooth下的路径,分别有建c和.h文件
右键project中的子文件在manage project items里添加bluetooth及其c和h文件
最后点击魔术棒添加文件路径即可
接下来是写bluetooth的函数了
bluetooth.c
#include "bluetooth.h"
uint8_t USART1_RX_BUFF[USART1_REC_LENGTH];//接收缓冲,最大USART_REC_LEN个字节.
uint16_t USART1_RX_ST=0;//接收状态标记//bit15:接收完成标志,bit14~0:接收到的有效字节数目
uint8_t USART1_Data;//当前串口中断接收的1个字节数据的缓存
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口中断回调函数
{
if(huart ==&huart1)
{
if((USART1_RX_ST&0x8000)==0)//接收未完成
{
if(USART1_Data==0x5A)//接收到了0x5A
{
USART1_RX_ST|=0x8000; //接收完成了,将USART1_RX_STA中的bit15(15位)置1
}
else
{
USART1_RX_BUFF[USART1_RX_ST&0X7FFF]=USART1_Data; //将收到的数据放入数组,
USART1_RX_ST++; //数据长度计数加1
if(USART1_RX_ST>(USART1_REC_LENGTH-1))USART1_RX_ST=0;//接收数据错误,重新开始接收
}
}
HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_Data,1); //因为每执行完一次中断回调函数会将接收中断功能关闭,所以最后需要再开启接收中断
}
}
bluetooth.h
#ifndef __BLUETOOTH_H__
#define __BLUETOOTH_H__
#include "main.h"
extern UART_HandleTypeDef huart1;//声明USART2的HAL库结构体
#define USART1_REC_LENGTH 20//定义USART2最大接收字节数
extern uint8_t USART1_RX_BUFF[USART1_REC_LENGTH];//接收缓冲,最大USART_REC_LEN个字节.末字节为校验和
extern uint16_t USART1_RX_ST;//接收状态标记
extern uint8_t USART1_Data;//当前串口中断接收的1个字节数据的缓存
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);//串口中断回调函数声明
#endif
4.配置主程序
回到mian.c,在main函数之前begin0中定义变量
int pwmval,servo1,servo2;
main函数中代码如下
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); //开启TIM1通道1的PWM
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); //开启TIM2通道1的PWM
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); //开启TIM2通道1的PWM
HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_Data,1); //开启串口1的接收中断
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,1500);//初始化舵机角度90度
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,1500);//初始化舵机角度90度
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(USART1_RX_ST&0x8000) //判断中断接收标志位(蓝牙模块使用USART1)
{
if((USART1_RX_ST&0x7FFF) ==6 //判断接收数量6个
&& USART1_RX_BUFF[0]==0xA5 //判断接收第1个数据是不是包头0xA5
&& USART1_RX_BUFF[5]==(USART1_RX_BUFF[1]+(USART1_RX_BUFF[2])+(USART1_RX_BUFF[3])+(USART1_RX_BUFF[4]))%0x100) //判断接收校验码是不是原数据之和的低8位
{
pwmval=2000-5*USART1_RX_BUFF[2];
servo1=500+20*USART1_RX_BUFF[3];
servo2=500+20*USART1_RX_BUFF[4];
if(USART1_RX_BUFF[1]==1)//判断调节led开关是否打开
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwmval);//开关打开,可调节led亮度
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,servo1);//调节舵机角度
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,servo2);//调节舵机角度
// switch(USART1_RX_BUF[?])
// {
// case(0x01):
// case(0x02):
// case(0x03):
// case(0x04):
// case(0x00):
// default:break;
// }留着以后做其他用
}
USART1_RX_ST=0;//标志位清0,准备下次接收
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
5.手机蓝牙调试器的使用
打开调试器,连接HC-05后进入专业调试
添加后退出,进入编辑控件,添加如下3个控键
添加控件时会有如下的选项选择
设置完成后退出即可,进入运行模式,可对舵机led进行控制。
完成,pefect!
个人笔记,没有技术含量,用来训练写博客
测试视频