1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
第二十七章 摄像头实验
本章,我们将介绍ESP32-S3如何驱动摄像头,并在LCD上显示摄像头图像。
本章分为如下几个小节:
27.1摄像头模块
27.2 硬件设计
27.3 程序设计
27.4 下载验证
27.1摄像头模块
摄像头模块也是以C模块的形式编写而来的。由于MicroPython库并未包含驱动ESP32-S3摄像头的应用,因此若想在MicroPython环境下实现摄像头功能,必须以C模块的形式添加摄像头驱动。可在Github仓库中找到摄像头驱动,该仓库的链接是:https://github.com/lemariva/micropython-camera-driver。
CAMERA驱动程序(modcamera.c/.h)可以在以下路径中找到:A盘6,软件资料1,软件2,MicroPython开发工具01-Windows2,正点原子MicroPython驱动CModules_Lib CAMERA。作者对该模块的函数和使用进行了详细解释。如果读者不了解这个程序的编写流程,请重新阅读第七章的内容。
1,CAMERA模块构造方法
CAMERA模块的构造方法如下:
- class camera.init(id,d0,d1,d2,d3,d4,d5,d6,d7,format,framesize,
- xclk_freq,href,vsync,reset,sioc,siod,xclk,pclk,fb_location)
- 使用示例:camera.init(0, format = camera.RGB565,fb_location = camera.PSRAM,
- framesize = camera.FRAME_240X240,xclk_freq = 24000000)
复制代码 该构造方法的参数描述,如下表所示。
表27.1.1 camera.init构造方法参数描述
返回值:无。
2,CAMERA模块的方法
①:图像上下翻
②:图像左右翻
③:设置输出图像大小
- camera.framesize(camera.FRAME_240x240)
- # The options are the following:
- # FRAME_96X96 FRAME_QQVGA FRAME_QCIF FRAME_HQVGA FRAME_240X240
- # FRAME_QVGA FRAME_CIF FRAME_HVGA FRAME_VGA FRAME_SVGA
- # FRAME_XGA FRAME_HD FRAME_SXGA FRAME_UXGA FRAME_FHD
- # FRAME_P_HD FRAME_P_3MP FRAME_QXGA FRAME_QHD FRAME_WQXGA
- # FRAME_P_FHD FRAME_QSXGA
- # Check this link for more information: <a href="https://bit.ly/2YOzizz" target="_blank">https://bit.ly/2YOzizz</a>
复制代码
④:设置特技效果
- # special effects
- camera.speffect(camera.EFFECT_NONE)
- # The options are the following:
- # EFFECT_NONE (default)
- EFFECT_NEG
- EFFECT_BW
- EFFECT_RED
- EFFECT_GREEN
- EFFECT_BLUE
- EFFECT_RETRO
复制代码
⑤:设置白平衡
- camera.whitebalance(camera.WB_NONE)
- # The options are the following:
- # WB_NONE (default)
- WB_SUNNY
- WB_CLOUDY
- WB_OFFICE
- WB_HOME
复制代码
⑥:设置饱和度
- camera.saturation(0)
- # -2,2 (default 0). -2 grayscale
复制代码
⑦:设置亮度
- camera.brightness(0)
- # -2,2 (default 0). 2 brightness
复制代码
⑧:设置对比
- # contrast
- camera.contrast(0)
- #-2,2 (default 0). 2 highcontrast
复制代码
⑨:设置图像质量
- # quality
- camera.quality(10)
- # 10-63 lower number means higher quality
复制代码
⑩:获取图像数据
27.2 硬件设计
1. 例程功能
本章实验功能简介:程序下载完成,摄像头的图像数据在SPILCD显示屏上显示。
2. 硬件资源
1)XL9555
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
2)SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555)
3)CAMERA
OV_SCL-IO38
OV_SDA- IO 39
VSYNC- IO 47
HREF- IO 48
PCLK- IO 45
D0- IO 4
D1- IO 5
D2- IO 6
D3- IO 7
D4- IO 15
D5- IO 16
D6- IO 17
D7- IO 18
RESET-IO0_5(XL9555)
PWDN-IO0_4(XL9555)
3. 原理图
CAMERA接口与ESP32-S3的连接关系,如下图所示:
图27.2.1 CAMERA接口与ESP32-S3的连接电路图
27.3 程序设计
27.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图。
图27.3.1.1 程序流程图
27.3.2 程序解析
本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。CAMERA实验main.py源码如下:
- import time
- import camera
- import atk_xl9555 as io_ex
- import atk_lcd as lcd
- from machine import Pin,SPI,I2C
- """
- * @brief 程序入口
- * @param 无
- * @retval 无
- """
- if __name__ == '__main__':
-
- # IIC初始化
- i2c0 = I2C(0, scl = Pin(42), sda = Pin(41), freq = 400000)
- # XL9555初始化
- xl9555 = io_ex.init(i2c0)
- xl9555.write_bit(io_ex.BEEP,1)
-
- # 复位摄像头
- xl9555.write_bit(io_ex.OV_RESET,0)
- time.sleep_ms(100)
- xl9555.write_bit(io_ex.OV_RESET,1)
- time.sleep_ms(100)
- # 开启摄像头
- xl9555.write_bit(io_ex.OV_PWDN,1)
- time.sleep_ms(100)
- xl9555.write_bit(io_ex.OV_PWDN,0)
- time.sleep_ms(100)
-
- # 初始化摄像头
- try:
- camera.init(0, format = camera.RGB565,fb_location = camera.PSRAM,
- framesize = camera.FRAME_240X240,xclk_freq = 24000000)
- except Exception as e:
- camera.deinit()
- camera.init(0, format = camera.RGB565,fb_location = camera.PSRAM,
- framesize = camera.FRAME_240X240,xclk_freq = 24000000)
-
- # 复位LCD
- xl9555.write_bit(io_ex.SLCD_RST,0)
- time.sleep_ms(100)
- xl9555.write_bit(io_ex.SLCD_RST,1)
- time.sleep_ms(100)
-
- # 初始化SPI
- spi = SPI(2,baudrate = 80000000, sck = Pin(12), mosi=Pin(11), miso=Pin(13))
- # 初始化LCD,lcd = 0为正点原子2.4寸屏幕;lcd = 1为正点原子1.3寸SPILCD屏幕;
- display = lcd.init(spi,dc = Pin(40,Pin.OUT,Pin.PULL_UP,value = 1),
- cs = Pin(21,Pin.OUT,Pin.PULL_UP,value = 1),dir = 1,lcd = 0)
- # 开启背光
- xl9555.write_bit(io_ex.SLCD_PWR,1)
- time.sleep_ms(100)
- display.camera(42,5)
复制代码 从上述源码可知,我们首先初始化各个外设,如IIC、SPI、XL9555、摄像头和LCD等驱动,然后调用display.camera函数在SPILCD显示屏上显示摄像头图像。
27.4 下载验证
程序下载到开发板后,LCD显示屏不断更新摄像头输出的图像数据,如下图所示。
图27.4.1 LCD显示效果图 |