STM32 HAL库快速实战【六】《蓝牙控制》--基于黑龙江科技大学机电工业机器人实训

系列目录

前言

请确保《已经完成串口简单实用》以及《控制串口电机》

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
image
然后打开BlueSPP,CONNECT BT18
image

连接后发送ABCDEF字符,电机执行对应命令,并返回执行了哪条命令。
image

工程源码

国内用户请使用gitee克隆或是使用代理访问Github
https://github.com/USTHzhanglu/stm32-hal/tree/main/bluetooch

posted @ 2021-12-06 17:23  USTHzhanglu  阅读(1356)  评论(0编辑  收藏  举报