工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

ESP32向けのmicropythonで、Cで実装した自作モジュールをESP32上で動かす【修正版】

概要

ESP32向けのmicropythonで、Cで実装した自作モジュールを作成した。


背景と目的

かつて、micropythonをESP32で動かして遊んでみたのだが、それ以来ほとんど触っていなかった。しかし、最近とある事情でESP32向けのmicropythonで、Cで実装した自作モジュールを作成したくなった。そこで、環境整備と実際にサンプルモジュールの作成をしてみる。


詳細

0.実施条件

後述のUbuntu(Windows Subsystem for Linux)において、ユーザーのホームディレクトリにて、ESP-IDF、MicroPython、追加Cモジュールなどをインストールして作業した結果を記述する。


1.Ubuntuを入れる

Linux環境がないので、Windows Subsystem for Linuxを有効にして、Ubuntuを入れる。

https://qiita.com/Aruneko/items/c79810b0b015bebf30bb

手順は上記に従う。

追加で必要なもの

rootじゃないとき、sudoつけて。

sudo apt install gcc
sudo apt install make
sudo apt install dos2unix
sudo apt install python3-pip
sudo apt install python2


2. micropythonを入れる

まず、gitからクローニング。2020/05/16時点でのmasterブランチを使用。

git clone --recursive https://github.com/micropython/micropython.git

次に、micropythonのクロスコンパイラを作成。

cd micropython/mpy-cross
sudo make

最後に、対応するESP-IDFのバージョンを確認する。

https://github.com/micropython/micropython/blob/master/ports/esp32/Makefile

によれば、

# The git hash of the currently supported ESP IDF version.
# These correspond to v3.3.2 and v4.0.
ESPIDF_SUPHASH_V3 := 9e70825d1e1cbf7988cf36981774300066580ea7
ESPIDF_SUPHASH_V4 := 463a9d8b7f9af8205222b80707f9bdbba7c530e1

とあるので、3で、このバージョンを指定する。


3. ESP-IDFを入れる

micropythonは、特定のversionのESP-IDFが必要で、うえで確認した通り、v3.3.2が必要。なので、gitでバージョンを指定してクローニング。

git clone -b v3.3.2 --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
git rev-parse HEAD # 念のためハッシュを確認

そのあと、以下を実施。

bash ./install.sh
. ./export.sh # ドットに注意


4. 追加モジュールをコンパイル

https://micropython-docs-ja.readthedocs.io/ja/latest/develop/index.html

いよいよ自作モジュールを作るのだが、具体的な手順は上記に従えばよい。

4.1 サンプルの外部Cモジュールのファイル一式を作成

リンク先を参考に、

MicroPythonProjects/
    modules/
        example/
            example.c
            micropython.mk

となるように配置。


4.2 make

cd ~/micropython/ports/esp32
make USER_C_MODULES=~/MicroPythonProjects/modules CFLAGS_EXTRA=-DMODULE_EXAMPLE_ENABLED=1 all

ビルドが正常に終わると、以下のような表示。

   text    data     bss     dec     hex filename
1102348  267680   46676 1416704  159e00 build-GENERIC/application.elf
Create build-GENERIC/application.bin
esptool.py v2.8
Create build-GENERIC/firmware.bin
bootloader     21328
partitions      3072
application  1370160
total        1435696


5.追加モジュールを参照してみる

書き込みは、以前用意したFlash Download Toolsがあるので、Windows側でやってしまう。手順は、以前の記事と同じだが、指定するファイルを3で作成されたfirmware.binを指定。

"C:\Users\{UserName}\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\root\micropython\ports\esp32\build-GENERIC\firmware.bin"

書き込み後実行してみた結果、以下のように、自作モジュールがちゃんと動いた。


6. あとがき

1~3をサラッと書いているが、実際にmakeが正常に完了するようになるまでかなりてこずった。 はじめUNIX環境として手元にESP-IDF用に入れたmingwがあったのでそれで試したら、WindowsLinuxのパス表記の違いが原因のエラーを乗り越えられなかった。次にCygwinを試したら、toolschainがCygwinに対応していないなど、あとから考えればただ注意書きを読んでいないだけというお粗末な問題にぶち当たり、 結局Ubuntuを入れることで、どうにかたどり着いた。無駄に迷走した。


参考

https://micropython-docs-ja.readthedocs.io/ja/latest/develop/index.html https://github.com/micropython/micropython/blob/master/ports/esp32/README.md


まとめと今後の課題

ESP32向けのmicropythonで、自作モジュールを動かすことができた。