开始前适用开发板:ESP32-S3 Korvo · 开发框架:ESP-IDF
适用开发板:Korvo S3 · 工程
04.advanced.usb_camera_display· targetesp32s3
前置:摄像头 LVGL 显示
学习时长:约 25 分钟 · 难度:★★★☆☆
Korvo 独有
学习目标
完成本节后,你将能够:
- 理解 USB UVC(USB Video Class)协议的基本概念
- 掌握 USB Host 模式下枚举和操作 UVC 摄像头的流程
- 了解外接 USB 摄像头 → MJPEG → 软解码 → LVGL 显示的完整链路
- 对比 DVP 板载摄像头与 USB UVC 外接摄像头的差异
1. 这个例子在干嘛
接入 外部 USB UVC 摄像头(如常见的 USB 免驱摄像头),通过 USB Host 获取 MJPEG 帧 → 软件 JPEG 解码为 RGB565 → 在 LVGL 画布上实时显示。
生活类比:电脑上免驱即插即用的 USB 摄像头——ESP32 也能当 USB 主机读取它的画面。
┌─────────────┐ USB UVC ┌──────────┐ 软解码 ┌───────────┐
│ USB 摄像头 │────────────→│ ESP32-S3 │───────────→│ LVGL 画布 │
│ (外接) │ MJPEG 帧 │ USB Host │ RGB565 │ SPI LCD │
│ 免驱 UVC │ │ 模式 │ │ 240×280 │
└─────────────┘ └──────────┘ └───────────┘
DVP 板载 vs USB UVC 外接
| 对比 | DVP 板载摄像头 | USB UVC 外接摄像头 |
|---|---|---|
| 接口 | 并行数据线(FPC 排线) | USB |
| 固定 | 焊在板上 | 即插即用,可更换 |
| 种类 | OV2640/OV5640 | 任意 UVC 兼容摄像头 |
| ESP32 角色 | 直接驱动 | USB Host 主机 |
| 灵活性 | 低(固定型号) | 高(可选任意 USB 摄像头) |
| 供电 | 板载供电 | 需 USB 5V 供电 |
2. 编译烧录
cd Korvo_Firmware\04.advanced.usb_camera_display
idf.py set-target esp32s3
idf.py build flash monitor
3. 使用步骤
- USB 口接入 UVC 摄像头
- 烧录后等待枚举(串口提示
UVC device found) - 协商分辨率和格式(MJPEG)
- 屏幕开始显示摄像头画面
4. 运行现象
| 阶段 | 屏幕 | 串口 |
|---|---|---|
| 启动 | 等待 USB 设备 | USB Host init |
| 枚举 | — | UVC device found, VID=XXXX PID=XXXX |
| 协商 | — | Negotiate: 320x240 MJPEG |
| 推流 | 摄像头画面显示 | Frame received: N bytes |
| 拔出 | 画面冻结 | Device disconnected |
5. UVC 协议简介
USB Host(ESP32-S3)
│
├── 枚举阶段
│ ├── GET_DESCRIPTOR → 设备描述符
│ ├── GET_DESCRIPTOR → 配置描述符(含 UVC 接口)
│ └── VS_PROBE_CONTROL → 协商分辨率/帧率/格式
│
└── 推流阶段
├── SET_INTERFACE → 切到 isochronous 传输
└── 循环接收 → 拼帧 → MJPEG 完整帧 → JPEG 解码
6. 常见问题与排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 枚举失败 | 摄像头不支持 UVC | 换一个免驱摄像头 |
| 枚举失败 | USB 供电不足 | 部分摄像头功耗大,需外部供电 |
| 无画面 | 不支持 MJPEG 格式 | 确认摄像头支持 MJPEG(不仅是 YUV) |
| 画面卡 | 软解码速度有限 | 降低分辨率(160×120 或 320×240) |
| 画面变色 | JPEG 色彩空间不匹配 | 检查 RGB565 转换 |
| 热插拔崩溃 | USB Host 状态机 | 优雅处理断开事件 |
7. 动手改造建议
- USB 摄像头 + Web 图传:接收 USB 帧 → Wi-Fi HTTP MJPEG 推流
- USB 摄像头 + 人脸识别:解码后送入 ESP-DL 模型
- 多摄像头切换:DVP 板载 + USB 外接,UI 切换源
- 录像功能:USB 帧 → 直接写入 AVI(已经是 JPEG 帧)
8. 知识延伸
- USB Host vs Device:正常板子是 USB Device(被电脑读),本例 ESP32 是 USB Host(读取摄像头)
- UVC 是标准协议:USB Video Class 是操作系统免驱支持的标准,ESP32 实现了精简版
- Isochronous 传输:USB 四种传输类型之一,适合实时音视频(不重传,保时序)
- MJPEG vs H.264:USB 摄像头通常支持 MJPEG(简单)和 YUV(原始),高端的支持 H.264
9. 下一步
| 方向 | 推荐例程 | 说明 |
|---|---|---|
| DVP 摄像头 | Camera LVGL | 板载摄像头 |
| Web 图传 | Camera Webserver | MJPEG 推流 |
| 颜色追踪 | Color Tracking | 视觉应用 |
酷世DIY · Kevincoooool