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
Post a Comment