
一块钱的单片机挑战——基于STM32F103C6T6的USB相机
简介
基于STM32F103C6T6的USB相机,本项目电路使用嘉立创 EDA 设计、嵌入式程序使用VSCode 和PlatformIO环境开发。所有资料开源。
简介:基于STM32F103C6T6的USB相机,本项目电路使用嘉立创 EDA 设计、嵌入式程序使用VSCode 和PlatformIO环境开发。所有资料开源。开源协议
:MIT License
描述
在淘宝上能买到最便宜的 STM32F103芯片就是 C6T6系列。
虽然市面上有很多 STM32单片机做的摄像头采集项目,但是基本上都使用了 AL422B 的 FIFO 芯片。这样成本一下就上涨5、6块。本项目尝试 STM32F103芯片直接采集30万 DVP 摄像头芯片的数据,并通过USB 传输到上位机。STM32F103集成了一个USB2.0全速接口,它的通讯速度实测800KB/秒左右。
本项目 CMOS 使用来自比亚迪的 PLCC 封装的 BF3003。分辨率640x480。灵敏度高达10V/Lux-sec ,夜视效果还不错。一帧RAW 格式的数据大小是300KB,理论上每秒可以传2帧图像到上位机。以下简单介绍实现方案。
芯片介绍
STM32F103C6是主流增强型ARM Cortex-M3 MCU,具有32 KB Flash、72 MHz CPU。芯片上提供2个12位ADC、3个16位通用定时器加1个PWM定时器以及标准和高级通信接口:2个I2C和SPI、3个USART、1个USB和1个CAN。
系统介绍
由于这个系列没有用于采集 DVP 摄像头数据的DCMI 接口,我们需要通过 IO 模拟 DVP 采集过程。IO 模拟的采集效率远低于DCMI 。为了保证采集一帧完整的图像数据,摄像头的外部晶振需要降低到2-300KHz,甚至更低。
TYPE-C USB座,正面连接STM32的USB,反面连接 CH340用于烧写/调试程序
BF3003 内置 LDO,供电相对简单只需要3.3V
最终硬件
SCCB协议
SCCB(Serial Camera Control Bus,串行摄像头控制总线)是由OV(OmniVision的简称)公司定义和发展的三线式串行总线,该总线控制着摄像头大部分的功能,包括图像数据格式、分辨率以及图像处理参数等。
现在SCCB总线大多采用两线式接口总线。OV7725使用的是两线式接口总线,该接口总线包括SIO_C串行时钟输入线和SIO_D串行双向数据线,分别相当于I2C协议的SCL信号线和SDA信号线。SIO_C的最小时间为10us,即最大频率为100K。一般来说,100K-400K之间都可以。SCCB就是改编版的I2C,完全可以按照I2C来理解。
MCU启动后通过SCCB 配置好摄像头参数,就可以按照CMOS时序进行图像采集。
DVP采集
- 配置 XCLK 为PWM输出
- 配置 HREF、VSYNC和 PIXCLK 为中断输入
- 在PIXCLK中断内采集 GPIOB 高8位。
- 在HREF中断内开启 DMA 的 M2M 拷贝可以稍微加快速度
USB通讯
USB 设备如果配置成 UVC 设备,就需要按照 UVC 协议实现。现在我们把它配置成自定义设备,这样可以完全自由定义数据包的内容。STM32F103开启 USB 必须使用外部晶振。USB 时钟频率通过分频配置48MHz。
端点配置
一共开启三个端点,端点0用于枚举,端点1用于向上位机传输图像数据,端点2用于接收上位机指令。
WinUSB
为了让 Windows 系统识别自定义 USB 设备,我们需要配置 WinUSB标识。同时在 USB插上 Windows 系统后,通过Zadig安装驱动。
USB端点使用双缓冲
使用双缓冲能提高 USB 通讯速度,本项目开启后没有提高帧率。
MCU替换
在国内有很多厂家推出了可替换STM32F103的MCU,我们尝试过以下几种:CH32F103C8T6、CH32F203、CH32V203、AIR32F103。微调代码后,没想到主频最低的CH32F103C8T6反而表现最好。
桌面应用
libusb 是一个用C语言开发的跨平台的USB设备访问接口库。使用它,不需要知道操作系统的细节,也不需要底层驱动,只须对USB有足够的了解,所有的工作都可以在用户端完成。
在Node.js的世界里,与USB设备通信并不是一件简单的事情。然而,有了node-usb这个库,我们可以轻松地实现这一目标。node-usb是一个基于libusb的Node.js模块,它提供了与USB设备通信的API,使得在Node.js环境中操作USB设备变得简单而高效。遗憾的是node-usb目前还没有实现isochronous传输。
其它应用
虽然这个 USB 摄像头帧率很低,作为一个简单的延时摄影的相机也是足够的。利用它的低照度性能,我们还可以把它作为导星摄像头应用到天文摄影中,甚至可以实现长时间曝光用它来拍摄深空天体。
如果把采集480行数据减少到10行甚至更少,我们就可以得到一个帧率达到20FPS的线性摄像头。后续有机会我们将尝试做一个基于F103的摄像头巡线小车。
本项目电路使用嘉立创 EDA 设计、嵌入式程序使用VSCode 和PlatformIO环境开发。所有资料完全开源。代码: https://github.com/xeecos/STM32-USB-Cam
欢迎关注我的微信公众号:有画科技
设计图
BOM
ID | Name | Designator | Footprint | Quantity |
---|---|---|---|---|
1 | 0.1u | C2,C3,C4,C7 | C0402 | 4 |
2 | HDR-M-2.54_1x4 | J1,J2 | HDR-M-2.54_1X4 | 2 |
3 | LED-0402_R | LED1,LED2 | LED0402-RD | 2 |
4 | 0 | R7 | R0402 | 1 |
5 | 1k | R13,R14,R21 | R0402 | 3 |

评论