本帖最后由 豆爸 于 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 提供的摄像头演示程序。
|