この記事はMicroPython Advent Calendar 2017の3日目の投稿です。昨日は ken5owataさん投稿のmicropythonをはじめよう(STM32F401編)でした。
小ネタですがご容赦を。
まだ正式にはBluetoothがサポートされないESP32のMicroPythonですが、インターフェース誌2018年1月号にBLEをサポートしたMicroPythonビルドの記事が載っていました。記事サンプルからも大体の手順はわかるかと思います。インターフェース誌の記事では Ubuntu で作業していますが、ここでは私のメイン環境である macOS 上でビルドしてみます。
ESP32のボードはインターフェース誌の記事と同じESP32-DevKitCを使いました。
ツールチェーンの取得と設定
ESP32の開発環境の情報は以下にあります。
macOS用のツールチェーン導入方法は以下にあります。
これにしたがって、macOS用のツールチェーンをダウンロードして展開します。
$ mkdir ~/esp
$ cd ~/esp
$ curl https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-75-gbaf03c2-5.2.0.tar.gz -O
$ tar zxf xtensa-esp32-elf-osx-1.22.0-75-gbaf03c2-5.2.0.tar.gz
~/.bashrc に以下を追加します。
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
ESP-IDFの取得と設定
ESP-IDFの導入方法は以下に説明があります。
これにしたがって、github より ESP-IDF を clone します。
$ git clone --recursive https://github.com/espressif/esp-idf.git
~/.bashrc に以下を追加します。
export ESPIDF=~/esp/esp-idf
export IDF_PATH=~/esp/esp-idf
MicroPythonソースの取得
MicroPython 本家のソースではなく、インターフェース誌の記事の著者である西本卓也さんが公開しているものを github から clone します。これは本家 MicroPython に対して MrSurly さんがプルリクエストしていたものを取り込み、パーティション定義を変更したものとのことです。
$ git clone https://github.com/micropython/micropython-lib.git
$ git clone --recursive https://github.com/nishimotz/micropython-esp32.git
利用するESP-IDFリビジョンのチェックアウト
以下を実行して、利用するESP-IDFのリビジョンを調べます。
$ cat micropython-esp32/ports/esp32/Makefile | grep ESPIDF_SUPHASH
ESPIDF_SUPHASH := 2c95a77cf93781f296883d5dbafcdc18e4389656
ifneq ($(ESPIDF_CURHASH),$(ESPIDF_SUPHASH))
$(info Supported git hash: $(ESPIDF_SUPHASH))
$(ECHO) "ESP IDF supported hash: $(ESPIDF_SUPHASH)"
ESPISF_SUPHASH の値が 2c95a77cf93781f296883d5dbafcdc18e4389656
で
あることがわかったので、この値でチェックアウトを行います。
$ cd esp-idf
$ git checkout 2c95a77cf93781f296883d5dbafcdc18e4389656
$ git submodule update --init --recursive
$ cd ..
MicroPython のビルド
$ cd micropython-esp32
$ make -C mpy-cross
$ cd ports/esp32
$ make
ESP32-DevKitCへの書込み
ESP32-DevKitC とMacをmicroUSBケーブルで繋ぎます。ポートは私の環境では /dev/tty.SLAB_USBtoUART
になりました。このポートを指定して、以下で書込みます。
PORT=/dev/tty.SLAB_USBtoUART make erase
PORT=/dev/tty.SLAB_USBtoUART make deploy
動作確認
とりあえず、ターミナル.app を開いて screen コマンドでシリアル接続して REPL が起動するかを確認します。
$ screen /dev/tty.SLAB_USBtoUART 115200
REPLのプロンプト >>
が現れ、キーボードからの入力が受け付けられればOKです。
screen コマンドを抜けるには control-a k とします。
Lチカっぽいこと
ESP32-DevKitC のIO32, 33, 25 にLEDを繋いで出力を試してみました。以下をmain.pyというファイル名で作成します。
import machine as m
import time
led_r = m.Pin(32, m.Pin.OUT)
led_y = m.Pin(33, m.Pin.OUT)
led_b = m.Pin(25, m.Pin.OUT)
while True:
led_r.value(1)
time.sleep(1)
led_r.value(0)
led_y.value(1)
time.sleep(1)
led_y.value(0)
led_b.value(1)
time.sleep(1)
led_b.value(0)
MicroPython へのスクリプト転送に、私は adafruit-ampy をよく使っています。これはシリアル経由で MicroPython のファイルシステムにファイルを書き込むためのものです。Python3.xを使っている場合は以下でインストールします。
$ pip3 install adafruit-ampy
ファイル転送は以下で行います。
$ ampy -p /dev/tty.SLAB_USBtoUART put main.py
転送のあと、RESETボタンを押すとプログラムが起動して、3つのLEDが順番に点滅します。
さて
BLE はどうしたんだと言われそうですが、インターフェースのもの試したもの出しても営業妨害になりそうなので、別ネタで次回に。