基于STM32的最简易蓝牙遥控小车
本篇博客主要针对的读者为有一定单片机基础,但是第一次自制蓝牙遥控小车的小白同学,所用物件型号选择的是作者最熟悉、最常用的,老手请自行发挥。
硬件准备
硬件包括小车的机械部分、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进制
接下来就可以给小车开关打开,连接上蓝牙然后使用了。
视频演示
小车演示视频
转自:https://blog.csdn.net/weixin_43469377/article/details/128824607