/ examples / ov5640_jpeg_capture_af.py
ov5640_jpeg_capture_af.py
  1  # SPDX-FileCopyrightText: Copyright (c) 2023 Limor Fried for Adafruit Industries
  2  #
  3  # SPDX-License-Identifier: Unlicense
  4  """
  5  This demo is designed for the Raspberry Pi Pico and Camera PiCowbell
  6  When the shutter is pressed the camera is autofocussed before capturing
  7  an image andsaving it to the microSD card.
  8  """
  9  
 10  import os
 11  import time
 12  import busio
 13  import board
 14  import digitalio
 15  import keypad
 16  import sdcardio
 17  import storage
 18  import adafruit_ov5640
 19  
 20  print("Initializing SD card")
 21  sd_spi = busio.SPI(clock=board.GP18, MOSI=board.GP19, MISO=board.GP16)
 22  sd_cs = board.GP17
 23  sdcard = sdcardio.SDCard(sd_spi, sd_cs)
 24  vfs = storage.VfsFat(sdcard)
 25  storage.mount(vfs, "/sd")
 26  
 27  print("construct bus")
 28  i2c = busio.I2C(board.GP5, board.GP4)
 29  print("construct camera")
 30  reset = digitalio.DigitalInOut(board.GP14)
 31  cam = adafruit_ov5640.OV5640(
 32      i2c,
 33      data_pins=(
 34          board.GP6,
 35          board.GP7,
 36          board.GP8,
 37          board.GP9,
 38          board.GP10,
 39          board.GP11,
 40          board.GP12,
 41          board.GP13,
 42      ),
 43      clock=board.GP3,
 44      vsync=board.GP0,
 45      href=board.GP2,
 46      mclk=None,
 47      shutdown=None,
 48      reset=reset,
 49      size=adafruit_ov5640.OV5640_SIZE_VGA,
 50  )
 51  print("print chip id")
 52  print(cam.chip_id)
 53  
 54  keys = keypad.Keys((board.GP22,), value_when_pressed=False, pull=True)
 55  
 56  
 57  def exists(filename):
 58      try:
 59          os.stat(filename)
 60          return True
 61      except OSError as _:
 62          return False
 63  
 64  
 65  _image_counter = 0
 66  
 67  
 68  def open_next_image():
 69      global _image_counter  # pylint: disable=global-statement
 70      while True:
 71          filename = f"/sd/img{_image_counter:04d}.jpg"
 72          _image_counter += 1
 73          if exists(filename):
 74              continue
 75          print("# writing to", filename)
 76          return open(filename, "wb")
 77  
 78  
 79  cam.colorspace = adafruit_ov5640.OV5640_COLOR_JPEG
 80  cam.quality = 3
 81  b = bytearray(cam.capture_buffer_size)
 82  
 83  cam.autofocus()
 84  print("AF Status: ", cam.autofocus_status, cam.autofocus_vcm_step)
 85  
 86  jpeg = cam.capture(b)
 87  
 88  while True:
 89      shutter = keys.events.get()
 90      # event will be None if nothing has happened.
 91      if shutter:
 92          if shutter.pressed:
 93              cam.autofocus()
 94              print("AF Status: ", cam.autofocus_status, cam.autofocus_vcm_step)
 95              time.sleep(0.01)
 96              jpeg = cam.capture(b)
 97              print(f"Captured {len(jpeg)} bytes of jpeg data")
 98              print(f" (had allocated {cam.capture_buffer_size} bytes")
 99              print(f"Resolution {cam.width}x{cam.height}")
100              try:
101                  with open_next_image() as f:
102                      f.write(jpeg)
103                  print("# Wrote image")
104              except OSError as e:
105                  print(e)