文章目录
一.概要
智能小车项目融合了机械、电子、控制、计算机等多学科知识,是提升综合能力的绝佳载体。智能小车的设计是一个"小而全"的工程缩影,它让你在有限的时间和成本内,模拟了真实产品的开发流程,是一次非常宝贵的工程实践和能力证明。体验"从0到1"的创造:从一堆散落的零件和抽象的代码,到最终组装出一台能听话运行的小车,这种创造的成就感是无可替代的。
想让小车拥有"眼睛",还能用手机或电脑远程操控?本文就介绍做一个WIFI视频控制小车,采用STM32F103C8T6单片机+直流有刷电机+ESP32-CAMWIFI视频模块。通过电脑或者手机就能实现小车的前进,后退,左转,右转,停止等动作,还能把小车前方画面实时传回手机或电脑浏览器。

二.实验模型原理
1.硬件连接原理框图

模型主要分为三部分:主控单元,视频采集WIFI连接单元,动作执行单元。

图中主控单元为STM32单片机小系统板,板子主芯片为STM32F103C8T6单片机,动作执行单元L9110S驱动直流有刷电机,视频采集WIFI连接单元是ESP32-CAM模块实现WIFI连接和视频采集。
信号线连接:L9110S模块接单片机的PB12,PB13,PB14,PB15引脚,ESP32-CAM模块接单片机的PB5,PB6,PB7,PB8,PB9引脚。
2.各个传感器模块控制原理
WIFI视频采集模块原理
ESP32-CAM模块的硬件主要由主控芯片和摄像头传感器两部分构成。
主控芯片 (ESP32):这是模块的"大脑"。它通常搭载一颗双核32位处理器,主频高达 240MHz。为了应对图像处理所需的大量数据,芯片除了内置的 520KB SRAM 外,还外置了 4MB 的 PSRAM 作为图像帧缓冲区。ESP32 内部集成了 802.11 b/g/n Wi-Fi 和蓝牙 4.2,为无线通信提供了基础。
摄像头传感器 (OV2640):这是模块的"眼睛"。它是一颗 200 万像素的 CMOS 图像传感器,最高支持 1600x1200 (UXGA) 分辨率,并直接支持 JPEG 格式的硬件压缩输出,这极大地减轻了主控芯片的负担。

ESP32-CAM模块固件程序可以通过 USB转 TTL模块连接实现硬件连接下载。
硬件连接5根线:
- TX ↔ RX 交叉(绿 / 蓝线)
- GND ↔ GND 共地(黑线)
- 5V ↔ 5V 供电(红线)
- GPIO0 ↔ GND 烧录时短接,烧完拔掉 (黄线 / 黑色跳线)

软件开发环境:
使用Arduino-IDE_2.2.1开发软件实现ESP32-CAM 固件的代码编译与下载。主要代码功能就是实现摄像头初始化、Wi-Fi 连接、Web 服务器、MJPEG 视频流、外设控制这些功能。

直流有刷电机控制原理
H桥可控制电机的运动和正反转,H桥式电机驱动电路包括4个三极管和一个电机。 要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。
当Q1和Q4导通时,电流将经过Q1从左往右流过电机,在经过Q4流到电源负极,这时图中电机可以顺时针转动。

当Q3和Q2导通时,电流将经过Q3从右往左流过电机,在经过Q2流到电源负极,这时图中电机可以逆时针转动。

L9110是为消费类产品,玩具和其他低压或者电池供电的运动控制类应用提供了一个集成的电机驱动器解决方案。此器件能够驱动一个直流有刷电机,由一个内部电荷泵生成所需的栅极驱动电压电路和4个功率NMOS组成H桥驱动,集成了电机正转/反转/停止/刹车四个功能。
L9110功能框图


基本工作模式
a)待机状态
在待机状态下, INA=INB=L。包括驱动功率管在内的所有内部电路都处于关断状态。电路消耗极低 的电流。此时马达输出端OUTA 和OUTB 都为高阻状态。
b)正转模式
正转模式的定义为: INA=H,INB= L, 此时马达驱动端OUTA 输出高电平,马达驱动端OUTB 输出 低电平时,马达驱动电流从OUTA 流入马达,从OUTB 流到地端,此时马达的转动定义为正转模式。
c)反转模式
反转模式的定义为: INA=L,INB= H, 此时马达驱动端OUTB 输出高电平,马达驱动端OUTA 输出 低电平时,马达驱动电流从OUTB 流入马达,从OUTA 流到地端,此时马达的转动定义为反转模式。
d)刹车模式
刹车模式的定义为: INA=H,INB=H ,此时马达驱动端OUTA 以及OUTB 都输出低电平,马达内存储的能量将通过OUTA 端NMOS 管或者OUTB 端NMOS 快速释放,马达在短时间内就会停止转动。
注意在刹车模式下电路将消耗静态功耗。
三.WIFI视频小车控制流程
1.锂电池接到板子后,打开板子上的开关,STM32单片机小系统板上的电源LED红灯就会亮起。

2.操作电脑的WIFI配置,找到ESP32-GZWELIN网络热点,电脑连接上之后,浏览器界面输入192.168.4.1,电脑就能跟小车摄像头连接,能看到小车前方的画面。
3.点击浏览器界面的前进,后退,左转,右转按钮,ESP32-CAM上的WIFI模块收到信息后,就会把信息传给STM32单片机,单片机控制L9110模块驱动小车按照控制进行运动。

四.WIFI视频控制小车程序
单片机板子与电机模块连接:
板子3.3V-----电机模块V
板子G---------电机模块G
板子B12------电机模块B-1A
板子B13------电机模块B-1B
板子B14------电机模块A-1A
板子B15------电机模块A-1B
单片机板子与ESP32-CAM连接:
板子5V-----ESP32模块5V
板子G---------ESP32模块GND
板子B5--------ESP32模块IO12
板子B6--------ESP32模块IO13
板子B7--------ESP32模块IO2
板子B8--------ESP32模块IO15
板子B9--------ESP32模块IO14

锂电池的插头接到板子电源口,打开电源开关,单片机板子上LED灯亮,说明上电完成。

创建STM32单片机程序工程
打开STM32CubeMX软件,新建工程

Part Number处输入STM32F103C8,再双击就创建新的工程

配置下载口引脚

配置外部晶振引脚

配置系统主频

PB12,PB13,PB14,PB15配置成输出,PB5,PB6,PB7,PB8,PB9配置成输入。

配置工程文件名,保存路径,KEIL5工程输出方式

生成工程

用Keil5打开工程

添加代码
添加读取ESP32模块输出的电平,并根据对应的指令驱动直流电机。

主要程序:
c
uint8_t TimerCounter;
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
HAL_Delay(3000);
TimerCounter=100;
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)==GPIO_PIN_SET)//前进
{
TimerCounter=100;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)==GPIO_PIN_SET)//右转
{
TimerCounter=100;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8)==GPIO_PIN_SET)//左转
{
TimerCounter=100;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)==GPIO_PIN_SET)//后退
{
TimerCounter=100;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)==GPIO_PIN_SET)//停止
{
TimerCounter=100;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
}
TimerCounter--;
if(TimerCounter==0)//2秒长时间没信号,车停止
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
}
HAL_Delay(20);//等待20ms
}
/* USER CODE END 3 */
}
ESP32CAM程序工程
确定视频模块的WIFI用户名,密码,模块默认的IP地址是192.168.4.1。

ESP32模块的I/O引脚跟STM32 I/O引脚互动,ESP32某个引脚输出高电平,STM32就控制电机相应动作。

摄像头时钟24MHZ,设置摄像头输出图像数据格式为 JPEG 压缩格式,设置摄像头输出图像分辨率为VGA:640 × 480 像素,设置JPEG 图像压缩质量15,(0~63范围)数值越小,画质越好,图片体积越大。

五.实验效果视频
DIY智能WIFI视频控制小车
六.小结
这套小车不仅是遥控玩具,更是学习嵌入式、WiFi通信、视频传输和电机控制的综合平台,从零搭建,到手机屏上看见小车眼中的世界,再到指尖轻点让它前进后退、左转右转,成就感十足。无论是课堂演示、毕业设计,还是创客比赛,STM32F103C8T6加ESP32-CAM的WiFi视频遥控小车,都能让你用低成本体验智能控制的乐趣。