From 751422b7fec1e397fd85fcb43d3f43611c442549 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Tue, 14 Feb 2023 15:18:09 -0600 Subject: [PATCH] Update camera demos --- .../CircuitPython_Kaluga-ascii-mirror/code.py | 70 ++++++++++++++++ .../code.py | 0 .../CircuitPython_Pico-ascii-mirror/code.py | 72 +++++++++++++++++ .../CircuitPython_Pico-lcd-mirror/code.py | 79 +++++++++++++++++++ 4 files changed, 221 insertions(+) create mode 100644 OV5640_Breakout/CircuitPython_Kaluga-ascii-mirror/code.py rename OV5640_Breakout/{CircuitPython_Kaluga => CircuitPython_Kaluga-lcd-mirror}/code.py (100%) create mode 100644 OV5640_Breakout/CircuitPython_Pico-ascii-mirror/code.py create mode 100644 OV5640_Breakout/CircuitPython_Pico-lcd-mirror/code.py diff --git a/OV5640_Breakout/CircuitPython_Kaluga-ascii-mirror/code.py b/OV5640_Breakout/CircuitPython_Kaluga-ascii-mirror/code.py new file mode 100644 index 000000000..abd306ad7 --- /dev/null +++ b/OV5640_Breakout/CircuitPython_Kaluga-ascii-mirror/code.py @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: Copyright (c) 2021 Jeff Epler for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + +""" +This demo is designed for the Kaluga development kit version 1.3. + +To fix the MemoryError when creating a Camera object, Place the line +```toml +CIRCUITPY_RESERVED_PSRAM=1048576 +``` +in the file **CIRCUITPY/settings.toml** and restart. +""" + +import sys + +import board +import keypad +import displayio +import espcamera +import espidf + +# The demo runs very slowly if the LCD display is enabled! +# It's intended to be viewed on the REPL on a host computer +displayio.release_displays() + +if espidf.get_reserved_psram() < 1047586: + print("""Place the following line in CIRCUITPY/settings.toml, then hard-reset the board: +``` +CIRCUITPY_RESERVED_PSRAM +``` +""") + raise SystemExit + +print("Initializing camera") +cam = espcamera.Camera( + data_pins=board.CAMERA_DATA, + external_clock_pin=board.CAMERA_XCLK, + pixel_clock_pin=board.CAMERA_PCLK, + vsync_pin=board.CAMERA_VSYNC, + href_pin=board.CAMERA_HREF, + pixel_format=espcamera.PixelFormat.GRAYSCALE, + frame_size=espcamera.FrameSize.QQVGA, + i2c=board.I2C(), + external_clock_frequency=20_000_000, + framebuffer_count=2) +print("initialized") + +k = keypad.Keys([board.IO0], value_when_pressed=False) + +chars = b" .:-=+*#%@" +remap = [chars[i * (len(chars) - 1) // 255] for i in range(256)] +width = cam.width +row = bytearray(width//2) + +sys.stdout.write("\033[2J") + +while True: + if (e := k.events.get()) is not None and e.pressed: + cam.colorbar = not cam.colorbar + + frame = cam.take(1) + + for j in range(0, cam.height, 5): + sys.stdout.write(f"\033[{j//5}H") + for i in range(cam.width // 2): + row[i] = remap[frame[width * j + 2 * i]] + sys.stdout.write(row) + sys.stdout.write("\033[K") + sys.stdout.write("\033[J") diff --git a/OV5640_Breakout/CircuitPython_Kaluga/code.py b/OV5640_Breakout/CircuitPython_Kaluga-lcd-mirror/code.py similarity index 100% rename from OV5640_Breakout/CircuitPython_Kaluga/code.py rename to OV5640_Breakout/CircuitPython_Kaluga-lcd-mirror/code.py diff --git a/OV5640_Breakout/CircuitPython_Pico-ascii-mirror/code.py b/OV5640_Breakout/CircuitPython_Pico-ascii-mirror/code.py new file mode 100644 index 000000000..aa73ca41b --- /dev/null +++ b/OV5640_Breakout/CircuitPython_Pico-ascii-mirror/code.py @@ -0,0 +1,72 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Limor Fried for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense +""" +This demo is designed for the Raspberry Pi Pico. + +It shows the camera image as ASCII art on the USB REPL. +""" + + +import sys +import time +import busio +import board +import digitalio +import adafruit_ov5640 + +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_QQVGA, +) +print("print chip id") +print(cam.chip_id) + + +cam.colorspace = adafruit_ov5640.OV5640_COLOR_YUV +cam.flip_y = True +cam.flip_x = True +cam.test_pattern = False + +buf = bytearray(cam.capture_buffer_size) +chars = b" .':-+=*%$#" +remap = [chars[i * (len(chars) - 1) // 255] for i in range(256)] + +width = cam.width +row = bytearray(width) + +print("capturing") +cam.capture(buf) +print("capture complete") + +sys.stdout.write("\033[2J") +while True: + cam.capture(buf) + for j in range(0, cam.height, 2): + sys.stdout.write(f"\033[{j//2}H") + for i in range(cam.width): + row[i] = remap[buf[2 * (width * j + i)]] + sys.stdout.write(row) + sys.stdout.write("\033[K") + sys.stdout.write("\033[J") + time.sleep(0.1) diff --git a/OV5640_Breakout/CircuitPython_Pico-lcd-mirror/code.py b/OV5640_Breakout/CircuitPython_Pico-lcd-mirror/code.py new file mode 100644 index 000000000..6a5b06cd7 --- /dev/null +++ b/OV5640_Breakout/CircuitPython_Pico-lcd-mirror/code.py @@ -0,0 +1,79 @@ +# 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.show(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