ESP32编译自己的micropython固件以支持OV2640、SPIRAM、bluetooth等完整功能

本文描述如何通过usercmodule(用户c模块)的方式,安装esp32-cam的OV2640摄像头驱动,并使固件具备支持4M SPIRAM、bluetooth等最新micropython内置模块。

注本文的主要软件版本:

Esp-idf:v4.0.2

Micropython:v1.18

一.操作系统安装

1.安装”ubuntu 20.04 LTS”,vmware或者windows的WSL均可,在ubuntu官网下载ISO,正常安装即可。

2.安装完成后安装一些依赖包

$ sudo apt-get install git wget libncurses-dev flex bison gperf python3 python3-pip python3-setuptools python3-serial python3-click python3-cryptography python3-future python3-pyparsing python3-pyelftools cmake ninja-build ccache libffi-dev libssl-dev python-is-python3

注意:

(1)cmake的版本可能不对,可以后面处理,方法见后。

(2)python-is-python3可能提示找不到,删除掉即可

二. Esp-idf开发环境安装

1.在ubuntu命令行模式下依次执行如下指令:

cd ~
git clone https://gitee.com/EspressifSystems/esp-gitee-tools.git
git clone https://gitee.com/EspressifSystems/esp-idf.git

执行结束后在~文件夹下生成esp-idf和esp-gitee-tools两个文件夹。

2.再执行如下指令:

cd esp-idf
git checkout v4.0.2
cd esp-gitee-tools
./submodule-update.sh ~/esp-idf/
./install.sh ~/esp-idf/

注意:

1.执行最后这个命令可能会出现提示:Installing ESP-IDF tools

/usr/bin/env: ‘python’: No such file or directory。

解决办法:sudo ln -s /usr/bin/python3 /usr/bin/python

2.最后这步会下载好几个比较大的tar包,网络不好的话通常会下载失败。

解决办法:使用迅雷分别下载包,再拷贝到~/.espressif/dist里面再重新执行命令即可。包名和路径仔细看命令执行失败的提示。

最后一条命令结束后会提示:

All done! You can now run:

  . /home/fat0x/esp-idf/export.sh

代表安装完成,这时执行source export.sh添加环境变量。这个命令只是临时添加,永久添加自行百度。如果后面make的时候提示idf.py找不到命令,那就是环境变量不对,重新执行这个source即可。

三.下载micropython

执行如下指令:

cd ~
git clone https://gitee.com/fat0x/micropython#(这行如果提示失败,资源已经失效,换成自己的资源地址即可)
cd micropython
make -C mpy-cross
cd ports/esp32
make submodules
make

注意:

(1)如果提示cmake版本过低,解决办法:

sudo apt remove --purge cmake
hash -r
sudo snap install cmake --classic)

(2)最后一个make是尝试进行一个板子的编译,看能否正常通过。不带任何参数,缺省的参数是BOARD=GENERIC,对应ports/esp32/boards/GENERIC这个文件夹所定义的板子。这是一个不带特殊配置的通用基础版,但是常用的wifi、蓝牙、sd等都带了。不带spiram等扩展配置。后面我们将以这个板子为基础来增加spiram、camera等模块。

四.安装相机驱动

$ 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文件夹是自己新建的。

(2)切换回~/micropython/ports/esp32/boards/GENERIC目录,打开mpconfigboard.h文件,应该只有两行:

#define MICROPY_HW_BOARD_NAME "ESP32 module"
#define MICROPY_HW_MCU_NAME "ESP32"

在末尾增加一行:

#define MODULE_CAMERA_ENABLED (1)

原因:官方文档倒数第2页提到,要使自己增加的模块生效,在增加模块的modcamera.c文件最后一行应该有MP_REGISTER_MODULE(MP_QSTR_camera, mp_module_camera_system, MODULE_CAMERA_ENABLED)一句,MODULE_CAMERA_ENABLED为1时,模块才能生效。文档也提到,MODULE_CAMERA_ENABLED可以通过make指令传入,也可以在mpconfigport.h或mpconfigboard.h中加入。为了不影响其他boards,我选择在boards/GENERIC/moconfigboard.h中加入了#define MODULE_CAMERA_ENABLED (1)这一行。

(3)重新编译:

make clean
make USER_C_MODULES=~/micropython/examples/usercmodule/cam/micropython.cmake

将/ports/esp32/build-GENERIC目录下生成的bootloader.bin、partition-table.bin、micropython.bin烧写进esp32,烧写方法自行百度不赘述。烧写完成后重启esp32,用thonny连接板子,如果在命令行中

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/GENERIC/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()

来查看内存信息。

最后,把我自己编译好的固件分享出来。

如果不想自己编译,下载烧写即可:

https://pan.baidu.com/s/1Ok0TEOS3xPkTl_wSDmeNtA?pwd=bbgb

六、后续的一些补充

1.esp-idf的两种安装方法

esp-idf在github和gitee都有镜像,github不稳定,没有科学的上网手段拉取和更新都异常痛苦;gitee是国内网站,速度很快,并且提供了把github上的项目同步到gitee的通道。

所以乐鑫提供了一个esp-gitee-tools工具,目的就是方便国内用户安装。

因此esp-idf也有两种安装方法:

(1)在esp-idf文件夹中./install.sh,更新地址全部指向github,国内用户很慢;

(2)在esp-gitee-tools文件夹中执行

./submodule-update.sh ~/esp-idf/

./install.sh ~/esp-idf/

这个方式速度快很多了。这个方法也是本文前述的方法。

2.micropython和esp-idf版本的匹配问题

二者的版本都在不断更新,会出现版本的不匹配的问题。如果你在micropython的编译时(在ports/esp32目录下执行make命令时)出现:

Failed to resolve component 'esp_adc',‘esp_mdns’,'esp_adc_cal'等错误提示,无法完成编译时,多半是遇到版本问题了。

esp-idf可以通过git checkout vx.x.x命令切换版本。

micropython在ports/esp32下也能通过git ehckout 切换,但是实测切换并不成功....

所以,无法解决的情况下只能通过切换esp-idf版本来将就micropython。

方法是先下载micropython后,什么都不做,进入到ports/esp32目录里去看README.md文件,其中有这些行:

If you already have a copy of the IDF then checkout a version compatible with
MicroPython and update the submodules using:

```bash
$ cd esp-idf
$ git checkout v5.0.2
$ git submodule update --init --recursive
```


你就根据这个提示的版本来设置你的esp-idf版本,可以确保版本匹配没有问题。

3.简易添加自己编写的python模块

用micropython编写的程序模块,如果想固化到固件里面去,可以通过最简单的方式:

把源程序放到ports/esp32/modules文件夹里去,然后重新编译micropython固件即可。

cd ~/micropython

Make -C mpy-cross

cd ports/esp32/

make clean

make

然后你就可以在thonny中通过命令:

help("modules")

看到你添加进去的模块了。

你可能感兴趣的:(python)