项目想要实现功能,硬件采集→ 网络传输→ 软件交互远程视觉系统。

方案一:ESP8266+STM32+OV2640实现图片传输

1 模块介绍

1.1 ATK-ESP8266

是正点原子团队推出的一款高性能的 UART-WiFi(串口-无线)模块,采用串口与 MCU(或其他串口设备)通信,内置TCP/IP 协议栈,能够实现串口与 WIFI 之间的转换。通过 ATK-ESP8266 模块,传统的串口设备只是需要简单的串口配置,即可通过网络(WIFI)传输自己的数据。

ATK-MW8266D 模块出厂默认为 AT 指令状态,可通过 UART 与模块进行通讯,支持三种工作模式,分别为:STA、AP、STA+AP。

STA 模式

  在此模式下,ATK-MW8266D 模块可连接其他设备提供的无线网络,例如通过 WIFI 连接至路由器,从而可以访问互联网,进而实现手机或电脑通过互联网实现对设备的远程控制。

AP 模式

  AP 模式为默认的模式,在此模式下,ATK-MW8266D 模块将作为热点供其他设备连接,从而让手机或电脑直接与模块进行通讯,实现局域网的无线控制。

注意:如果电脑连接模块 AP热点,这样电脑就不能上网,因此在使用电脑端和模块进行网络通信时,一般情况下都是使用STA 模式。也就是电脑和设备同时连接到相同网段的路由器上。

STA+AP 模式

  该模式为 STA 模式与 AP 模式共存的一种模式,ATK-MW8266D 模块既能连接至其他设备提供的无线网络,又能作为热点,供其他设备连接,以实现广域网与局域网的无缝切换,方便操作使用。

透传模式

当模块处于 UDP 连接 或 TCP 客户端模式时:

  1. 进入透传模式:
    通过特定 AT 指令(如 AT+CIPMODE=1)激活此模式。

  2. 数据透明转发:

    • 模块将 完全原样转发数据,不添加任何额外协议头或校验信息。

    • 网络端(TCP服务器/UDP终端)发送的数据 → 直接通过 UART 输出给连接的设备(如单片机)。

    • UART 接收的数据 → 直接转发给网络端设备。

注意:前后两种协议,连接网络数据与串口数据,此时可以理解为数据传输的转换媒介。

除了上述的三种工作模式外,ATK-MW8266D 模块在进行 UDP 连接或作为 TCP 客户端连接时,能够进入透传模式,进入透传模式后,ATK-MW8266D 将会原封不动地把从 TCP服务器或其他 UDP 终端接收到的消息,通过 UART 发送至与之连接的设备。

详细配置与使用,例程可参考正点原子官方资料。

1.2 OV2640

也是正点原子的摄像头模块,正点原子摄像头模块有很多种,可根据需要选择,官方有提供学习资料和例程。作为对学习stm32F103开发板的总结记录,这里做简要介绍。

1.2.1 OV7725模块

(1)简介

正点原子OV7725模块是一款高性能80W像素高清摄像头模块。硬件模块:

  • 镜头,图像传感器
  • 板载电路:集成有源晶振,无需外部提供时钟
  • FIFO缓存 AL422B:

为什么OV7725需要FIFO(AL422B)?
① OV7725的fpclk最高可述24MHz,F103直接抓取非常耗CPU
②)F103主频低,且没有DCMI外设因成本问题有的不扩展SRAM

另外后面有具体应用说明。

(2)模块特点
支持各种尺寸输出,多种格式输出
自动图像控制功能,支持图像质量控制,支持图像设置
如,曝光(EC)、白平衡(WB)、消除灯光条纹、黑电平校准(BLC)和带通)色饱和度调节、色调调节、图像缩放、平移和窗口设置等。

有特定配置要求可以查看手册《OV2640 Software Application Notes1.03.pdf》,针对不同配置需求,提供了配置参数,结合《OV2640-DATASHEET》寄存器说明理解含义。

比如,下面第一张图是OV2640 Software Application Notes1.03.pdf里的,根据不同需要选择往功能寄存器写入数据。

第二张图,OV2640-DATASHEET里截图,在Register Set中,表头:寄存器地址,寄存器名称,默认值(16进制表示),寄存器功能描述。如,0xDA寄存器,lmage Output Format Select,控制图像格式。

最后,建议使用正点原子开发的库函数,已经把寄存器配置,相关操作封装,方便易学。

相反的,配置寄存器,配置不同分辨率输出时,
配置分辨率相关REG:0x12(COM7)、0x17(HSTART)、0x18(HSIZE)、0x19(VSTRT)、0x1A(VSIZE)、0x32(HREF)、0x29(HoutSize)、0x2C(vOutSize)、0x2A(EXHCH)

(3)SCCB通信协议
摄像头的配置参数是通过SCCB总线来实现,跟IC总线协议极其相似。

  • SCCB(Serial Camera Control Bus) 串行摄像头控制总线,由两根线组成:SIO_C和SIOD。SCCB(Serial Camera Control Bus)SIO_C(OV_SCL)用于传输时钟信号;:SIO D(OV_SDA)用于传输数据信号。
  • SCCB传输时序

      类似于I2C协议,根据时序图编写写操作函数,读操作函数。

      可参考正点原子提供的库函数。资料下载链接:openedv.com/posts/list/0/41696.htm

(4)ATK OV7725模块时序图介绍

因为LCD 数据格式为 RGB565,正点原子文档里以 OV7725 输出 RGB565 模式分析的时序

从上图可看出,程序中我们就可以根据 VSYNC 上升沿来判断一帧图像数据传输完成。

从上图可看出,OV7725 的图像数据通过 D[9:2]输出一个字节,八位数据输出,低两位不用,可通过寄存器配置。first byte 和 second byte组成一个 16 位 RGB565 数据。时序上,HREF 为高时开始传输一行数据,1个PCLK 传输1个字节,传输完一行数据最后一个字节(1astbyte)后 HREF 则变为低。

据此,可以得出图像数据存储和读取逻辑。

摄像头模块存储图像数据的过程为:等待OV7725同步信号>FIFO写指针复位>FIFO 写使能→等待第二个OV7725帧同步信号→FIFO写禁止。通过以上5个步骤,我们就可以完成1帧图像数据在AL422B的存储。

读取图像数据过程为:FIFO读指针复位→给 FIFO 读时钟(FIFO RCLK)→读取第一个像素高字节→给 FIFO 读时钟→读取第一个像素低字节→给 FIFO读时钟→读取第二个像素高字节→循环读取剩余像素→结束。

说明:(具体可参考ATK-OV7725摄像头模块用户手册),OV7725的像素时钟(PCLK)最高可达24Mhz,用STM32F103的IO口直接抓取,是非常困难的,也十分占耗 CPU。所以,我们并不是采取直接抓取来自 OV7725 的数据,通过 FIFO 读取,ALIENTEK OV7725 摄像头模块自带了一个FIFO芯片(AL422B),用于暂存图像数据,有了这个芯片,我们就可以很方便的获取图像数据了,而不再需要单片机具有高速IO,也不会耗费多少 CPU,可以说,只要是个单片机,都可以通过ALIENTEK OV7725 摄像头模块实现拍照的功能。

1.2.2 OV2640和OV5640

(1)简介

OV2640 200W像素  UXGA(632*1232)图像传感器

OV5640 500W像素 OSXGA(2592*1944)图像传感器

(2)模块特点
支持各种尺寸输出,支持多种格式输出,自动图像控制功能
支持图像质量控制,支持图像设置,支持多种输出接口

(3)模块时序图可查看官方提供手册

(4)DCMl

与OV7725不同的是,2640和5640没有FIFO,但是有DCMI。

Digital camera interface,数字摄像头接口,是一个同步并行接口,能接收外部8位人10位、12位或14位CMOS摄像头模块发出的速数据流。

支持数据格式:YCbCr4:2:2/RGB565逐行视频和压缩数据JPEG
支持高速数据流:可达54 MB/S

1.2.3 选型

(1)图像格式

YUV格式和JPEG格式是图像数据常用的编码格式。YUV格式适合于进行视频处理和显示,而JPEG格式则更适用于图像存储。

在配置这些输出格式时,需要通过寄存器设置来指定输出的分辨率、质量等级以及其他参数。正确配置后,可以得到符合预期的图像数据输出,进而进行图像的显示或存储处理。如果需要将图像数据传输到其他设备或存储,可能需要将YUV422数据编码为JPEG格式。JPEG编码较为复杂,涉及离散余弦变换(DCT)、量化、哈夫曼编码等多个步骤。STM32平台上,这通常依赖于外部库,如libjpeg。

(2)由于博主正在学习stm32F103,想通过它完成远距离无线图传项目,需要选择合适各个摄像头模块,可将图像数据实时发送到串口,正点原子例程有提供将图像数据发送到上位机串口,并通过软件串口摄像头解析显示数据,以此类推,那如果配置stm32发送串口数据到无线模块,无线传输模块透传模式发送,服务器接收转发,那么图像数据就可以远程传输。并且在CSDN上有其他博主实现过,只不过用的是F4系列,相关链接:ESP8266+STM32F407+OV7670实现图片传输_sdio传输摄像头图像-CSDN博客

博主觉着方案是可行的,理解了原理稍作改动就可以了,但是学习了前置知识后发现,现实很残酷😭😭,并没有合适的。原因如下,

第一,如上文可发现,OV2640和OV5640都有DCMI,而F1没有DCMI外设,那么影响就是

  • F4/H7 系列:内置 DCMI(Digital Camera Interface) 硬件接口

    • 支持硬件级图像数据采集(类似 DMA),自动将摄像头数据存入内存,CPU 几乎不干预。

    • 可轻松实现 JPEG 压缩、实时传输到串口/网络。

  • F1 系列:无 DCMI 接口,仅能通过 GPIO 模拟时序读取数据。参考上文时序图介绍。 

第二,那么OV7725是否可以?毕竟它有FIFO缓存,可以对速率要求不那么高。

  • OV7725(带 FIFO):

    • FIFO 仅解决 数据暂存问题(避免因读取慢导致帧撕裂)。

    • 但 FIFO 不提供协议处理能力(JPEG 编码),这个是重点

    • 正点原子摄像头例程里只提供了LCD 显示,而串口图像数据发送例程只有F4 H7系列的,现在博主知道为啥子了,因为2640和5640都有DCMI,F1都用不了,F1自然没有发送到串口例程,而7725因为它不能输出JPEG压缩,但它可以LCD显示:本质:
      将像素数据直接写入显存,无需压缩或封包,F1 的 GPIO 轮询速度勉强满足(30fps 以下)。

    • 传输到上位机的难点:
      需额外完成 JPEG 压缩 + 协议封装 ,这对 F1 是几乎不可能的任务(除非分辨率降至极低或帧率<1fps)。

 以上仅代表博主个人思考观点。综上,要实现方案一:ESP8266+STM32+OV2640实现图片传输,需要用到STM32F4/H7系列。

方案二:usb摄像头+树莓派+4G联网模块

采用成熟的产品,只需要几个命令行就能解决问题。在树莓派安装系统,配置开发环境(安装依赖和执行命令)就可以获得局域网视频,再内网穿透,理论上外网访问没问题,博主没有验证,可以参考博客:用树莓派搭建远程实时画面传输_树莓派远程视频传输-CSDN博客

但是树莓派集成度很高,相当于一个“小电脑”,体积也很大,不适合集成到项目应用中。

方案三:ESP32-CAM ——硬件设计:专为视觉物联网而生

目前最经济高效、最易开发的远程视频监控解决方案

3.1高度集成

3.1.1 硬件组成

模块 功能 传统方案对比
ESP32 双核 MCU 240MHz 主频 + 520KB SRAM 替代 STM32F4 + 外设
OV2640 摄像头 200万像素 + 硬件 JPEG 编码器 省去外部摄像头模块
Wi-Fi/蓝牙 802.11b/g/n + BLE 4.2 省去 ESP8266 等无线模块
MicroSD 卡槽 本地存储录像/图片 无需外接存储电路

3.1.2 为什么 ESP32 是更好的选择?(对比 STM32+ESP8266)

痛点 STM32+ESP8266 方案 ESP32-CAM 方案
图像采集 需额外摄像头模块 + 复杂接线(DCMI/GPIO) 板载摄像头模组,直接调用
图像压缩 F1 无法压缩,F4 软件压缩耗 CPU 硬件 JPEG 编码(自动压缩图像 10~20 倍)
网络传输 ESP8266 需透传模式,STM32 需管理双串口 单芯片 Wi-Fi 直接上传(省去主控 MCU)
开发资源 正点原子例程偏基础,网络传输需自研 Arduino/IDF 库丰富,GitHub 大量开源项目
4G 支持 需外接 4G 模块(如 SIM800L),接线复杂 直接插 4G 模块(如 Air724)或 Wi-Fi 联网

注意:虽然ESP32是wifi模块,但是可以直插4G模块。也就是说,ESP32可以当作4G模块将视频流图片数据推送到远端服务器,服务器中转流式传输,用户端接收流式视频。

也或者说另一种实现方案,WiFi模块可以实现,但是局域网需要内网穿透,但是需要电脑运行内网穿透客户端,然后把某一端口和公网服务器端口连接,转发视频流,可esp32使用80端口启动一个web服务,使用81端口传输视频流,而不是电脑,那么把esp32和电脑端口连接后,能不能实现数据流再转发,需要下一步实操验证。

参考案例:局域网连接--ESP32链接WIFI(详细资料查看:B站视频:Python+ESP32 快速上手 https://www.bilibili.com/video/BV1G34y1E7tE/?p=4&share_source=copy_web&vd_source=d34b06886628266c6f6e746ecf34d239)

1.ESP32链接路由器

官方的示例(ESP32运行Python--IDE:Thonny(类似Pycharm这个也是个IDE它对ESP32支持更好 所以选择它))

import network

wlan = network.WLAN(network.STA_IF) # create station interface
wlan.active(True)       # activate the interface
wlan.scan()             # scan for access points
wlan.isconnected()      # check if the station is connected to an AP
wlan.connect('essid', 'password') # connect to an AP
wlan.config('mac')      # get the interface's MAC address
wlan.ifconfig()         # get the interface's IP/netmask/gw/DNS addresses

IDE界面 

2.测试

wlan .ifconfig()获得ip后,使用网络功能试验,即测试一下是否成功连接上。

大体架构,网络调试助手,ESP32都连接路由器,有网络功能,在电脑上运行网络调试助手,运行具有udp功能界面程序,在esp32 写一个测试程序,发数据给电脑,window能收到,说明32发送数据没问题,即当前esp32网络功能没有问题--电脑上软件收到来自设备上的数据了。

当前esp32成功连接到同一个局域网下,拥有网络功能。

网络调试助手下载地址:

https://doc.itprojects.cn/A0001.micropython.esp32/02.download/05.software/NetAssist5.0.8.zip

from socket import *

# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 准备接收方的地址
dest_addr = ('192.168.31.56', 8080)

# 3. 从键盘获取数据
send_data = "hello world"

# 4. 发送数据到指定的电脑上
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

# 5. 关闭套接字
udp_socket.close()

3.2 开发效率高度提升

3.2.1免硬件驱动开发

  • 传统 STM32 方案:

    需编写 DCMI 初始化、DMA 配置、JPEG 软件压缩等数百行代码
  • ESP32-CAM(Arduino 平台):

    #include <esp_camera.h>  // 官方库已封装所有底层

3.2.2  网络协议栈开箱即用

功能 代码示例(对比 STM32)
Wi-Fi 连接 WiFi.begin("SSID","PASS");
TCP 传输 client.connect("ip", port);
HTTP 上传 http.POST(jpeg_data, len);
MQTT 通信 mqtt.publish("topic", image);

3.2.3  生态支持碾压级优势

  • GitHub 项目数量:

    • STM32 camera:约 1,200 个

    • ESP32-CAM:超过 18,000 个

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐