《ESP32-S3使用指南—MicroPython版 V1.0》第二十七章 摄像头实验

第二十七章 摄像头实验


       本章,我们将介绍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-Windowsà2,正点原子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.flip(1)


       ②:图像左右翻

camera.mirror(1)


       ③:设置输出图像大小

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: https://bit.ly/2YOzizz


       ④:设置特技效果

# 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


       ⑩:获取图像数据

buf = camera.capture()

        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显示效果图


请使用浏览器的分享功能分享到微信等