前言
目录
项目简介
本实践指南将带领您从零开始构建一个基于ESP32的智能网球捡拾小车系统。通过本项目的完整学习路径,您将掌握嵌入式开发、物联网通信、计算机视觉和智能控制等多项前沿技术。(编写中)
学习路径
基础准备
- 环境配置:硬件平台介绍与开发环境搭建
- 预备知识:嵌入式开发基础与ESP32编程入门
核心技能培养
-
基础控制
- ESP32 GPIO控制与电机驱动
- 实现小车基本运动控制
-
物联网应用
- WiFi通信与网络服务搭建
- 网页远程控制实现
-
机械控制
- PWM技术与舵机控制
- 机械抓手精准控制
-
计算机视觉
- YOLO模型训练与部署
- 目标检测与位置识别
进阶项目实践
- 边缘智能系统:实现自动网球检测与抓取全流程
- Rust开发实践:使用Rust进行嵌入式开发
- Unikernel探索:移植ArceOS驱动系统
- AI增强:视觉大模型与语音交互应用
技术亮点
- 从硬件驱动到智能算法的完整开发链条
- 物联网与边缘计算的深度融合
- 传统嵌入式开发与现代AI技术的结合
- 多种编程范式与实践(Rust/Unikernel)
适合读者
- 嵌入式开发爱好者
- 物联网应用开发者
- 计算机视觉实践者
- 希望提升完整项目开发能力的学习者
通过本项目的阶梯式实践,您将获得从硬件控制到智能识别算法的全栈开发能力,掌握现代嵌入式智能系统的开发方法。
序章:环境配置与预备知识
目录
- * 硬件平台介绍
- 0.1.1 开发板选型指南
(a)核心硬件架构
(b)外设与接口资源 - 0.1.2 电机驱动模块选型
- 0.1.1 开发板选型指南
- * 开发环境准备
- 0.2.1 运行环境
- 0.2.2 相关库的下载与简要介绍
(a)ESPAsyncWebServer
(b)LedController
(c)ESP32Servo
- 前置知识引导
- 0.3.1 与Arduino开发相关的语法介绍
(a)基础语法架构
(b)相关库中核心函数的介绍 - 0.3.2 PWM基本原理
- 0.3.1 与Arduino开发相关的语法介绍
预期学习成果
- 硬件层面:
了解ESP32相关知识,完成项目所需硬件选购(开发板,小车,抓手,电池) - 开发环境层面:
掌握VSCode下PlatformIO插件的基础使用方法
0.1 硬件平台介绍
ESP32开发板硬件平台详解
ESP32作为一款功能强大的物联网微控制器,凭借其双核处理器、Wi-Fi/蓝牙双模通信和丰富的外设接口,成为智能小车开发的理想选择。本章将全面解析ESP32小车的硬件平台构成,包括开发板选型、电机驱动模块选择和电源系统设计,为后续开发奠定坚实基础。
0.1.1 开发板选型指南
- 一、核心硬件架构
- 1.处理器系统:
双核Xtensa® 32位LX6微处理器架构
支持80MHz至240MHz动态时钟频率调节
448KB ROM用于系统启动和基础功能
520KB SRAM用于程序运行
16KB RTC SRAM用于低功耗模式数据保持 - 2.无线通信能力:
(1)Wi-Fi:
支持802.11 b/g/n协议,2.4GHz频段,最高150Mbps速率
支持A-MPDU和A-MSDU聚合
0.4μs保护间隔优化
(2)蓝牙:
双模支持
经典蓝牙4.2(BR/EDR)
低功耗蓝牙(BLE) - 3.存储配置:
默认集成4MB SPI Flash(可选8MB/16MB版本)
部分型号额外集成2MB PSRAM(ESP32-D0WDR2-V3芯片)
- 1.处理器系统:
- 二、外设与接口资源
- 1.GPIO系统:
(1)共38个物理引脚
(2)26个全功能GPIO
(3)支持多种功能复用(详见后续章节) - 2.通信接口:
4×SPI(支持主/从模式)
2×I²C(支持主/从模式)
3×UART(含1×USB-OTG)
I²S音频接口
CAN 2.0控制器
以太网MAC接口
- 1.GPIO系统:
0.1.2 电机驱动模块选型
- 要点:
- 电压匹配:确保驱动模块支持电池电压
- 电流余量:电机堵转电流应小于驱动峰值电流的80%
- 控制方式:PWM
0.2 开发环境准备
0.2.1 运行环境
基础运行环境可以参考如下网址 使用VSCode+PlatformIO插件搭建开发环境
1.2.2 相关库的下载与介绍
- 一、ESPAsyncWebServer
- ESPAsyncWebServer是PlatformIO环境下ESP32开发中极为重要的异步Web服务器库,它为物联网设备提供了高性能的网络通信能力。
- 1.异步网络架构:
非阻塞式处理:采用事件驱动模型,服务器在处理请求时不会阻塞其他连接,能够同时处理多个客户端请求,显著提高吞吐量;
高效资源利用:在等待I/O操作(如文件读取、传感器数据采集)时,可以继续处理其他任务,减少CPU闲置时间;
实时响应机制:基于回调函数的事件处理方式,确保对客户端请求的快速响应,特别适合实时数据推送场景. - 2.协议支持能力:
支持GET、POST、PUT、DELETE、PATCH、HEAD和OPTIONS等HTTP方法
- 二、LedController
- LEDController库是ESP32平台上用于控制LED和生成PWM信号的重要工具库,本项目中主要使用的是LEDController库中与PWM相关的核心函数(详见后续语法介绍)。
- 三、ESP32Servo
- ESP32Servo库是专为ESP32系列微控制器设计的舵机控制库,它提供了简单易用的接口来控制标准舵机。具体包括基础控制功能,对多个舵机独立管理控制;运动控制功能,控制舵机角度、平滑运动等;状态查询功能,获取当前位置以及PWM通道查询等。
0.3 前置知识引导
与Arduino开发相关的语法介绍
- 一、基础语法架构
void setup() { // 初始化代码,只执行一次}
void loop() { // 主循环代码,重复执行}
Serial.begin(115200); // 初始化串口,波特率115200
Serial.print() // 发送数据到串口
- 二、相关库中核心函数的介绍
- LedController
(1)ledcSetup() - PWM通道初始化double ledcSetup(uint8_t chan, double freq, uint8_t bit_num)
i.功能:配置指定LEDC通道的PWM信号参数
ii.参数:
chan:通道号(0-15,取决于ESP32型号)
freq:PWM频率(Hz)
bit_num:占空比分辨率(1-16位)
返回值:实际设置的频率值
iii.说明:必须先调用此函数初始化通道才能使用其他PWM功能
(2)ledcAttachPin() - 引脚绑定void ledcAttachPin(uint8_t pin, uint8_t chan)
i.功能:将GPIO引脚绑定到指定的PWM通道
ii.参数:
pin:GPIO引脚号
chan:已初始化的PWM通道号
iii.说明:一个通道可绑定多个引脚,实现同步控制
(3)ledcWrite() - 占空比设置void ledcWrite(uint8_t chan, uint32_t duty)
i.功能:设置指定通道的PWM占空比
ii.参数:
chan:PWM通道号
duty:占空比值(范围由分辨率决定)
iii.说明:这是最核心的PWM输出函数,用于实时调整输出强度
- LedController
PWM原理与占空比计算
- PWM基本原理
- 1.核心概念
脉冲信号:由高电平和低电平交替组成的方波信号
周期(T):一个完整PWM波形的时间长度(单位:秒)
频率(f):单位时间内周期数,f=1/T(单位:Hz)
脉宽(高电平时间):一个周期内信号保持高电平的时间
占空比(D):高电平时间与周期的比值,D = (高电平时间/T) × 100% - 2.工作原理
PWM基于面积等效原理:冲量(脉冲面积)相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。
通过改变占空比来调节平均输出电压:
占空比越大 → 平均电压越高
占空比越小 → 平均电压越低
- 1.核心概念
第一章:ESP32小车基本控制
目录
- 硬件介绍
- 1.1.1 ESP32核心引脚
- 1.1.2 ESP32开发板的基本功能
- ESP32使用I/O接口
- 1.2.1 数字I/O的不同工作模式介绍
- ESP32驱动轮子
- 1.3.1 硬件连接
(a)引脚连接参考 - 1.3.1 相关函数的编写
(a)电机控制函数 - 1.3.2 串口连接与烧录
(a)调试方法
(b)常见问题解决
- 1.3.1 硬件连接
- 项目实践:ESP32驱动小车转向
预期学习成果
- 能够依照实例编写出相关控制小车运动的函数
- 小车能够实现前进、后退、转向、刹车、休眠等多种运动效果
硬件介绍
ESP32核心引脚
-
一、电源管理引脚
- 1.VCC:3.3V电源输入端子,为整个芯片提供工作电压
- 2.GND:接地端子,与电源负极相连
- 3.EN:使能控制管脚,高电平激活芯片工作状态,低电平触发重启
-
二、通信接口引脚
- 1.UART接口
TXD/RXD:串行数据发送/接收管脚
RTS/CTS:硬件流控信号线,用于控制传输速率 - 2.I2C接口
SDA/SCL:两线式同步串行总线的数据线和时钟线
- 1.UART接口
-
三、特殊功能引脚
- 1.ADC/DAC引脚
(1)ADC输入:18个12位ADC通道(实际可用6-8个)
ADC1:GPIO1-8(部分不可用)
ADC2:GPIO9-17(使用Wi-Fi时不可用)
(2)DAC输出:GPIO25(DAC1)、GPIO26(DAC2),8位分辨率 - 2.PWM输出
支持16个PWM通道,几乎所有输出引脚都可配置为PWM
- 1.ADC/DAC引脚
ESP32开发板的基本功能
- 一、核心处理能力
- 双核处理器:
(1)搭载Xtensa® LX6双核32位MCU,主频高达240MHz,支持并行任务处理(如一个核心处理无线协议栈,另一个运行用户程序)。
(2)支持硬件浮点运算单元(FPU),适合复杂算法(如语音识别、机器学习)
- 双核处理器:
- 二、无线通信功能
- WiFi连接:
支持802.11 b/g/n协议(2.4GHz),传输速率达150Mbps,提供STA(客户端)、AP(热点)或混合模式
- WiFi连接:
- 三、外设接口
- GPIO与PWM:
最多34个可编程GPIO(部分型号如ESP32-P4达55个),支持输入/输出、中断和PWM控制(如LED调光、舵机驱动)
- GPIO与PWM:
ESP32使用I/O接口
数字I/O的不同工作模式介绍
- 一、基本输入输出模式
- 1.数字输入模式(INPUT)
用于读取外部数字信号状态(高/低电平) - 2.数字输出模式(OUTPUT)
控制引脚输出高/低电平
- 1.数字输入模式(INPUT)
- 二、带内部电阻的输入模式
- 1.上拉输入模式(INPUT_PULLUP)
(1)功能:
启用内部上拉电阻(约45kΩ)的输入模式
(2)特点:
引脚悬空时默认读取为高电平
适合连接接地式开关/按键
可节省外部上拉电阻 - 2.下拉输入模式(INPUT_PULLDOWN)
(1)功能:
启用内部下拉电阻(约45kΩ)的输入模式
(2)特点:
引脚悬空时默认读取为低电平
适合连接接电源式开关/按键
可节省外部下拉电阻
- 1.上拉输入模式(INPUT_PULLUP)
ESP32驱动轮子
硬件的连接
- 引脚连接参考
- 电机1 PWM: GPIO27
电机1 DIR: GPIO13
电机2 PWM: GPIO4
电机2 DIR: GPIO2
电机3 PWM: GPIO17
电机3 DIR: GPIO12
电机4 PWM: GPIO15
电机4 DIR: GPIO14
- 电机1 PWM: GPIO27
相关函数的编写
- 电机控制函数
串口调试与烧录
- 一、调试方法
- PlatformIO提供了方便的串口监视器:
点击底部状态栏"插头"图标
或命令面板输入"PlatformIO: Serial Monitor"
快捷键Ctrl+T Ctrl+X退出监视器 - 可以在代码中添加Serial.println()函数增加调试信息
- PlatformIO提供了方便的串口监视器:
- 二、常见问题解决
- 1.上传失败:
检查USB连接 - 2.库冲突:
去除非必要的库,避免引起冲突 - 3.电机响应异常:
检查电源是否充足
检查PWM频率和分辨率
- 1.上传失败:
项目实践:ESP32驱动小车转向
提示
- 差速转向
- 刹车与休眠的区别
第二章:ESP32小车远程控制
目录
- ESP32使能WiFi
- 2.1.1 ESP32的WiFi板块函数的介绍
- 2.1.2 WiFi板块基本代码架构
- ESP32搭建网络服务
- 2.2.1 网页搭建简单介绍
- 2.2.2 网页搭建基本代码架构
- 网页遥控小车前进
- 2.3.1 控制运动板块与WiFi、网页搭建等板块的结合
- 项目实践:网页控制小车
预期学习成果
- ESP32能够连接WiFi并返回一些内容
- 能够搭建出包含控制小车运动按钮的简单网页
- 网页可以遥控小车实现多种运动效果,包括前进、后退、左转向、右转向、刹车等。
ESP32使能WiFi
ESP32的WiFi板块函数的介绍
- 基础WiFi连接函数
- 1.WiFi初始化与连接
(1)WiFi.begin() - 用于连接到指定的WiFi网络WiFi.begin(ssid, password); // 连接到指定SSID和密码的WiFi网络
(2)WiFi.status() - 返回当前WiFi连接状态wl_status_t status = WiFi.status();
常见返回值:
WL_CONNECTED: 已连接(值为3)
WL_NO_SSID_AVAIL: 未找到指定网络(值为1)
WL_CONNECT_FAILED: 连接失败(值为4)
WL_IDLE_STATUS: WiFi处于空闲状态(值为0)
WL_DISCONNECTED: 未连接(值为6) - 2.网络信息获取
WiFi.localIP() - 获取ESP32在局域网中的IP地址IPAddress ip = WiFi.localIP();
Serial.println(ip); // 打印IP地址如"192.168.1.100"
- 1.WiFi初始化与连接
WiFi板块基本代码架构
- 一、初始化
- 配置模块的工作模式
WiFi.mode(WIFI_STA);
- 配置模块的工作模式
- 二、准备步骤
- 指定需要连接的WiFi
WiFi.begin(ssid, password);
- 指定需要连接的WiFi
- 三、连接WiFi+打印ip地址
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nIP地址: " + WiFi.localIP().toString());
ESP32搭建网络服务
网页搭建简单介绍
- ESP32可以搭建简单的Web服务器,通过浏览器访问ESP32的IP地址即可获取响应
网页搭建基本代码架构
- HTML页面嵌入方式
直接字符串嵌入:适合简单页面const char index_html[]PROGMEM=R"rawliteral(<html><body><h1>ESP32 Control Panel</h1><button onclick="fetch('/led?state=1')">Turn ON</button></body></html>)rawliteral";
网页遥控小车前进
控制运动板块与WiFi、网页搭建等板块的结合
- 使用AsyncWebServer中on函数接收网页相关指令
- 这里使用的是GET请求
server.on("/led", HTTP_GET, [](AsyncWebServerRequest *request){ String state = request->getParam("state")->value(); digitalWrite(LED_PIN, state.toInt()); request->send(200);});
- 通过以下方法对应控制运动相关函数:
request->getParam("state")->value()
项目实践:网页控制小车
提示
- 完善网页中的按钮,使每个运动状态都有所对应
- 根据网页遥控小车前进照猫画虎
第三章:ESP32机械抓手基本控制
目录
- 3.1.1 使用PWM控制舵机的语法基本框架
(a)初始化与绑定通道
(b)编写控制舵机角度函数
(c)对多个电机进行控制,实现对抓手运动状态控制
- 3.2.1 舵机信号脉宽映射与角度控制
(a)舵机控制原理
(b)角度到脉宽的转换公式
预期学习成果
- 能够控制多个舵机转动
- 抓手能呈现抓、放等预计姿态
- 网页端可以遥控抓手进行抓球
ESP32使用PWM
使用PWM控制舵机的语法基本框架
- 一、初始化与绑定通道
- 主要使用函数
ledcSetup(PWM_CHANNEL, PWM_FREQ, PWM_RESOLUTION);
ledcAttachPin(SERVO_PIN, PWM_CHANNEL);
- 主要使用函数
- 二、编写控制舵机角度函数
- 利用角度、脉宽、分辨率之间的关系编写
- 使用
ledcWrite(PWM_CHANNEL, duty);
进行输出
- 三、对多个电机进行控制,实现对抓手运动状态控制
- 利用switch结构改写上述角度函数
- 根据舵机实际情况,编写能实现抓手初始状态、抓物状态、缩回状态、释放状态等的各种函数
ESP32驱动舵机
舵机信号脉宽映射与角度控制
- 一、舵机控制原理
以下是所使用舵机的PWM脉宽范围
- 二、角度、分辨率、脉宽的转换公式
- 1.分辨率与脉宽的转换公式:
duty = (pulseWidth / 20000) × (2^duty_max - 1)
例如,分辨率为16位,0.5ms脉冲宽度对应的duty值即为(500/20000)×65535=1638 - 2.角度和脉宽的转换公式:
angle = (pulseWidth_us - 500) × (180 / (2500 - 500))
- 由上述两个公式即可推导出角度和分辨率之间的关系
项目实践:ESP32抓取网球
提示
- 根据实际抓手各部分组装方式调整舵机角度
- 在角度函数中增加while循环和delay()控制抓手速度