通过usercmodule(用户c模块)的方式,安装esp32-cam的OV2640摄像头驱动,并使固件具备支持4M SPIRAM、bluetooth等最新micropython内置模块。
注本文的主要软件版本:
Esp-idf:v5.0.2
Micropython:v1.20
一.操作系统安装
我使用的是MacOs 本文件介绍苹果系统下如何编译自己的固件
二. Esp-idf开发环境安装
教大家一个完成安装esp-idf的方法,很简单
1.下载vs code mac版本
然后安装一个插件
使用默认的地址就可以了 点击install 等待安装结束就可以了完整的会自动给安装完esp-idf的环境
2.再执行如下指令:
cd /Users/XXXX/esp
./install.sh
三、下载micropython 源代码
cd ~
git clone https://github.com/micropython/micropython.git
cd micropython
make -C mpy-cross
为了方便开起ESP-idf环境,我制作另一个sh脚本用于快速生成固件
开启ESP编译环境.sh
#!/bin/bash echo '激活ESP-IDF运行环境' version='5.1' /Users/fengpengyong/esp/$version/esp-idf/add_path.sh source "/Users/fengpengyong/esp/$version/esp-idf/export.sh" idf.py --version project='ports/esp32' echo '进入项目路径:'$project cd $project #pwd ##变更项目路径时 清理编译缓存 #idf.py fullclean #echo '获取端口列表' ls -l /dev/cu* #编译ESP32_CAM固件 USER_C_MODULES加载依赖库 idf.py -D MICROPY_BOARD=ESP32_CAM -D USER_C_MODULES=/Users/fengpengyong/esp/micropython/examples/usercmodule/micropython.cmake build #编译LOLIN_S2_MINI #idf.py -D MICROPY_BOARD=LOLIN_S2_MINI build #编译ESP32_GENERIC_S3 #idf.py -D MICROPY_BOARD=ESP32_GENERIC_S3 build ##echo '烧录程序到设备上 用ESP32板的USB端口名称替换PORT。如果未定义PORT,idf.py将尝试使用可用的USB端口自动连接。 选项flash会自动构建和闪烁项目,因此无需运行idf.py build',ESP32S2 需要指定端口才行 PORT='/dev/cu.usbserial-14130' #擦除 idf.py -p $PORT erase-flash #烧录固件 idf.py -p $PORT flash ##idf.py flash ##echo '#监听端口 要退出IDF监视器,请使用快捷方式Ctrl+]' ##idf.py monitor
四.安装相机驱动
$ cd esp-idf/components
$ git clone https://github.com/espressif/esp32-camera 下载idf环境的相机驱动。
由于micropython官方的固件不带camera库,所以我们要手动配置,以便支持摄像头,下面下载micropython的camera驱动。
$ cd micropython/ports/esp32
$ git clone https://github.com/lemariva/micropython-camera-driver
接下来利用usermodule的方式将camera模块添加进micropython中去,参考micropython/docs/develop/cmodules.rst官方文档。
(1)拷贝micropython-camera-driver/src中的4个文件:micropython.cmake、micropython.mk、modcamera.c、modecamera.h到~/micropython/examples/usercmodule/cam/文件夹下,cam文件夹是自己新建的。
camera有个代码BUG
camera代码有一个BUG,将第三个参数去掉,都则编译会报错
(2)切换回~/micropython/ports/esp32/boards/ESP32_CAM目录,打开mpconfigboard.h文件,应该只有两行:
#define MICROPY_HW_BOARD_NAME "ESP32 module"
#define MICROPY_HW_MCU_NAME "ESP32"
在末尾增加一行:
#define MODULE_CAMERA_ENABLED (1)
用于开启摄像头应用
(3)重新编译:
执行我刚才的变异环境脚本
import camera
没有报错的话,就成功了。具体import后的使用方法,可自行查看下该模块的文档或者百度一下。
五.配置扩展SPIRAM
我的ESP32-CAM是带4M外置SPIRAM的,通过以下方法改造默认的GENERIC板,使其支持SPIRAM。
(1)找到boards目录里面的sdkconfig.spiram_sx文件,打开后头两行是这样的:
CONFIG_ESP32S2_SPIRAM_SUPPORT=y
CONFIG_ESP32S3_SPIRAM_SUPPORT=y
在这两行后面增加一行:
CONFIG_ESP32_SPIRAM_SUPPORT=y
这个文件原生只定义了S2和S3两个板子使用SPIRAM,为了使GENERIC(GENERIC这个boards对应的型号是ESP32,不带S)的板子也使用SPIRAM,因此增加这一行。
(2)找到boards/ESP_32/mpconfigboard.cmake文件,开头部分是这样的:
set(SDKCONFIG_DEFAULTS
boards/sdkconfig.base
boards/sdkconfig.ble
)
修改一下,增加一行,变成这样:
set(SDKCONFIG_DEFAULTS
boards/sdkconfig.base
boards/sdkconfig.ble
boards/sdkconfig.spiram_sx
)
重新编译,烧写,就应该能用gc.mem_free()看到有4M的ram可用了。也可以用
import micropython
micropython.mem_info()
来查看内存信息。
如果还有其他问题欢迎联系沟通交流 WX:17611598597
测试结果
import camera # 初始化摄像头 try: camera.init(0, format=camera.JPEG) except Exception as e: # 如果报错 camera.deinit() camera.init(0, format=camera.JPEG) # 拍摄一张图片 buf = camera.capture() # 大小是640x480 # 保存图片到文件 with open("第一张图片.png", "wb") as f: f.write(buf) # buf中的数据就是图片的数据,所以直接写入到文件就行了 print( "拍照已完成,点击Thonny左侧【MicroPython设备】右侧的三,\n然后看到‘刷新’,点击刷新会看到 图片,\n然后右击图片名称,选择下载到电脑的路径即可...") camera.deinit()