STM32 HAL库快速实战【六】《蓝牙控制》--基于黑龙江科技大学机电工业机器人实训
系列目录
-
STM32 HAL库快速实战【一】《32点灯》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
-
STM32 HAL库快速实战【三】《pwm控制舵机》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
-
STM32 HAL库快速实战【四】《串口简单使用》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
-
STM32 HAL库快速实战【五】《控制串口电机》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
-
STM32 HAL库快速实战【六】《蓝牙控制》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
前言
请确保《已经完成串口简单实用》以及《控制串口电机》
CubeMX配置
与上节完全一致
编写代码
打开motor.c
使用蓝牙控制时,单片机需要处理蓝牙发来的数据并处理,因此添加如下代码
char get_cmd(void) //从串口3接收字符
{
uint8_t ch =0;
//HAL_UART_Receive(&huart1, &ch, 1, 0xffff);//轮询阻塞方式
while(HAL_UART_Receive_IT(&huart3, &ch, 1)!=HAL_OK){};
return ch;
}
注意,为了方便使用,这里只接收一个字符,如需要接收字符串,需要自行添加缓冲区,相关实现不在这里赘述。
然后再motor.h 中声明
#include "usart.h"
#include "stdio.h"
#include "string.h"
void usart_send_str(UART_HandleTypeDef *huart,unsigned char *Data);
void motor_init(void);
void motor_set(int car_left, int car_right);
char get_cmd(void);
在主函数中,通过input=get_cmd()
来获取蓝牙发送的字节。
获取到字节后,通过switch case语句,即可执行不同代码。
switch(input)
{
case 'A':
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,speed);
HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
speed+=3;
printf("led togglePin,speed [%d],you input %c",speed,input);
//usart_send_str(&huart1,(unsigned char *)"is usart_send_str test \r\n");
break;
执行完后,使用input=NULL;
来重置命令,防止代码重复执行。
结合上节控制电机的代码,即可通过蓝牙进行控制。
/* USER CODE BEGIN WHILE */
int speed=500;
char input;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
input=get_cmd();
if(input){
switch(input)
{
case 'A':
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,speed);
HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
speed+=3;
printf("led togglePin,speed [%d],you input %c",speed,input);
//usart_send_str(&huart1,(unsigned char *)"is usart_send_str test \r\n");
break;
case 'B':
usart_send_str(&huart3,(unsigned char *)"car go\r\n");
printf("car go\r\n");
motor_set(1000,1000);
break;
case 'C':
usart_send_str(&huart3,(unsigned char *)"car back\r\n");
printf("car back\r\n");
motor_set(-1000,-1000);
break;
case 'D':
usart_send_str(&huart3,(unsigned char *)"car left\r\n");
printf("car left\r\n");
motor_set(1000,0);
break;
case 'E':
usart_send_str(&huart3,(unsigned char *)"car right\r\n");
printf("car right\r\n");
motor_set(0,1000);
break;
case 'F':
usart_send_str(&huart3,(unsigned char *)"car stop\r\n");
printf("car stop\r\n");
motor_set(0,0);
break;
}
input=NULL;
}
}
/* USER CODE END 3 */
蓝牙调试
将蓝牙模块插入蓝牙接口
然后上电,打开手机蓝牙,与BT18进行配对。配对码1234
然后打开BlueSPP,CONNECT BT18
连接后发送ABCDEF字符,电机执行对应命令,并返回执行了哪条命令。
工程源码
国内用户请使用gitee克隆或是使用代理访问Github
https://github.com/USTHzhanglu/stm32-hal/tree/main/bluetooch