add another example for manual focus
This commit is contained in:
parent
a311de150f
commit
c02956c208
1 changed files with 115 additions and 0 deletions
115
examples/ov5640_jpeg_capture_manual_focus.py
Normal file
115
examples/ov5640_jpeg_capture_manual_focus.py
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
# SPDX-FileCopyrightText: Copyright (c) 2023 Limor Fried for Adafruit Industries
|
||||
#
|
||||
# SPDX-License-Identifier: Unlicense
|
||||
"""
|
||||
This demo is designed for the Raspberry Pi Pico and Camera PiCowbell
|
||||
When the shutter is pressed, a prompt is given to enter a step
|
||||
for the focus. Enter a value 0-255 to set the focus or
|
||||
enter a value >255 to execute an autofocus.
|
||||
After the value is input, an image is captured and saved
|
||||
to the microSD card.
|
||||
"""
|
||||
|
||||
import os
|
||||
import time
|
||||
import busio
|
||||
import board
|
||||
import digitalio
|
||||
import keypad
|
||||
import sdcardio
|
||||
import storage
|
||||
import adafruit_ov5640
|
||||
|
||||
print("Initializing SD card")
|
||||
sd_spi = busio.SPI(clock=board.GP18, MOSI=board.GP19, MISO=board.GP16)
|
||||
sd_cs = board.GP17
|
||||
sdcard = sdcardio.SDCard(sd_spi, sd_cs)
|
||||
vfs = storage.VfsFat(sdcard)
|
||||
storage.mount(vfs, "/sd")
|
||||
|
||||
print("construct bus")
|
||||
i2c = busio.I2C(board.GP5, board.GP4)
|
||||
print("construct camera")
|
||||
reset = digitalio.DigitalInOut(board.GP14)
|
||||
cam = adafruit_ov5640.OV5640(
|
||||
i2c,
|
||||
data_pins=(
|
||||
board.GP6,
|
||||
board.GP7,
|
||||
board.GP8,
|
||||
board.GP9,
|
||||
board.GP10,
|
||||
board.GP11,
|
||||
board.GP12,
|
||||
board.GP13,
|
||||
),
|
||||
clock=board.GP3,
|
||||
vsync=board.GP0,
|
||||
href=board.GP2,
|
||||
mclk=None,
|
||||
shutdown=None,
|
||||
reset=reset,
|
||||
size=adafruit_ov5640.OV5640_SIZE_VGA,
|
||||
)
|
||||
print("print chip id")
|
||||
print(cam.chip_id)
|
||||
|
||||
keys = keypad.Keys((board.GP22,), value_when_pressed=False, pull=True)
|
||||
|
||||
|
||||
def exists(filename):
|
||||
try:
|
||||
os.stat(filename)
|
||||
return True
|
||||
except OSError as _:
|
||||
return False
|
||||
|
||||
|
||||
_image_counter = 0
|
||||
|
||||
|
||||
def open_next_image():
|
||||
global _image_counter # pylint: disable=global-statement
|
||||
while True:
|
||||
filename = f"/sd/img{_image_counter:04d}.jpg"
|
||||
_image_counter += 1
|
||||
if exists(filename):
|
||||
continue
|
||||
print("# writing to", filename)
|
||||
return open(filename, "wb")
|
||||
|
||||
|
||||
cam.colorspace = adafruit_ov5640.OV5640_COLOR_JPEG
|
||||
cam.quality = 3
|
||||
b = bytearray(cam.capture_buffer_size)
|
||||
|
||||
cam.autofocus()
|
||||
print("AF Status: ", cam.autofocus_status, cam.autofocus_vcm_step)
|
||||
|
||||
jpeg = cam.capture(b)
|
||||
|
||||
while True:
|
||||
shutter = keys.events.get()
|
||||
# event will be None if nothing has happened.
|
||||
if shutter:
|
||||
if shutter.pressed:
|
||||
"""Captures an image and send it to Adafruit IO."""
|
||||
step = int(input("enter AF step:"))
|
||||
if step > 255:
|
||||
# Force autofocus and capture a JPEG image
|
||||
cam.autofocus()
|
||||
print("AF Status: ", cam.autofocus_status, cam.autofocus_vcm_step)
|
||||
else:
|
||||
cam.autofocus_vcm_step = step
|
||||
print("AF Status: ", cam.autofocus_status, cam.autofocus_vcm_step)
|
||||
time.sleep(0.01)
|
||||
jpeg = cam.capture(b)
|
||||
print(f"Captured {len(jpeg)} bytes of jpeg data")
|
||||
print(f" (had allocated {cam.capture_buffer_size} bytes")
|
||||
print(f"Resolution {cam.width}x{cam.height}")
|
||||
try:
|
||||
with open_next_image() as f:
|
||||
f.write(jpeg)
|
||||
print("# Wrote image")
|
||||
except OSError as e:
|
||||
print(e)
|
||||
Loading…
Reference in a new issue