Table of Contents
ESP-IDFのインストール
MicroPythonではESP32用にビルドする開発環境として ESP-IDF を利用しています。
Get Started を参考にインストールを進めます。以下に注意点を記載します。
- Step 1 はMac OSの手順を参照しましょう。
- Step 2 でESP-IDFのソースコードをクローンする際、バージョンを
v4.0.2
を指定する必要があります。詳細は こちら を参照ください。 - 今回はStep 4まで実施すればOKです。
Toolchainのインストール
今回はMacOS上でESP32用のコンパイル(いわゆるクロスコンパイル)を行うため、Toolchainをインストールしておく必要があります。
Setup Toolchain を参考に以下コマンドでインストールします。
$ cd ~/esp
# Toolchainをダウンロードして展開
$ wget https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
$ tar -xzf ~/Downloads/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
# PATHを通す
$ export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH
# 不要となったファイルを削除
$ rm xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
MicroPythonを取得
MicroPythonのソースコードをクローンし、 ~/esp
に配置します。
$ cd ~/esp
$ git clone https://github.com/micropython/micropython
ビルド
ビルド前に組込みスクリプトの一部をバイトコードにプリコンパイルする必要があります。以下コマンドでプリコンパイルします。
$ cd ~/esp/micropython
$ make -C mpy-cross
プリコンパイルが完了したら、ESP32用のディレクトリへ移動してビルドします。
$ cd ~/esp/micropython/ports/esp32
$ make submodules
$ make
イメージの書き込み
以下のコマンドを実行して、Flashを初期化した後、イメージを書き込みます。 シリアルポートの確認方法は 前回の記事 を参照ください。
$ make erase BAUD=115200 PORT=/dev/cu.usbserial-0001
$ make deploy BAUD=115200 PORT=/dev/cu.usbserial-0001
書き込みが完了したら、シリアル接続してREPLが立ち上がることを確認します。
$ screen /dev/tty.usbserial-0001 115200
MicroPython v1.17-84-gba940250a on 2021-10-20; ESP32 module with ESP32
Type "help()" for more information.
>>> print('Hello world.')
Hello world.
>>>
ビルド時に外部Cモジュールを含める
ここまでの手順で、普通にビルドしてデバイスに書き込めることを確認しました。今度はMicroPythonにCモジュールを追加してビルドしてみます。
MicroPythonのリポジトリには以下のようなサンプルの外部Cモジュールが含まれています。
$ ls ~/esp/micropython/examples/usercmodule/cexample
examplemodule.c micropython.cmake micropython.mk
これを含めてビルドするため、USER_C_MODULES
という環境変数を使用します。
$ cd ~/esp/micropython/ports/esp32
$ make clean
$ make submodules
$ make USER_C_MODULES=../../../examples/usercmodule/cexample/micropython.cmake
ビルドが完了したら、先ほどと同様の手順で書き込みます。
$ make erase BAUD=115200 PORT=/dev/cu.usbserial-0001
$ make deploy BAUD=115200 PORT=/dev/cu.usbserial-0001
REPLに繋いで、追加した外部Cモジュールがimportできることを確認します。
$ screen /dev/tty.usbserial-0001 115200
MicroPython v1.17-84-gba940250a on 2021-10-27; ESP32 module with ESP32
Type "help()" for more information.
>>> import cexample
>>> print(cexample.add_ints(1, 3))
4
まとめ
以上の方法で、MicroPythonをESP32用にビルドし、かつ外部Cモジュールをimportして使用できるようになりました。組込みだと、H/WにアクセスするライブラリがC言語でしか提供されていないことも多いので、ラッパーを作成してPythonから実行できるのはありがたいですね。性能面を追求したい場合にもC言語で実装することで改善が見込めるかもしれません。
みなさまもぜひお試しください。