■概要
MicroPythonで、FFTで周波数抽出したりしたい。
MicroPythonのデフォルトには、FFTを使ったりするモジュールは入っていないらしい。
調べると、ulabというモジュールが使えるらしい。
MicroPythonにulabを組み込んでビルドするまでの手順をまとめる。
■環境
- PC : Mac OS Catalina
- Board : ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32
- 開発環境 : ESP-IDF
■前提知識
■手順
基本的には、 micropython-ulab のREADMEに書いてある内容。(一部違う) とりあえず、できた手順を忘れないようにまとめる。
■ディレクトリ構成
MicroPython |- project |- esp-idf // esp-idfのコードをクローンしたところ |- micropython // micropythonのコードをクローンしたところ |- ulab // ulabのコードをクローンしたところ
■ビルドディレクトリのexport
-
「project」ディレクトリを開く
「cd project」 -
ビルドディレクトリをexport
「export BUILD_DIR=$(pwd)」
■micropython, esp-idfのclone
MicroPython ESP32 Memo 〜Build MicroPython〜 を参照。
■ulabのclone
-
ビルドディレクトリを開く
「cd $BUILD_DIR」 -
ulab をcloneする。
「git clone https://github.com/v923z/micropython-ulab.git ulab」
■esp-idfのビルドとパスを通す
-
ビルドディレクトリを開く
「cd $BUILD_DIR」 -
esp-idfディレクトリに移動
「cd esp-idf」 -
esp-idfのインストールとパスを通す
「./install.sh」
「. ./export.sh」
■micropythonのクロスコンパイラとESP32のサブモジュールをビルドする
-
ビルドディレクトリを開く
「cd $BUILD_DIR」 -
micropythonのクロスコンパイラをビルドする
「cd $BUILD_DIR/micropython/mpy-cross」
「make」 -
ESP32のサブモジュールをビルドする
「cd $BUILD_DIR/micropython/ports/esp32」
「make submodules」
■micropythonのビルド設定を変更する
ulabモジュールをビルドに追加する
-
makefileを開く
「cd $BUILD_DIR/micropython/ports/esp32」
「vi Makefile」 -
ulabモジュールを追加する。
「BOARD ?= GENERIC」となっているところを、以下のように変更する。# BOARD ?= GENERIC BOARD = GENERIC USER_C_MODULES = $(BUILD_DIR)/ulab/code/micropython.cmake
- Escを押してから、「:wq」を入力し、Enterを押して、ファイルを保存する。
パーティション(メモリ割り当て)の変更
ESP32のデフォルトのパーティション設定では、ulabを追加してビルドすると、サイズエラーが出る。
アプリケーション領域が小さいっぽい。そのため、パーティション設定を変更する。
パーティション設定は、デフォルトでは、partitions.csvが利用されている。
そのため、ulab用のパーティションファイル
partition_ulab.csvを作成して、設定をpartition_ulab.csv に変更する。
ulab用パーティションファイルを作成する
-
パーティションファイルを作成する。
「cd $BUILD_DIR/micropython/ports/esp32」
「vi partitions_ulab.csv」 -
partitions_ulab.csv を以下のようにする。
# Notes: the offset of the partition table itself is set in # $ESPIDF/components/partition_table/Kconfig.projbuild and the # offset of the factory/ota_0 partition is set in makeimg.py # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x6000, phy_init, data, phy, 0xf000, 0x1000, factory, app, factory, 0x10000, 0x200000, vfs, data, fat, 0x220000, 0x180000,
- Escを押してから、「:wq」を入力し、Enterを押して、ファイルを保存する。
- パーティションファイルを作成する。
ulab用パーティションファイルを使用するように設定を変更する
-
sdkconfig.base を開く
「cd $BUILD_DIR/micropython/ports/esp32/boards」
「vi sdkconfig.base」 -
sdkconfig.base を変更する。
「CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"」となっているところを、以下のように変更する。#CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_ulab.csv"
- Escを押してから、「:wq」を入力し、Enterを押して、ファイルを保存する。
■micropython(ulab入り)のビルド
- 「cd $BUILD_DIR/micropython/ports/esp32/」
- 「make clean」 (過去にmicropython のビルド等をしている場合、必要かも?エラーが出ることがある?)
- 「make」
■動作確認
ESP32にダウンロードして、REPLで動かし、 「import ulab」として、エラーが出なかったらOK! 「help(ulab)」で、numpyやscipyが使えるのがわかる。
ダウンロード
- 「cd $BUILD_DIR/micropython/ports/esp32」
- 「make erase PORT=/dev/tty.usbserial-xxxx」
- 「make deploy PORT=/dev/tty.usbserial-xxxx」
動作確認
- 「screen /dev/tty.usbserial-xxxx 115200」
-
MicroPythonのREPLが実行されたら
「import ulab」
「help(ulab)」