一.蓝牙简述
我这次把小车的坑补上,这是小车的最后一个部分,蓝牙遥控。这个部分重点在于蓝牙,其实蓝牙可以相当于一个串口,用串口通信就可以进行手机与单片机之间的通信
这是我从网上找来的HC-05图片,我采用的就是这个HC-05模块,HC-05是蓝牙2.0,一般安卓手机都会向下兼容低版本蓝牙,但是苹果是不行的,如果苹果蓝牙是4.0的话就需要买4.0的蓝牙模块。
HC-05有六个引脚
①state
②RXD
③TXD
④GND
⑤VCC
⑥KEY
其中VCC,GND就不用多说了,VCC一般接3.3V~5V的电压都可以,GND就接单片机的地。RXD是接受脚,TXD是输出脚与单片机的串口相连,接反了的话就不会传输数据。
KEY是用来进行进入AT命令的,一般AT命令是用来改变蓝牙的一些本身设置,比如地址、名称、波特率等等。进入AT命令后,通过上位机输入命令即可更改蓝牙的设置,之后蓝牙也会反馈到上位机。具体的命令我会把厂家给的教程上传。
二.蓝牙遥控
蓝牙遥控就是进行串口通信,通过手机上给的数据进行判断之后处理,就是用switch case 语句就可以解决了。
#include "gpio.h"
#include "sys.h"
#include "delay.h"
#include "pwm.h"
#include "pwm2.h"
#include "usart2.h"
u8 i;
u8 flag; //定义一个标志位
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET) //检查指定的 USART2 中断发生与否
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清除 USART2 的中断待处理位
i= USART_ReceiveData(USART2); //返回 USART2 最近接收到的数据
printf("%c",i);
//if语句的内容部分可以保证蓝牙接收到的flag数据是正确的,如果不加的话会导致接收不到正确的数据
if(i=='0')
{
flag=0;
}
if(i=='1')
{
flag=1;
}
if(i=='2')
{
flag=2;
}
if(i=='3')
{
flag=3;
}
if(i=='4')
{
flag=4;
}
if(i=='5')
{
flag=5;
}
if(i=='6')
{
flag=6;
}
}
}
int main()
{
while(1)
{
My_USART2_Init();
delay_init();
gpio_Init();
TIM1_PWM_Init(7199,0);
TIM3_PWM2_Init(7199,0);
TIM_SetCompare1(TIM1,1500);
TIM_SetCompare3(TIM3,1500);
switch(flag)
{
case 0: stop(); break ;
case 1: front(); break ;
case 2: left(); break ;
case 3: right(); break ;
case 4: turnleft(); break ;
case 5: turnright(); break ;
case 6: back(); break;
default: stop(); break ;
}
}
}
大体思路就是,手机对单片机传入数据,单片机判断传入的数据是什么,然后就进行了对电机的相关操作,我把电机的不同状态封装成了不同的函数,使用时调用函数就可以了。
这里是手机蓝牙串口的界面,可以自己编辑,按下不同的按钮传出不同的数据。
到此小车部分就结束了。我放上三个链接,一个是蓝牙的教程,一个是蓝牙串口app其中我上传了两个串口app,一个是我整个工程的代码。
我的工程代码蓝牙部分我放在了read me中,打开就能看见,可能需要自己调整IO口
安卓蓝牙串口(内含两个app)
厂家蓝牙教程(包含AT指令等)
STM32 舵机+超声波+蓝牙
下面是超声波避障和蓝牙遥控的两个视频
蓝牙遥控视频
超声波+舵机避障视频