Fusic Tech Blog

Fusion of Society, IT and Culture

MicroPythonをESP32用にビルドしてC Moduleを追加できるようにする
2021/10/27

MicroPythonをESP32用にビルドしてC Moduleを追加できるようにする

IoTチームの岡嵜です。

前回の記事 でESP32用のMicroPythonのイメージを動かすことに成功しました。

入手したイメージにはPinやPWMといった必要最低限のライブラリは既に含まれており、これだけでもいろいろ遊べそうです。ただ、「特定のH/Wに依存した処理」や「MicroPythonには含まれていないライブラリを利用したいケース」ではMicroPythonを自分でビルドする必要が出てきます。

そこで、今回はMac OS上でMicroPythonをビルドする環境を構築する手順をまとめます。終わりにC Moduleの追加方法にも触れます。

MicroPythonlogo

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言語で実装することで改善が見込めるかもしれません。

みなさまもぜひお試しください。

参考

yuuu

yuuu

2018年の年明けに組込み畑からやってきた、2児の父 兼 Webエンジニアです。 mockmockの開発・運用を担当しており、組込みエンジニア時代の経験を活かしてデバイスをプログラミングしたり、簡易的なIoTシステムを作ったりしています。主な開発言語はRuby、時々Go。