基于STM32的最简易蓝牙遥控小车
- 硬件准备
- 硬件连接
- STM32cubeMX配置
- 代码部分
- 视频演示
本篇博客主要针对的读者为有一定单片机基础,但是第一次自制蓝牙遥控小车的小白同学,所用物件型号选择的是作者最熟悉、最常用的,老手请自行发挥。
硬件准备
硬件包括小车的机械部分、STM32f103c8t6最小系统板、ST-LINK下载器,HC-05蓝牙模块、CH340模块、L298N电机驱动模块,焊接设备、一些杜邦线
如下图所示:
如果是完全的新手的话,做这个小车的成本在200元左右,包括焊接设备,杜邦线等。
硬件连接
首先按照小车的图纸把小车的机械部分装好(只需要一点点动手能力就能搞定,不要学我扔给爸爸装orz)。
小车整体电路图:
连接完成实物图:
这样连接完成后线比较麻烦,可以用一个扎带扎好。
STM32cubeMX配置
本实验基于HAL库,需用到stm32cubeMX进行配置,软件需要安装的有keil5,stm32cubeMX,软件的安装请参考其他博客
进入到stm32cubeMX,选择芯片为stm32f103c8t6
RCC的配置:
下载方式:
串口配置:
串口需打开中断:
然后需要选择4个io口(输出模式)作为电机驱动的输入(图中的IN1~IN4):
时钟配置:
然后写完文件名称,勾选生成.c和.h文件后生成代码。
代码部分
我们主要写的部分就是蓝牙遥控部分(串口通信)和小车电机控制部分:
motor.c
#include "stm32f1xx_hal.h" #include "main.h" #include "motor.h" #include "usart.h" uint8_t BackData[1]; void Stop(void) { IN1_Reset; IN2_Reset; IN3_Reset; IN4_Reset; } void Turnleft(void) { IN1_Reset; IN2_Reset; IN3_Reset; IN4_Set; } void Turnright(void) { IN1_Reset; IN2_Set; IN3_Reset; IN4_Reset; } void Turnback(void) { IN1_Set; IN2_Reset; IN3_Set; IN4_Reset; } void Turnfront(void) { IN1_Reset; IN2_Set; IN3_Reset; IN4_Set; } void Leftback(void) { IN1_Set; IN2_Reset; IN3_Set; IN4_Set; } void Rightback(void) { IN1_Reset; IN2_Reset; IN3_Set; IN4_Reset; } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { UNUSED(huart); HAL_UART_Transmit(&huart1, (uint8_t *)BackData, 1, 100); HAL_UART_Receive_IT(&huart1, (uint8_t *)BackData, 1); }
motor.h
#ifndef _MOTOR_H #define _MOTOR_H #define IN1_Set HAL_GPIO_WritePin(IN1_GPIO_Port,IN1_Pin,GPIO_PIN_SET) #define IN1_Reset HAL_GPIO_WritePin(IN1_GPIO_Port,IN1_Pin,GPIO_PIN_RESET) #define IN2_Set HAL_GPIO_WritePin(IN2_GPIO_Port,IN2_Pin,GPIO_PIN_SET) #define IN2_Reset HAL_GPIO_WritePin(IN2_GPIO_Port,IN2_Pin,GPIO_PIN_RESET) #define IN3_Set HAL_GPIO_WritePin(IN3_GPIO_Port,IN3_Pin,GPIO_PIN_SET) #define IN3_Reset HAL_GPIO_WritePin(IN3_GPIO_Port,IN3_Pin,GPIO_PIN_RESET) #define IN4_Set HAL_GPIO_WritePin(IN4_GPIO_Port,IN4_Pin,GPIO_PIN_SET) #define IN4_Reset HAL_GPIO_WritePin(IN4_GPIO_Port,IN4_Pin,GPIO_PIN_RESET) void MotorInit(void); void Turnleft(void); void Turnright(void); void Turnback(void); void Turnfront(void); void Stop(void); void Leftback(void); void Rightback(void); void contorl(void); #endif
main.c
需要在主函数里添加外部定义数组:
extern uint8_t BackData[1];
初始配置:
Stop(); //先让小车停止 HAL_UART_Receive_IT(&huart1, (uint8_t *)BackData, 1); //开启接收中断
然后就在while循环里根据蓝牙收到的指令进行对应的操作就好
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(BackData[0]==2) { Turnfront(); } else if (BackData[0]==4) { Turnleft(); } else if (BackData[0]==5) { Stop(); } else if (BackData[0]==6) { Turnright(); } else if (BackData[0]==8) { Turnback(); } }
代码部分就结束了,编译后下载到STM32中。
接下来配置蓝牙串口软件:
上图是配置之后的成品,对于每个按键的编辑如下,按下状态的对应关系:2前进,4左转,5停止,6右转,8后退,松开状态都是5,都选择16进制
接下来就可以给小车开关打开,连接上蓝牙然后使用了。
视频演示
小车演示视频