HonestQiao 发表于 2023-9-9 19:42:38

在CircuitPython中使用FireBeetle 2 ESP32-S3上的摄像头

本帖最后由 HonestQiao 于 2023-9-10 11:47 编辑

FireBeetle 2 ESP32-S3套装,带有OV2640的摄像头,官方WiKi还提供了Arduino下面的教程: DFROBOT DFR0975 FireBeetle 2 Board ESP32-S3 产品资料 进阶教程
要使用这个摄像头,除了通用的ov2640驱动外,还需要 AXP313A 支持库,来控制给摄像头上电和断电。
AX0313A的支持库,可以从:cdjq/DFRobot_AXP313A (github.com) 下载。

在上述AX0313A的库中,还提供了micropython下的AX0313A库。
参考该库,经过简单修改,适配到了CircuitPython,以下为其使用方法。

一、直接上手试用
首先接好摄像头,摆好POSE:



然后,直接从: DFRobot_AXP313A/CircuitPython at master · HonestQiao/DFRobot_AXP313A (github.com) 下载下面的文件:

先将AXP313A.py上传到开发板的/lib/目录。


再将开发板上根目录下的 boot.py,参考如下进行修改:【如没有,则直接新建】


import storage
storage.remount("/", False)

注意:
1. 修改后,使得CircuitPython可以写入到内置存储,但将不能再电脑上直接进入U盘修改文件。
2. 在编辑器中,修改上述Flase为True,或者直接注释掉上面的行,就恢复原样。

再将开发板上根目录下的 settings.toml,参考如下进行修改:【如没有,则直接新建】


CIRCUITPY_RESERVED_PSRAM=1048576


特别注意:
1. settings.toml 必须修改,否则必然出错
2. boot.py 在存储图片到内置存储时,必须修改为True,否则必然出错;如存储到SD卡,则可以用False


现在务必按RST按键重置,就可以直接使用 dfrobot_firebeetle_2_board_esp32_s3_camera_demo.py 进行测试,运行输出的结果如下:


运行完成后,在开发板的根目录中,会生成test_001.jpg,将该文件拷贝出来,点击查看,即为通过通过摄像头拍摄的照片:



二、AX0313A.py说明
在该文件中,有具体的演示代码:

if __name__ == "__main__":
    import busio
   
    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(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(eOV2640) # 设置摄像头供电 power on
   
    delay(3000)

    print("AXP313A disable_power")
    axp.disable_power() # 设置摄像头断电 power off

    print("i2c deinit")
    i2c.deinit()



上述代码把基本功能,演示得非常清楚了,主要就是:
* 初始化I2C
* 实例化AXP313A对象,并传入i2c
* AXP313A.begin():通过I2C寻找摄像头
* AXP313A.enable_camera_power(eOV2640):上电
* AXP313A.disable_power():断电

三、摄像头使用
dfrobot_firebeetle_2_board_esp32_s3_camera_demo.py中的演示,已经很详细了,也步骤清晰明了。
首先是引脚的定义:


# 数据引脚定义 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


然后使用circuitpython为esp32提供的摄像头库espcamera操作即可:
* espcamera.Camera():初始化摄像头
* cam.reconfigure():输出设置
* cam.take(1):截取当前一帧

截取到了图像,演示中,再存储到test_001.jpg中。

在实际使用中,还可以将获取的图像,输出到LCD进行显示。



四、常见错误
1. 出错提示:espidf.IDFError: Requested resource not found
    问题原因:摄像头没接,或者接的不对

    解决方法:参考教程,重新连线,然后断开USB,重新连接







2. 出错提示:MemoryError




    问题原因:settings.toml未设置或设置错误,或设置后没有按RST按键重置

    解决办法:参考前面的指导设置,设置完成后,务必按RST按键重置,然后继续



3. 出错提示:OSError: Read-only filesystem


    问题原因:使用内置存储时,boot.py未设置或未按要求设置,或设置后没有按RST按键重置

    解决办法:参考前面的指导设置,设置完成后,务必按RST按键重置,然后继续





HonestQiao 发表于 2023-9-9 19:46:00

补充:
有人问:为什么从瓶子里伸出来[旺柴]
回复:固定摄像头啊!不然用一直用手扶着么?

豆爸 发表于 2023-9-9 22:48:53



跑你的demo,报上面错误是啥问题?

HonestQiao 发表于 2023-9-10 10:46:35

豆爸 发表于 2023-9-9 22:48
跑你的demo,报上面错误是啥问题?

请参考常见问题2
页: [1]
查看完整版本: 在CircuitPython中使用FireBeetle 2 ESP32-S3上的摄像头