Install & Use the Demo
Click the Download Project Bundle button below to download the necessary libraries and the code.py file in a zip file. Extract the contents of the zip file, and copy the entire lib folder and the code.py file to your CIRCUITPY drive.
If the live mode image is black, remove the lens cap from the camera.
# SPDX-FileCopyrightText: Copyright (c) 2023 Limor Fried for Adafruit Industries # # SPDX-License-Identifier: Unlicense """ This demo is designed for the Raspberry Pi Pico. with 240x240 SPI TFT display It shows the camera image on the LCD """ import time import busio import board import digitalio import adafruit_ov5640 import adafruit_st7789 import displayio # Set up the display (You must customize this block for your display!) displayio.release_displays() spi = busio.SPI(clock=board.GP2, MOSI=board.GP3) display_bus = displayio.FourWire(spi, command=board.GP0, chip_select=board.GP1, reset=None) display = adafruit_st7789.ST7789(display_bus, width=240, height=240, rowstart=80, rotation=0) print("construct bus") bus = busio.I2C(board.GP9, board.GP8) print("construct camera") reset = digitalio.DigitalInOut(board.GP10) cam = adafruit_ov5640.OV5640( bus, data_pins=( board.GP12, board.GP13, board.GP14, board.GP15, board.GP16, board.GP17, board.GP18, board.GP19, ), clock=board.GP11, vsync=board.GP7, href=board.GP21, mclk=board.GP20, shutdown=None, reset=reset, size=adafruit_ov5640.OV5640_SIZE_240X240, ) print("print chip id") print(cam.chip_id) cam.colorspace = adafruit_ov5640.OV5640_COLOR_RGB cam.flip_y = False cam.flip_x = False cam.test_pattern = False width = display.width height = display.height #cam.test_pattern = OV7670_TEST_PATTERN_COLOR_BAR_FADE bitmap = displayio.Bitmap(cam.width, cam.height, 65535) print(width, height, cam.width, cam.height) if bitmap is None: raise SystemExit("Could not allocate a bitmap") g = displayio.Group(scale=1, x=(width-cam.width)//2, y=(height-cam.height)//2) tg = displayio.TileGrid(bitmap, pixel_shader=displayio.ColorConverter(input_colorspace=displayio.Colorspace.RGB565_SWAPPED) ) g.append(tg) display.root_group = g t0 = time.monotonic_ns() display.auto_refresh = False while True: cam.capture(bitmap) bitmap.dirty() display.refresh(minimum_frames_per_second=0) t1 = time.monotonic_ns() print("fps", 1e9 / (t1 - t0)) t0 = t1
# SPDX-FileCopyrightText: Copyright (c) 2023 Limor Fried for Adafruit Industries # # SPDX-License-Identifier: Unlicense """ This demo is designed for the Raspberry Pi Pico. with 240x240 SPI TFT display It shows the camera image on the LCD """ import time import busio import board import digitalio import adafruit_ov5640 import adafruit_st7789 import displayio # Set up the display (You must customize this block for your display!) displayio.release_displays() spi = busio.SPI(clock=board.GP2, MOSI=board.GP3) display_bus = displayio.FourWire(spi, command=board.GP0, chip_select=board.GP1, reset=None) display = adafruit_st7789.ST7789(display_bus, width=240, height=240, rowstart=80, rotation=0)
Next, the camera object is created and configured.
print("construct bus") bus = busio.I2C(board.GP9, board.GP8) print("construct camera") reset = digitalio.DigitalInOut(board.GP10) cam = adafruit_ov5640.OV5640( bus, data_pins=( board.GP12, board.GP13, board.GP14, board.GP15, board.GP16, board.GP17, board.GP18, board.GP19, ), clock=board.GP11, vsync=board.GP7, href=board.GP21, mclk=board.GP20, shutdown=None, reset=reset, size=adafruit_ov5640.OV5640_SIZE_240X240, ) print("print chip id") print(cam.chip_id) cam.colorspace = adafruit_ov5640.OV5640_COLOR_RGB cam.flip_y = False cam.flip_x = False cam.test_pattern = False width = display.width height = display.height
This demo integrates with displayio for display, so a bitmap object is needed:
bitmap = displayio.Bitmap(cam.width, cam.height, 65535) print(width, height, cam.width, cam.height) if bitmap is None: raise SystemExit("Could not allocate a bitmap") g = displayio.Group(scale=1, x=(width-cam.width)//2, y=(height-cam.height)//2) tg = displayio.TileGrid(bitmap, pixel_shader=displayio.ColorConverter(input_colorspace=displayio.Colorspace.RGB565_SWAPPED) ) g.append(tg) display.root_group = g
The forever loop grabs a frame to the bitmap and then refreshes the display. It tracks the approximate refresh rate (FPS) of the demo; this demo achieves about 2fps due mostly to the overhead of displayio & communication with the display.
t0 = time.monotonic_ns() display.auto_refresh = False while True: cam.capture(bitmap) bitmap.dirty() display.refresh(minimum_frames_per_second=0) t1 = time.monotonic_ns() print("fps", 1e9 / (t1 - t0)) t0 = t1
Text editor powered by tinymce.