豆爸 发表于 2023-9-10 18:02:43

基于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]
查看完整版本: 基于CircuitPython实现的FireBeetle 2 ESP32-S3延时相机