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

2021年4月30日金曜日

ESP32 Memo 〜 LED Blink 〜

■概要

今まででMicroPythonをDL、Buildして、ESP32で動かすことはできた。
( URL:MicroPython ESP32 Memo 〜Run Python Script〜 )
今度は、ESP32の電源をONして、どんな処理が行われて、MicroPythonが動くようになるのかを知りたい。

公式HPによると、MicroPythonは、4種類のモジュールに分けて作られているらしい。
(MicroPython libraries)

  • 標準的なPythonサブセットを実装しており、ユーザーによって拡張されることを想定していないモジュール
    (Modules which implement a subset of standard Python functionality and are not intended to be extended by the user. )
  • Pythonのサブセットを実装しており、ユーザーによって拡張されることを想定しているモジュール
    (Modules which implement a subset of Python functionality, with a provision for extension by the user (via Python code).)
  • Python標準ライブラリにMicroPython拡張機能を実装しているモジュール
    (Modules which implement MicroPython extensions to the Python standard libraries.)
  • 特定のMicroPythonポートに固有であり、移植生のないモジュール
    (Modules specific to a particular MicroPython port and thus not portable.)

上記のうち、4つ目の、移植性のないモジュールのところで、MicroPythonが動くまでの処理を知りたい。 この部分は、マイコンに固有の処理を行うところで、ここを知れば、他のマイコンにMicroPythonを移植することも可能だと思う。

最終的には、他のマイコンにMicroPythonを移植できるようになりたい。

現在、ESP32でMicroPythonを動かすことはできたものの、中身がどうなってるのかは不明。 というか、プログラムがどこから始まるのかもわかっていない。

そこで、まずはESP32の基本的な知識を学ぶ必要がある!
というわけで、プロジェクトを初めから作成して、Lチカまでできるようになるぞー!

■環境

  • PC : Mac OS Catalina
  • Board : ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32
  • 開発環境 : ESP-IDF

■前提知識

なし?

■手順

ESP-IDF Programming Guide を参考に作業を行う。
また、LEDの接続は、MicroPython ESP32 Memo 〜Run Python Script〜 と同じにする(32番ピンにLEDを接続)。 まずは開発環境の構築から。 と思ったけど、すでにやってたので、こちらを参照。
(URL: MicroPython ESP32 Memo 〜Build MicroPython〜)
環境変数の設定からはやっていないので、そこから始める。 ちなみに、ファイル構成は以下の通り。

MicroPython
    |- project
        |- esp-idf         // esp-idfのコードをクローンしたところ
        |- esp32_practice  // ここにLチカのプロジェクトを作る
        |- micropython     // micropythonのコードをクローンしたところ(今回は関係ない)
  

terminalでは、最初にMicroPythonフォルダにいるものとする。 というわけで、環境変数を設定する。

  1. 環境変数を設定する。
    「. $HOME/・・・/Micropython/project/esp-idf/export.sh」
    (※・・・ は割愛)
  2. エイリアスを設定する。(よく使う人向け)
    「alias get_idf='. $HOME/・・・/Micropython/project/esp-idf/export.sh'」
    これをすることで、「get_idf」だけで、環境変数の設定(esp-idf/export.sh)を実行できるようになるため、 esp-idfの環境の設定やリセットを簡単にできるようになる。

次に、プロジェクトを作成してビルドする。
(プロジェクトを作成すると言っても、サンプルプロジェクトをコピーするだけ。)

  1. プロジェクトを作成する。
    (サンプルのプロジェクト(hello_world)をコピーする)
    「cd project/esp32_practice」
    「cp -r ../esp-idf/examples/get-started/hello_world .」
  2. プロジェクトフォルダに移動する。
    「cd hello_world」
  3. ターゲットCPUを設定する。
    「idf.py set-target esp32」
    (※ この操作は、プロジェクトを作成してから1回だけ実行すべきらしい。)
  4. コンフィグレーションを設定する。
    「idf.py menuconfig」
    このmenuconfigで、Wifiの名前やパスワードなどを設定できるらしい。
    ただ、今回のhello_worldではデフォルトのままでいいので、何もいじらなくていいため、即閉じる。 (※ ESP32-DevKitC の ESP32-SOLO-1 が載っているのを使用している場合は、CONFIG_FREERTOS_UNICORE のパラメータを変更して、シングルコアモードをEnableにしないといけないらしい。)
  5. プロジェクトをビルドする。
    「idf.py build」

最後に、ビルドしたイメージをボードにダウンロード、動作を確認する。

  1. ボードをPCと接続する。
  2. ビルドしたイメージをボードにダウンロードする。
    「ls /dev/tty.usb*」
    (接続されたポートをチェックする。
     /dev/tty.usbserial-xxxx につながっていたと仮定する)
    「idf.py -p /dev/tty.usbserial-xxxx -b 460800 flash」
  3. 動作確認する。screenコマンドでシリアルをモニタする。
    カウントダウンと「Hello world!」が表示されれば成功!
    「screen /dev/tty.usbserial-xxxx 115200」

というわけで、プロジェクト作成(サンプルをコピーしただけ)とビルド、書き込みまではできたが、、、
LED、光らせてない。。。
というか知りたい情報はこれじゃない感。。。
とりあえず、LEDを光らせるまではやろうと思う。

サンプルの中に、LEDを点滅させるプロジェクトが実は用意されているので、これを利用する。

  1. LED点滅のプロジェクトをコピーする。 「cd ../」
    ( MicroPython/project/esp32_practice ディレクトリに移動)
    「cp -r ../esp-idf/examples/get-started/blink .」
  2. blinkプロジェクトフォルダに移動。
    「cd blink」
  3. ターゲットCPUを設定。 「idf.py set-target esp32」
  4. コンフィグレーションを設定する。
    今回は、LEDを点滅させるポートを変更するため、menuconfigを開く。
    「idf.py menuconfig」
  5. menuconfigが開いたら、LEDを点滅させるポートを変更する。 menuconfigの「Example Configuration」->「Blink GPIO number」を選択してEnter。
    LEDを接続しているポート(32番ピン)を入力してEnter。
    「S」を押して、Saveして、「Q」を押してQuit。
    menuconfigが閉じる。
  6. プロジェクトをビルドする。
    「idf.py build」
  7. ビルドしたイメージをボードにダウンロードする。
    「idf.py -p /dev/tty.usbserial-xxxx -b 460800 flash」
  8. LEDが1秒おきに点滅したら成功!
LEDの点滅までできた。
が、これではESP32の起動とか、どんなコード書いたらこうなるとか、全くわからん。

LED点滅のblink.cをみたが、void app_main(void) 関数のみが書いてあり、 その中で、FreeRTOSの vTaskDelay(1000 / portTICK_PERIOD_MS); を使って、1秒おきにGPIOのHigh/Lowを切り替えているだけだった。
一般的に、Bootloaderの実行が終わったら、main()関数が実行されるが、ESP32は、void app_main(void) 関数が実行されるようになっているらしい。
しかも、vTaskDelay()関数が実行されているということは、app_main()関数が実行されるまでに、 FreeRTOSの初期化関数等の実行もすでに完了されている。

知りたいのは、MicroPythonの実行のされ方。
ESP32の場合、MicroPythonは、FreeRTOSの上で動いているらしい。
つまり、FreeRTOSの初期設定が終わって、app_main()が実行されてから、MicroPythonの初期化を行って、REPLなどが実行されるようになっている?

とりあえず、ESP32は、bootloader実行後、app_main()関数が実行されることは分かったので、 MicroPythonのソースコードでapp_main()があるかどうかをみて、それを起点にMicroPythonのコードの中身を見ていきたい。
ちなみに、bootloaderで、ドライバやFreeRTOSなど、どんな設定をしているのかも知りたい。
・・・気が向いたら・・・。

2021年4月29日木曜日

MicroPython ESP32 Memo 〜Run Python Script〜

 ■概要

作成したMicroPythonファームウェアに、Python Scriptファイル(.pyファイル)をダウンロード、実行する。
やる内容は、main.pyファイルを作成し、ボードにダウンロード、main.pyを実行するまで。
main.pyには、LEDを点滅するコードを書く。

シリアルプロンプトによるREPL(Read Evaluate Print Loop)でのプログラム?はいろんなところに載っているので、書かなくてもいいかな。
ただ、作成したPython Script(.pyファイル)を実行するやり方はあんまり書かれてない気がするので、メモに残しておく。

■環境

  • PC : Mac OS Catalina
  • Board : ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32

■前提知識

ESP32は、ESP8266と大体同じ使い方ができるらしいので。。。

デバイスが 1Mbyte 以上のストレージを持っているなら、ファイルシステムを含むように(最初の起動時に)設定されます。このファイルシステムは FAT フォーマットを使用し、MicroPython ファームウェアの後にフラッシュに保存されます。
ESP32にも同じことが言える。
ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32の仕様は以下の通り。
  • Product Description
    • ESP32 general-purpose development board, embeds ESP32- WROOM-32D, 4 MB flash, with pin header
  • Flash Size
    • 4MB
  • Antenna Type
    • Internal PCB on- board antenna
  • Temperature
    • –40 °C ~ +85 °C
  • Dimensions (mm)
    • 54.4×27.9
Flash Sizeは4MBなので、ファイルシステムが構築される。

で、このファイルシステムの中に、実行するPython Script(.pyファイル)をおけば、実行することができる。ただ、どんな名前でも良いわけではない。
MicroPythonは、起動時、最初にboot.pyを実行する。
boot.pyの実行が終了すると、次にmain.pyを実行する。(なければ実行されない)
というようになっているので、boot.py or main.pyを作成すれば、とりあえず動かすことができる。

ただ、デフォルトでは、REPLがされるっぽいので、ソフトリセットをすることで、Python Scriptを実行するモードにしなければならない。

以上を踏まえて、
  • main.pyを作成する。
  • main.pyをボードにダウンロードする。
  • Python Scriptが実行されるモード?にする。
の手順を行えば、作成したPython Scriptが起動後実行されるようになる。

■手順

ボードにLEDと抵抗を配線をする。
以下のように配線する。
  • ESP32ボードの32番ピン - LEDのアノード
  • LEDのカソード - 抵抗 47Ωの片方
  • 抵抗47Ωのもう片方 - ESP32ボードのGNDピン

次に、事前準備として、ampyをインストールしておく。
ampyは、Adafruit社が開発したツールで、シリアル回線経由でPCとボードとの間でファイル転送ができる。(参考 : ampy: MicroPythonマイコンとPCとのファイル転送ツール
  1. ターミナルで、以下のコマンドでampyをインストールする。
    「sudo pip install adafruit-ampy」

次に、Python Scriptファイル main.pyファイルを作成する。
main.pyはこんな感じ。

from machine import Pin
import time

p32 = Pin(32, Pin.OUT)

while True:
    print("LED ON")
    p32.on()                 # set pin to "on" (high) level
    time.sleep(1)
    print("LED OFF")
    p32.off()                # set pin to "off" (low) level
    time.sleep(1)

次に、作成したmain.pyをボードにダウンロードする。
先ほどインストールしたampyを使ってダウンロードする。
こちらのサイト(URL : ampy: MicroPythonマイコンとPCとのファイル転送ツール)を参考にした。
  1. PCとボードをUSBで接続する。
  2. ターミナルでmain.pyを保存した場所に移動する。
    (scriptsフォルダに保存している場合)
    「cd scripts」
  3. 接続されたポートをチェックする
    「ls -l /dev/tty.usb*」
    /dev/tty.usbserial-xxxx (xは数字?)が接続ポート。
  4. ボード(のFlash)に保存されているファイルを表示する。
    「ampy --port=/dev/tty.usbserial-xxxx ls」
    (※ デフォルトでは、boot.py だけが表示された。)
  5. 作成したmain.pyをボードにダウンロード(保存)する。
    「ampy --port=/dev/tty.usbserial-xxxx put main.py」
  6. main.pyがボードに保存されたかどうかを確認する。
    「ampy --port=/dev/tty.usbserial-xxxx ls」
    boot.pyに加えて、main.pyが追加されていれば成功!
ダウンロードしただけでは、ボードはREPLで動いている。
そのため、最後に、ソフトウェアリセットして、REPLで動くモードから、Scriptで動くモードにして、main.pyを実行させる。
LEDがチカチカするはず!
  1. ターミナルでREPLの画面を出す。
    「screen /dev/tty.usbserial-xxxx 115200」( ※ 115200bps )
    (※REPLが動いているので、Enterを押すと「>>>」が表示されるはず。)
  2. ボードをソフトウェアリセットする。
    screenで接続している時に、「Ctrl+D」でソフトウェアリセットできる。
    ソフトウェアリセットされて、REPLでなく、ただのシリアル通信として繋がり、
    「LED ON」「LED OFF」が表示されつづけ、LEDが点滅していれば成功!
ちなみに。。。
ampyでもリセットできるっぽい。
「ampy --port=/dev/tty.usbserial-xxxx reset」
これでも、ソフトウェアリセットがかかって、Scriptが実行されるはず。

終わり!

2021年4月11日日曜日

MicroPython ESP32 Memo 〜Build MicroPython〜

 ■概要

MicroPythonのbinaryファイルダウンロードしてを書き込んだら動いた!
ので、今度はMicroPythonをビルドしたい!

ので、MicroPythonをgitから持ってきて、ビルドして、binaryファイル作って、ボードで動かすまで。

■環境

  • PC : Mac OS Catalina
  • Board : ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32

■手順

基本的に、MicroPythonの公式の通り。

まず、Gitからソースコードを取得する。
Git Hubのアカウントを持ってなかったら、作成しておく必要あり。
PCにgitをインストールしておく必要あり。
  1. 公式のmicropythonリポジトリをforkする。
    1. Git Hubにログイン(ブラウザから)
    2. ログインしたら、Search or Jump to... で「micropython/micropython」を検索して、公式のMicroPythonリポジトリにアクセス。
    3. 「fork」ボタンを押して、自分のリポジトリに公式のMicroPythonリポジトリをforkする。
    4. 自分のアカウントにmicropythonリポジトリができていることを確認する。
      自分のmicropythonリポジトリURL :
      https://github.com/<your-user-name>/micropython」
  2.  ローカルにプロジェクト(ソースコード etc.)をcloneする。
    1. terminalでmicropythonのソースコードを保存するところに移動する。
      「cd project」(projectフォルダに入れる場合)
    2. 自分のmicropythonリポジトリからプロジェクトをcloneする。
      「git clone https://github.com/<your-user-name>/micropython」
  3. 公式のmicropythonリポジトリを自分のmicropythonリポジトリの上流ブランチに設定する
    (公式のMicroPythonリポジトリで更新された内容を、自分のmicropythonリポジトリが追従できるようにする設定)
    (※ 上流ブランチと追跡ブランチの説明
    1. terminalで、cloneしたmicropythonフォルダに移動
      「cd micropython」
    2. 公式のMicroPythonリポジトリを自分のmicropythonリポジトリの上流ブランチに設定する
      「git remote add upstream https://github.com/micropython/micropython」
      (※ 多分、upstream xxxx で、xxxxが上流ブランチであることを教えてる?)
      (※ この設定で、「git pull」により公式のMicroPythonリポジトリの変更を反映できるようになる?気がする。ちなみに、pullは、fetchしてmergeするのと同じことらしい(fetchとpullの違い)。)
    3. 上流ブランチを設定できたか確認。
      「git remote -v」
      以下のような表示が出るはず。
      「origin       https://github.com/<your-user-name>/micropython (fetch)
      origin       https://github.com/<your-user-name>/micropython (push)
      upstream     https://github.com/micropython/micropython (fetch)
      upstream     https://github.com/micropython/micropython (push)」
  4. 作業用branchを作成する。
    1. terminalで、cloneしたmicropythonフォルダに移動
    2. 作業用branchを作成して、作業用branchに切り替える。
      (develop-branch というbranchを作成して、master→develop-branch に切り替え)
      「git checkout -b develop-branch」
次に、クロスコンパイルに必要なソフトウェアパッケージをインストールする。
公式のMicro Python on MacOSを参考にした。
  1. Xcodeが入ってなければ入れる。(clang コンパイラを入れるため)
  2. 必要なソフトウェアパッケージをインストール。
    「brew install libffi」
    「brew install pkgconfig」
    Pythonをインストールしてなければ、Python3.3以上をインストール。
    Gitもインストールしてなければインストール。
次に、クロスコンパイラをビルドする。
  1. terminalで、cloneしたmicropythonフォルダに移動。
    (すでにいる気がするなぁ)
    「cd micropython」
  2. クロスコンパイラをビルドする。
    「export PKG_CONFIG_PATH=/usr/local/Cellar/libffi/3.2.1/lib/pkgconfig/」
    「make -C mpy-cross」
    (※ home brewでlibffiを入れたので、export PKG_CONFIG・・・が必要。)
  3. クロスコンパイラのビルドが成功したら、
    micropython/mpy-crossフォルダの中に、
    mpy-cross.map, build, mpy-cross ができてる。
そしてついに、micropythonをビルドする!
が、まずは手始めに、unix用をビルドする。
Mac上で動かすことが可能なmicropythonが出来上がるはず。
  1. 「cd micropython/ports/unix」
  2. 「make axtls」
    (※ axtlsは、少量のメモリフットプリントの高度な設定インターフェイスで組み込みデバイス向けに設計されたTLSv1 SSLライブラリ。)
    結構時間かかる。
  3. micropython (unix用)をビルドする
    「make」
    結構時間かかる。
  4. ビルドが完了すると、micropython/ports/unix 以下に、build-standard, micropython フォルダなどが追加されている。
  5. micropython (unix用)を動かす。
    「./micropython」
    実行すると、以下のように、>>> が表示されて、おなじみのpythonっぽい表示が!

    「unix % ./micropython 

     MicroPython v1.14-152-g6f06dcaee on 2021-04-12; darwin version

     Use Ctrl-D to exit, Ctrl-E for paste mode

     >>>        」


ほんとについに!micropython ESP32用をビルドする。
が、今までのはunix用の環境設定+ビルド方法だったみたい。
ESP32用をビルドするためには、ESP32に合わせた環境設定からはじめないといけない。
公式のmicropython ESP32のREADMEにしたがって進める。

というわけで、micropython ESP32用の環境設定を行う。
まずは、esp32の開発環境のEspressif IDF version 4 をインストールする。
Espressif IDFを略して ESP-IDF と言ってるっぽい?
ESP-IDF のプログラミングガイドに、MacOSの場合のインストールの方法が書いてあったので、これ参考にする。micropython ESP32のREADMEよりも詳しく書かれてるし。
(pip, python, homebrew はインストールずみとする。)
  1. 事前準備として必要なパッケージをインストール
    「brew install cmake ninja dfu-util」
    「brew install ccache」
  2. ESP-IDFをclone
    (※ micropythonをcloneしたディレクトリと同じ階層にclone)
    (※ 2021/04/14現在、安定版の最新がv4.2)
    「git clone -b v4.2 --recursive htps://github.com/espressif/esp-idf.git」
  3. ESP-IDFをインストール
    「cd esp-idf」
    「./install.sh」
    → エラーが出た。。。Python2.7がカレントバージョンになってるのがダメらしい。
     Python3をカレントバージョンにして実行するとよい。(参考 : macOS Catalina zsh環境でpyenvを使ってPython 3.9.0をインストール)
    「source export.sh」
    (※ idf.py が使えるようになったよ!と表示されるが、よくわからん)
  4. micropythonをビルド
    1. cloneしたmicropythonフォルダに移動
      「cd ../micropython」
    2. クロスコンパイラをビルド
      「make -C mpy-cross」
    3. ESP32のソースコードが置いてあるところに移動
      「cd ports/esp32」
    4. サブモジュールをビルド
      (サブモジュールをアップデートしているだけ?)
      「make submodules」
    5. ESP32 micropythonをビルド
      「make」
    6. ESP32 micropythonがビルドてきたかどうかを確認する
      「ls」で、「build-GENERIC」フォルダができていることを確認。
      「ls build-GENERIC」で、firmware.bin ができていることを確認。
      できてればOK !!!
バイナリファイル ができたので、動作確認をする。
MicroPython ESP32 Memo 〜FW書き込み〜 に書いた方法で、作成したfirmware.bin を書き込むことができる。
MicroPythonの公式(MicroPython Internals Getting Started)には、idf.pyを使った書き込み方法が書かれているので、こちらの方法を試してみる。
(ただ、idf.pyは、中でesptool.pyを使って書き込んでいるだけなので、やっていることは同じはず?)
  1. cloneしたmicropythonフォルダのports/esp32に移動
    (上から続けてれば何も操作はいらないはず?)
  2. ESP32ボードをUSBでPCと繋ぎ、接続されたポートを調べる。
    「ls -l /dev/tty.usb*」
    (/dev/tty.usbserial-xxxx につながっていたと仮定する)
  3. ESP32ボードのflashをクリアする。
    「make erase PORT=/dev/tty.usbserial-xxxx」
    (※ 引数にPORT=xxxxをつけることで、ターゲットのポートを設定できる。
       デフォルトは/dev/ttyUSB0 となっているため、ちゃんとポート指定しないとエラーになる。)
  4. EPS32ボードにファームウェアを書き込む
    「make deploy PORT=/dev/tty.usbserial-xxxx」
    (※ make と実行すると、idf.pyが実行されるようになっている。
       idf.pyを直接使い方法もMicroPythonの公式HPに書かれている)
(※ [補足]
idf.pyで書き込む時、書き込まれるバイナリファイルは、build-GENERICフォルダ内の、partition_table/partition-table.bin(WriteAddress:0x8000〜)、bootloader/bootloader.bin(WriteAddress:0x1000〜)、micropython.bin(WriteAddress:0x10000〜)の3つ。
firmware.binはこの3つを合わせたバイナリファイルとなっている。 )

書き込んだら、「screen <USBport> 115200」で接続し、Pythonおなじみの
>>> 
が表示されることを確認した。

やった!できたよ!

2021年4月9日金曜日

MicroPython ESP32 Memo 〜FW書き込み〜

■概要

MicroPython を始める時の覚書。
ボードに出来上がりのMicroPythonを書き込んで動作確認するまで。

■環境

  • PC : Mac OS Catalina
  • Board : ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32

■手順

基本的に、MicroPythonの公式ページの通り
公式はpipだが、brewでもできた気がする
  1. MicroPythonのFWをダウンロード
    (Firmware with ESP-IDF v3.x のSPIRAMじゃないほうの最新を使った)
    (URL : Firmware for Generic ESP32 module)
  2. PCとボードをUSBで接続する
  3. terminalを開き、FWを保存したディレクトリにcd コマンドで移動
  4. epstoolをインストールする
    「pip3 install esptool」
  5. 接続されたポートをチェックする
    「ls -l /dev/tty.usb*」
    /dev/tty.usbserial-xxxx (xは数字?)が接続ポート。
  6. フラッシュを消去する
    「esptool.py --port /dev/tty.usbserial-xxxx erase_flash」
  7. フラッシュにFWを書き込み
    「esptool.py --chip esp32 --port /dev/tty.usbserial-xxxx write_flash -z 0x1000 esp32-idf3-20210202-v1.14.bin」
    (esp32-idf3-20210202-v1.14.bin が最新でした @2021/04/09 )
  8. 終わり!

動作確認する。
デフォルトでは、シリアル通信でREPLを利用できる。
  1. PCとボードをUSBで接続する
  2. terminal を開く。
  3. 接続されたポートをチェックする
    「ls -l /dev/tty.usb*」
    /dev/tty.usbserial-xxxx (xは数字?)が接続ポート。
  4. 「screen /dev/tty.usbserial-xxxx 115200」( ※ 115200bps )
    適当にEnterを押すと、「>>>」が表示され、Pythonのインタプリタが使える。はず。

■参考