基于CircuitPython实现的FireBeetle 2 ESP32-S3延时相机
本帖最后由 豆爸 于 2023-9-10 23:19 编辑FireBeetle 2 ESP32-S3是一款基于ESP32-S3-WROOM-1U-N16R8模组设计的主控板,拥有16MB Flash和8MB PSRAM,拥有强大的神经网络运算能力和信号处理能力,适用于图像识别、语音识别等项目。
本项目是一个基于CircuitPython的FireBeetle 2 ESP32-S3延时相机,实现自动间隔一定时间拍照数张的功能。间隔时间、照片张数可以进行修改。
【1.下载固件】
https://downloads.circuitpython.org/bin/yd_esp32_s3_n16r8/en_US/adafruit-circuitpython-yd_esp32_s3_n16r8-en_US-8.2.5.bin
【2.刷固件】
使用USB线将FireBeetle 2 ESP32-S3连接到电脑。同时按住BOOT与RST键,先松开RST键,再松下BOOT键,进入下载模式。
选择ESP32-S3、USB,如下图所示。
选择刚才下载的固件,地址写0x00,选择串口,如下图所示。
点击“ERASE”,进行擦除,如下图所示。
点击“START”,进行刷写固件,如下图所示。
等待下载完成,如下图所示。
按RST键重启。
【3.上传程序】
打开我的电脑,找到CIRCUITPY盘符,并打开,如下图所示。
将下载的文件解压到电脑,如下图所示。
将上述文件复制粘贴到CIRCUITPY盘符盘符下,替换目标中的文件,如下图所示。
【4.运行程序】
打开Thonny软件,点击“运行”-“配置解释器”,如下图所示。
进行解释器设置,如下图所示。
打开dfrobot_fireBeetle_2_board_esp32_s3_camera_demo.py文件,按F5运行当前脚本,如下图所示。
上述程序运行完后,会间隔1秒拍一张照片,一次拍10张,如下图所示。
间隔时间与拍照的张数来自程序中的两个常量,如下图所示。
【5.程序代码】
'''
感谢 HonestQiao提供的DFRobot FireBeetle_2_Board_ESP32_S3 摄像头演示程序
使用指导:请务必参考以下网址的使用指导,否则可能会出现各种问题
https://mc.dfrobot.com.cn/thread-316903-1-1.html
参考资料:
https://learn.adafruit.com/adafruit-ov5640-camera-breakout/jpeg-capture-demo
https://wiki.dfrobot.com.cn/_SKU_DFR0975_FireBeetle_2_Board_ESP32_S3_Advanced_Tutorial#target_12
https://learn.adafruit.com/circuitpython-essentials/circuitpython-storage
'''
import os
import board
import busio
import time
import espcamera
import AXP313A
import time
from digitalio import DigitalInOut, Direction
# LED setup.
led = DigitalInOut(board.GPIO21)
led.direction = Direction.OUTPUT
led.value = False
number = 10# 拍摄多少张照片
interval = 0.1# 间隔时间(秒)
'''
PWDN_GPIO_NUM = -1
RESET_GPIO_NUM = -1
XCLK_GPIO_NUM = 45
SIOD_GPIO_NUM = 1
SIOC_GPIO_NUM = 2
Y9_GPIO_NUM = 48
Y8_GPIO_NUM = 46
Y7_GPIO_NUM = 8
Y6_GPIO_NUM = 7
Y5_GPIO_NUM = 4
Y4_GPIO_NUM = 41
Y3_GPIO_NUM = 40
Y2_GPIO_NUM = 39
VSYNC_GPIO_NUM = 6
HREF_GPIO_NUM = 42
PCLK_GPIO_NUM = 5
'''
# 数据引脚定义 data pins
CAMERA_DATA = (
board.GPIO39,
board.GPIO40,
board.GPIO41,
board.GPIO4,
board.GPIO7,
board.GPIO8,
board.GPIO46,
board.GPIO48
)
# 控制引脚定义 controll pins
CAMERA_PCLK=board.GPIO5
CAMERA_VSYNC=board.GPIO6
CAMERA_HREF=board.GPIO42
CAMERA_XCLK=board.GPIO45
# 延时函数定义 delay function
delay = lambda n: time.sleep(n/1000)
print("i2c init")
i2c = busio.I2C(scl=board.GPIO2, sda=board.GPIO1)
while not i2c.try_lock():
print("try lock");
delay(1000)
i2c.unlock()
delay(1000)
print("AXP313A init")
axp = AXP313A.AXP313A(i2c)
delay(1000)
print("AXP313A begin")
while not axp.begin():
print("init error");
delay(1000)
delay(1000)
print("AXP313A enable_camera_power")
axp.enable_camera_power(AXP313A.eOV2640) # 设置摄像头供电 power on
delay(1000)
print("Initializing camera")
try:
cam = espcamera.Camera(
data_pins=CAMERA_DATA,
external_clock_pin=CAMERA_XCLK,
pixel_clock_pin=CAMERA_PCLK,
vsync_pin=CAMERA_VSYNC,
href_pin=CAMERA_HREF,
pixel_format=espcamera.PixelFormat.JPEG,
frame_size=espcamera.FrameSize.QVGA,
i2c=i2c,
external_clock_frequency=20_000_000,
framebuffer_count=1)
print("initialized")
#print("reconfigure")
# for display
#cam.reconfigure(
# pixel_format=espcamera.PixelFormat.RGB565,
# frame_size=espcamera.FrameSize.QVGA,
#)
#frame = cam.take(1)
'''
# for display
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.RGB565,
frame_size=espcamera.FrameSize.QVGA,
i2c=i2c,
external_clock_frequency=20_000_000,
framebuffer_count=2)
print(cam.width, cam.height)
display.auto_refresh = False
'''
# 切换到DCIM目录下
os.chdir("/DCIM")
print("延时相机启动")
for i in range(number):
# for jpeg
cam.reconfigure(
pixel_format=espcamera.PixelFormat.JPEG,
frame_size=espcamera.FrameSize.SVGA,
)
print("capture jpeg")
jpeg = cam.take(1)
print("write jpeg")
# 获取当前日期和时间
current_time = time.localtime()
year, month, day, hour, minute, second, _, _, _ = current_time
# 构建文件名
filename = "{:04d}{:02d}{:02d}_{:02d}{:02d}{:02d}.jpg".format(year, month, day, hour, minute, second)
print(filename)
filename = "IMG_" + filename
with open(
filename, "wb") as f:
f.write(jpeg)
print(f"Write {len(jpeg)} bytes of jpeg data")
鸣谢:最后感谢 @HonestQiao 提供的摄像头演示程序。
页:
[1]