系列目錄
-
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
