概要
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があったのでそれで試したら、WindowsとLinuxのパス表記の違いが原因のエラーを乗り越えられなかった。次に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で、自作モジュールを動かすことができた。