基于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