Esp-idf-v5.1和Micropython:v1.20版本 ESP32编译自己的micropython固件以支持OV2640、SPIRAM、bluetooth等完整功能踩坑记录

通过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()

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值