/ examples / ov5640_jpeg_capture_manual_focus.py
ov5640_jpeg_capture_manual_focus.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, a prompt is given to enter a step
  7  for the focus. Enter a value 0-255 to set the focus or
  8  enter a value >255 to execute an autofocus.
  9  After the value is input, an image is captured and saved
 10  to the microSD card.
 11  """
 12  
 13  import os
 14  import time
 15  import busio
 16  import board
 17  import digitalio
 18  import keypad
 19  import sdcardio
 20  import storage
 21  import adafruit_ov5640
 22  
 23  print("Initializing SD card")
 24  sd_spi = busio.SPI(clock=board.GP18, MOSI=board.GP19, MISO=board.GP16)
 25  sd_cs = board.GP17
 26  sdcard = sdcardio.SDCard(sd_spi, sd_cs)
 27  vfs = storage.VfsFat(sdcard)
 28  storage.mount(vfs, "/sd")
 29  
 30  print("construct bus")
 31  i2c = busio.I2C(board.GP5, board.GP4)
 32  print("construct camera")
 33  reset = digitalio.DigitalInOut(board.GP14)
 34  cam = adafruit_ov5640.OV5640(
 35      i2c,
 36      data_pins=(
 37          board.GP6,
 38          board.GP7,
 39          board.GP8,
 40          board.GP9,
 41          board.GP10,
 42          board.GP11,
 43          board.GP12,
 44          board.GP13,
 45      ),
 46      clock=board.GP3,
 47      vsync=board.GP0,
 48      href=board.GP2,
 49      mclk=None,
 50      shutdown=None,
 51      reset=reset,
 52      size=adafruit_ov5640.OV5640_SIZE_VGA,
 53  )
 54  print("print chip id")
 55  print(cam.chip_id)
 56  
 57  keys = keypad.Keys((board.GP22,), value_when_pressed=False, pull=True)
 58  
 59  
 60  def exists(filename):
 61      try:
 62          os.stat(filename)
 63          return True
 64      except OSError as _:
 65          return False
 66  
 67  
 68  _image_counter = 0
 69  
 70  
 71  def open_next_image():
 72      global _image_counter  # pylint: disable=global-statement
 73      while True:
 74          filename = f"/sd/img{_image_counter:04d}.jpg"
 75          _image_counter += 1
 76          if exists(filename):
 77              continue
 78          print("# writing to", filename)
 79          return open(filename, "wb")
 80  
 81  
 82  cam.colorspace = adafruit_ov5640.OV5640_COLOR_JPEG
 83  cam.quality = 3
 84  b = bytearray(cam.capture_buffer_size)
 85  
 86  cam.autofocus()
 87  print("AF Status: ", cam.autofocus_status, cam.autofocus_vcm_step)
 88  
 89  jpeg = cam.capture(b)
 90  
 91  while True:
 92      shutter = keys.events.get()
 93      # event will be None if nothing has happened.
 94      if shutter:
 95          if shutter.pressed:
 96              """Captures an image and send it to Adafruit IO."""
 97              step = int(input("enter AF step:"))
 98              if step > 255:
 99                  # Force autofocus and capture a JPEG image
100                  cam.autofocus()
101                  print("AF Status: ", cam.autofocus_status, cam.autofocus_vcm_step)
102              else:
103                  cam.autofocus_vcm_step = step
104              print("AF Status: ", cam.autofocus_status, cam.autofocus_vcm_step)
105              time.sleep(0.01)
106              jpeg = cam.capture(b)
107              print(f"Captured {len(jpeg)} bytes of jpeg data")
108              print(f" (had allocated {cam.capture_buffer_size} bytes")
109              print(f"Resolution {cam.width}x{cam.height}")
110              try:
111                  with open_next_image() as f:
112                      f.write(jpeg)
113                  print("# Wrote image")
114              except OSError as e:
115                  print(e)