/ examples / ov5640_pico_st7789.py
ov5640_pico_st7789.py
 1  # SPDX-FileCopyrightText: Copyright (c) 2023 Lady Ada for Adafruit Industries
 2  #
 3  # SPDX-License-Identifier: Unlicense
 4  
 5  """Capture an images from the camera and display on a ST7789 with
 6  displayio.
 7  
 8  This demo is designed to run on the Raspberry Pi Pico, but you can adapt it
 9  to other boards by changing the constructors for `bus` and `cam`
10  appropriately.
11  
12  Remember to take the lens cap off!
13  """
14  import time
15  from adafruit_ov7670 import OV7670, OV7670_SIZE_DIV1, OV7670_SIZE_DIV16
16  from displayio import (
17      Bitmap,
18      Group,
19      TileGrid,
20      FourWire,
21      release_displays,
22      ColorConverter,
23      Colorspace,
24  )
25  from adafruit_st7789 import ST7789
26  import board
27  import busio
28  import digitalio
29  
30  # Set up the display (You must customize this block for your display!)
31  release_displays()
32  spi = busio.SPI(clock=board.GP2, MOSI=board.GP3)
33  display_bus = FourWire(spi, command=board.GP0, chip_select=board.GP1, reset=None)
34  display = ST7789(display_bus, width=240, height=240, rowstart=80, rotation=270)
35  
36  
37  # Ensure the camera is shut down, so that it releases the SDA/SCL lines,
38  # then create the configuration I2C bus
39  
40  with digitalio.DigitalInOut(board.GP10) as reset:
41      reset.switch_to_output(False)
42      time.sleep(0.001)
43      bus = busio.I2C(board.GP9, board.GP8)
44  
45  # Set up the camera (you must customize this for your board!)
46  cam = OV7670(
47      bus,
48      data0=board.GP12,  # [16]     [org]
49      clock=board.GP11,  # [15]     [blk]
50      vsync=board.GP7,  # [10]     [brn]
51      href=board.GP21,  # [27/o14] [red]
52      mclk=board.GP20,  # [16/o15]
53      shutdown=None,
54      reset=board.GP10,
55  )  # [14]
56  
57  width = display.width
58  height = display.height
59  
60  # cam.test_pattern = OV7670_TEST_PATTERN_COLOR_BAR_FADE
61  bitmap = None
62  # Select the biggest size for which we can allocate a bitmap successfully, and
63  # which is not bigger than the display
64  for size in range(OV7670_SIZE_DIV1, OV7670_SIZE_DIV16 + 1):
65      cam.size = size
66      if cam.width > width:
67          continue
68      if cam.height > height:
69          continue
70      try:
71          bitmap = Bitmap(cam.width, cam.height, 65535)
72          break
73      except MemoryError:
74          continue
75  
76  print(width, height, cam.width, cam.height)
77  if bitmap is None:
78      raise SystemExit("Could not allocate a bitmap")
79  
80  g = Group(scale=1, x=(width - cam.width) // 2, y=(height - cam.height) // 2)
81  tg = TileGrid(
82      bitmap, pixel_shader=ColorConverter(input_colorspace=Colorspace.RGB565_SWAPPED)
83  )
84  g.append(tg)
85  display.root_group = g
86  
87  t0 = time.monotonic_ns()
88  display.auto_refresh = False
89  while True:
90      cam.capture(bitmap)
91      bitmap.dirty()
92      display.refresh(minimum_frames_per_second=0)
93      t1 = time.monotonic_ns()
94      print("fps", 1e9 / (t1 - t0))
95      t0 = t1