espcamera exercise on ESP32S3/CircuitPython 9 + ov5640 camera

espcamera exercise on Seeed Studio XIAO ESP32S3 Sense/CircuitPython 9.2.3 + Third party ov5640 (5 megapixel) camera module (MF/Manual Focusing), display on 1.28" 240x240 GC9A01 Round IPS LCD.


Connection and library setup, refer to the post "Seeed Studio XIAO ESP32S3 Sense/CircuitPython display on 1.28" 240x240 GC9A01 Round IPS LCD".

cpy_XS3_espcamera.py
"""
Seeed Studio XIAO ESP32S3 Sense/CircuitPython 9.2.3
with 1.28" 240x240 Round GC9A01 SPI IPS LCD

espcamera exercise to access camera
Tested with:
- default ov2640 in Seeed Studio XIAO ESP32S3 Sense
- XIAO ov5640 Camera (Auto-Focusing)
- Third party ov5640 camera sensor (MF/Manual Focusing)
camera sensor (sensor_name) is auto-detected. 

Library needed:
- gc9a01.mpy

ref:
https://docs.circuitpython.org/en/stable/shared-bindings/espcamera/
"""
import os, sys
import board
import busio
import gc9a01
import espcamera

import displayio

disp_res  = board.D0
disp_dc   = board.D1
disp_cs   = board.D2
disp_blk  = board.D3

displayio.release_displays()
spi = busio.SPI(clock=board.SCK, MOSI=board.MOSI, MISO=board.MISO)

display_bus = displayio.FourWire(spi_bus=spi,
                                 command=disp_dc,
                                 chip_select=disp_cs,
                                 reset=disp_res)

display = gc9a01.GC9A01(display_bus, width=240, height=240, backlight_pin=disp_blk, rotation=90)

#=======================================
info = os.uname()[4] + "\n" + \
       sys.implementation[0] + " " + os.uname()[3] + "\n" + \
       gc9a01.__name__ + " " + gc9a01.__version__
print("=======================================")
print(info)
print("=======================================")
print()

cam_i2c = busio.I2C(scl=board.CAM_SCL, sda=board.CAM_SDA)
cam = espcamera.Camera(data_pins=board.CAM_DATA,
                       external_clock_pin=board.CAM_XCLK,
                       pixel_clock_pin=board.CAM_PCLK,
                       vsync_pin=board.CAM_VSYNC,
                       href_pin=board.CAM_HREF,
                       pixel_format=espcamera.PixelFormat.RGB565,
                       frame_size=espcamera.FrameSize.R240X240,
                       i2c=cam_i2c,
                       framebuffer_count=2)

bitmap = displayio.Bitmap(cam.width, cam.height, 65536)
if bitmap is None:
    raise SystemExit("Could not allocate a bitmap")

#cam.colorbar = True
#cam.special_effect = 0
#0 - No Effect
#1 - Negative
#2 - Grayscale
#3 - Red Tint
#4 - Green Tint
#5 - Blue Tint
#6 - Sepia
cam.vflip = True

print()
print("pixel_format:\t", cam.pixel_format)
print("frame_size:\t", cam.frame_size)
print("contrast:\t", cam.contrast)
print("brightness:\t", cam.brightness)
print("saturation:\t", cam.saturation)
print("sharpness:\t", cam.sharpness)
print("denoise:\t", cam.denoise)
print("gain_ceiling:\t", cam.gain_ceiling)
print("quality:\t", cam.quality)
print("whitebal:\t", cam.whitebal)
print("gain_ctrl:\t", cam.gain_ctrl)
print("exposure_ctrl:\t", cam.exposure_ctrl)
print("hmirror:\t", cam.hmirror)
print("vflip:\t\t", cam.vflip)
print("aec2:\t\t", cam.aec2)
print("awb_gain:\t", cam.awb_gain)
print("agc_gain:\t", cam.agc_gain)
print("aec_value:\t", cam.aec_value)
print("special_effect:\t", cam.special_effect)
print("wb_mode:\t", cam.wb_mode)
print("ae_level:\t", cam.ae_level)
print("dcw:\t\t", cam.dcw)
print("bpc:\t\t", cam.bpc)
print("wpc:\t\t", cam.wpc)
print("raw_gma:\t", cam.raw_gma)
print("lenc:\t\t", cam.lenc)
print("max_frame_size:\t", cam.max_frame_size)
print("address:\t", hex(cam.address))
print("sensor_name:\t", cam.sensor_name)
print("supports_jpeg:\t", cam.supports_jpeg)
print("height:\t\t", cam.height);
print("width:\t\t", cam.width)
print("grab_mode:\t", cam.grab_mode)
print("framebuffer_count:\t", cam.framebuffer_count)

g = displayio.Group(scale=1,
                    x=(display.width - cam.width) // 2,
                    y=(display.height - cam.height) // 2)

#colorspace = Colorspace.BGR555
#colorspace = Colorspace.BGR555_SWAPPED
#colorspace = Colorspace.RGB565
#colorspace = Colorspace.BGR565_SWAPPED
#colorspace = Colorspace.L8
#colorspace = Colorspace.RGB555
#colorspace = Colorspace.RGB555_SWAPPED
#colorspace = Colorspace.RGB565
colorspace = displayio.Colorspace.RGB565_SWAPPED
#colorspace = Colorspace.RGB888

tg = displayio.TileGrid(
    bitmap,
    pixel_shader=displayio.ColorConverter(input_colorspace=colorspace)
)

g.append(tg)
display.root_group = g

# When True, a test pattern image is captured and the real sensor data is not used.
#cam.colorbar = True

display.auto_refresh = True
while True:
    if cam.frame_available:
        tg.bitmap = cam.take()




Comments

Popular posts from this blog

480x320 TFT/ILI9488 SPI wih EP32C3 (arduino-esp32) using Arduino_GFX Library

my dev.tools - FNIRSI 2C23T 3-in-1 Dual Channel Oscilloscope/Multimeter/Signal Generator