前言

目录

项目简介

本实践指南将带领您从零开始构建一个基于ESP32的智能网球捡拾小车系统。通过本项目的完整学习路径,您将掌握嵌入式开发、物联网通信、计算机视觉和智能控制等多项前沿技术。(编写中)

学习路径

基础准备

  • 环境配置:硬件平台介绍与开发环境搭建
  • 预备知识:嵌入式开发基础与ESP32编程入门

核心技能培养

  1. 基础控制

    • ESP32 GPIO控制与电机驱动
    • 实现小车基本运动控制
  2. 物联网应用

    • WiFi通信与网络服务搭建
    • 网页远程控制实现
  3. 机械控制

    • PWM技术与舵机控制
    • 机械抓手精准控制
  4. 计算机视觉

    • YOLO模型训练与部署
    • 目标检测与位置识别

进阶项目实践

  • 边缘智能系统:实现自动网球检测与抓取全流程
  • Rust开发实践:使用Rust进行嵌入式开发
  • Unikernel探索:移植ArceOS驱动系统
  • AI增强:视觉大模型与语音交互应用

技术亮点

  • 从硬件驱动到智能算法的完整开发链条
  • 物联网与边缘计算的深度融合
  • 传统嵌入式开发与现代AI技术的结合
  • 多种编程范式与实践(Rust/Unikernel)

适合读者

  • 嵌入式开发爱好者
  • 物联网应用开发者
  • 计算机视觉实践者
  • 希望提升完整项目开发能力的学习者

通过本项目的阶梯式实践,您将获得从硬件控制到智能识别算法的全栈开发能力,掌握现代嵌入式智能系统的开发方法。

序章:环境配置与预备知识

目录

  • * 硬件平台介绍
    • 0.1.1 开发板选型指南
      (a)核心硬件架构
      (b)外设与接口资源
    • 0.1.2 电机驱动模块选型
  • * 开发环境准备
    • 0.2.1 运行环境
    • 0.2.2 相关库的下载与简要介绍
      (a)ESPAsyncWebServer
      (b)LedController
      (c)ESP32Servo
  • 前置知识引导
    • 0.3.1 与Arduino开发相关的语法介绍
      (a)基础语法架构
      (b)相关库中核心函数的介绍
    • 0.3.2 PWM基本原理

预期学习成果

  • 硬件层面:
    了解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.GPIO系统​​:
      (1)共38个物理引脚
      (2)26个全功能GPIO
      (3)支持多种功能复用(详见后续章节)
    • 2.通信接口:
      4×SPI(支持主/从模式)
      2×I²C(支持主/从模式)
      3×UART(含1×USB-OTG)
      I²S音频接口
      CAN 2.0控制器
      以太网MAC接口

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输出函数,用于实时调整输出强度

PWM原理与占空比计算

  • PWM基本原理
    • 1.核心概念
      脉冲信号​​:由高电平和低电平交替组成的方波信号 ​​
      周期(T)​:一个完整PWM波形的时间长度(单位:秒) ​​
      频率(f)​​:单位时间内周期数,f=1/T(单位:Hz) ​​
      脉宽(高电平时间)​​:一个周期内信号保持高电平的时间 ​​
      占空比(D):高电平时间与周期的比值,D = (高电平时间/T) × 100%
    • 2.工作原理
      PWM基于​​面积等效原理​​:冲量(脉冲面积)相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。
      通过改变占空比来调节平均输出电压:
      占空比越大 → 平均电压越高
      占空比越小 → 平均电压越低

第一章:ESP32小车基本控制

目录

预期学习成果

  • 能够依照实例编写出相关控制小车运动的函数
  • 小车能够实现前进、后退、转向、刹车、休眠等多种运动效果

硬件介绍

ESP32核心引脚

  • 一、电源管理引脚

    • 1.VCC​​:3.3V电源输入端子,为整个芯片提供工作电压
    • 2.​GND​​:接地端子,与电源负极相连
    • ​3.​EN​​:使能控制管脚,高电平激活芯片工作状态,低电平触发重启
  • 二、通信接口引脚

    • 1.UART接口
      TXD/RXD​​:串行数据发送/接收管脚 ​
      ​RTS/CTS​​:硬件流控信号线,用于控制传输速率
    • 2.I2C接口
      SDA/SCL​​:两线式同步串行总线的数据线和时钟线
  • 三、特殊功能引脚

    • 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

ESP32开发板的基本功能

  • 一、核心处理能力
    • 双核处理器:
      (1)搭载Xtensa® LX6双核32位MCU,主频高达240MHz,支持并行任务处理(如一个核心处理无线协议栈,另一个运行用户程序)。
      (2)支持硬件浮点运算单元(FPU),适合复杂算法(如语音识别、机器学习)
  • 二、无线通信功能
    • WiFi连接:
      支持802.11 b/g/n协议(2.4GHz),传输速率达150Mbps,提供STA(客户端)、AP(热点)或混合模式
  • 三、外设接口
    • GPIO与PWM:
      最多34个可编程GPIO(部分型号如ESP32-P4达55个),支持输入/输出、中断和PWM控制(如LED调光、舵机驱动)

ESP32使用I/O接口

数字I/O的不同工作模式介绍

  • 一、基本输入输出模式
    • 1.数字输入模式(INPUT)
      用于读取外部数字信号状态(高/低电平)
    • 2.数字输出模式(OUTPUT)
      控制引脚输出高/低电平
  • 二、带内部电阻的输入模式
    • 1.上拉输入模式(INPUT_PULLUP)
      (1)功能
      启用内部上拉电阻(约45kΩ)的输入模式
      (2)特点
      引脚悬空时默认读取为高电平
      适合连接接地式开关/按键
      可节省外部上拉电阻
    • 2.下拉输入模式(INPUT_PULLDOWN)
      (1)功能​​:
      启用内部下拉电阻(约45kΩ)的输入模式
      (2)特点​​:
      引脚悬空时默认读取为低电平
      适合连接接电源式开关/按键
      可节省外部下拉电阻

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

相关函数的编写

  • 电机控制函数

串口调试与烧录

  • 一、调试方法
    • PlatformIO提供了方便的串口监视器:
      点击底部状态栏"插头"图标
      或命令面板输入"PlatformIO: Serial Monitor"
      快捷键Ctrl+T Ctrl+X退出监视器
    • 可以在代码中添加Serial.println()函数增加调试信息
  • 二、常见问题解决
    • 1.上传失败:
      检查USB连接
    • 2.库冲突:
      去除非必要的库,避免引起冲突
    • 3.电机响应异常
      检查电源是否充足
      检查PWM频率和分辨率

项目实践:ESP32驱动小车转向

提示

  • 差速转向
  • 刹车与休眠的区别

第二章:ESP32小车远程控制

目录

预期学习成果

  • 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"

WiFi板块基本代码架构

  • 一、初始化
    • 配置模块的工作模式
      WiFi.mode(WIFI_STA);
  • 二、准备步骤
    • 指定需要连接的WiFi
      WiFi.begin(ssid, password);
  • 三、连接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脉宽范围 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()控制抓手速度

第四章:YOLO模型训练及识别

网球识别

ESP32小车识别

项目实践:网球和ESP32小车位置识别

第五章:项目实践-边缘智能目标检测

里程碑1:根据YOLO结果返回控制小车指令

里程碑2:根据小车指令转向瞄准网球

里程碑3:根据小车指令靠近网球

里程碑4:根据小车指令抓取网球

第六章:项目实践-使用Rust库开发ESP32小车

第七章:项目实践-移植ArceOS Unikernel驱动小车

第八章:项目实践-基于视觉大模型捡网球

第九章:项目实践-通过语音交互实现捡万物

第十章:项目实践-通过语音交互实现分类存放