2021年8月11日水曜日

MicroPython ESP32 Memo 〜Add micropython-ulab〜

■概要

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

  1. 「project」ディレクトリを開く
    「cd project」
  2. ビルドディレクトリをexport
    「export BUILD_DIR=$(pwd)」

■micropython, esp-idfのclone

MicroPython ESP32 Memo 〜Build MicroPython〜 を参照。

■ulabのclone

  1. ビルドディレクトリを開く
    「cd $BUILD_DIR」
  2. ulab をcloneする。
    「git clone https://github.com/v923z/micropython-ulab.git ulab」

■esp-idfのビルドとパスを通す

  1. ビルドディレクトリを開く
    「cd $BUILD_DIR」
  2. esp-idfディレクトリに移動
    「cd esp-idf」
  3. esp-idfのインストールとパスを通す
    「./install.sh」
    「. ./export.sh」

■micropythonのクロスコンパイラとESP32のサブモジュールをビルドする

  1. ビルドディレクトリを開く
    「cd $BUILD_DIR」
  2. micropythonのクロスコンパイラをビルドする
    「cd $BUILD_DIR/micropython/mpy-cross」
    「make」
  3. ESP32のサブモジュールをビルドする
    「cd $BUILD_DIR/micropython/ports/esp32」
    「make submodules」

■micropythonのビルド設定を変更する

ulabモジュールをビルドに追加する

  1. makefileを開く
    「cd $BUILD_DIR/micropython/ports/esp32」
    「vi Makefile」
  2. ulabモジュールを追加する。
    「BOARD ?= GENERIC」となっているところを、以下のように変更する。
    # BOARD ?= GENERIC
    BOARD = GENERIC
    USER_C_MODULES = $(BUILD_DIR)/ulab/code/micropython.cmake
        
  3. Escを押してから、「:wq」を入力し、Enterを押して、ファイルを保存する。

パーティション(メモリ割り当て)の変更

ESP32のデフォルトのパーティション設定では、ulabを追加してビルドすると、サイズエラーが出る。
アプリケーション領域が小さいっぽい。そのため、パーティション設定を変更する。

パーティション設定は、デフォルトでは、partitions.csvが利用されている。
そのため、ulab用のパーティションファイル partition_ulab.csvを作成して、設定をpartition_ulab.csv に変更する。

ulab用パーティションファイルを作成する

  1. パーティションファイルを作成する。
    「cd $BUILD_DIR/micropython/ports/esp32」
    「vi partitions_ulab.csv」
  2. 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,
        
  3. Escを押してから、「:wq」を入力し、Enterを押して、ファイルを保存する。
  4. パーティションファイルを作成する。

ulab用パーティションファイルを使用するように設定を変更する

  1. sdkconfig.base を開く
    「cd $BUILD_DIR/micropython/ports/esp32/boards」
    「vi sdkconfig.base」
  2. sdkconfig.base を変更する。
    「CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"」となっているところを、以下のように変更する。
    #CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
    CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_ulab.csv"
        
  3. Escを押してから、「:wq」を入力し、Enterを押して、ファイルを保存する。

■micropython(ulab入り)のビルド

  1. 「cd $BUILD_DIR/micropython/ports/esp32/」
  2. 「make clean」 (過去にmicropython のビルド等をしている場合、必要かも?エラーが出ることがある?)
  3. 「make」

■動作確認

ESP32にダウンロードして、REPLで動かし、 「import ulab」として、エラーが出なかったらOK! 「help(ulab)」で、numpyやscipyが使えるのがわかる。

ダウンロード

  1. 「cd $BUILD_DIR/micropython/ports/esp32」
  2. 「make erase PORT=/dev/tty.usbserial-xxxx」
  3. 「make deploy PORT=/dev/tty.usbserial-xxxx」

動作確認

  1. 「screen /dev/tty.usbserial-xxxx 115200」
  2. MicroPythonのREPLが実行されたら
    「import ulab」
    「help(ulab)」

■参考URL