BLE対応版MicroPython for ESP32をmacOSでビルドしてみる

この記事は[MicroPython Advent Calendar 2017](https://qiita.com/advent-calendar/2017/micropython)の3日目の投稿です。昨日は [ken5owata](https://qiita.com/ken5owata)さん投稿の[micropythonをはじめよう（STM32F401編）](http://ken5owata.hatenablog.com/entry/2017/12/02/114623)でした。

小ネタですがご容赦を。

まだ正式にはBluetoothがサポートされないESP32のMicroPythonですが、[インターフェース誌２０１８年１月号](http://www.kumikomi.net/interface/contents/201801.php)にBLEをサポートしたMicroPythonビルドの記事が載っていました。[記事サンプル](http://www.kumikomi.net/interface/sample/201801/if01_073.pdf)からも大体の手順はわかるかと思います。インターフェース誌の記事では Ubuntu で作業していますが、ここでは私のメイン環境である macOS 上でビルドしてみます。

ESP32のボードはインターフェース誌の記事と同じ[ESP32-DevKitC](http://akizukidenshi.com/catalog/g/gM-11819/)を使いました。

# ツールチェーンの取得と設定

ESP32の開発環境の情報は以下にあります。

https://github.com/espressif/esp-idf

macOS用のツールチェーン導入方法は以下にあります。

https://esp-idf.readthedocs.io/en/latest/get-started/macos-setup.html

これにしたがって、macOS用のツールチェーンをダウンロードして展開します。

```bash
$ 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　に以下を追加します。

```bash
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
```

# ESP-IDFの取得と設定

ESP-IDFの導入方法は以下に説明があります。

https://esp-idf.readthedocs.io/en/latest/get-started/index.html#get-started-get-esp-idf

これにしたがって、github より ESP-IDF を clone します。

```bash
$ git clone --recursive https://github.com/espressif/esp-idf.git
```

~/.bashrc に以下を追加します。

```bash
export ESPIDF=~/esp/esp-idf
export IDF_PATH=~/esp/esp-idf
```

# MicroPythonソースの取得

MicroPython 本家のソースではなく、インターフェース誌の記事の著者である西本卓也さんが公開しているものを github から clone します。これは本家 MicroPython に対して MrSurly さんがプルリクエストしていたものを取り込み、パーティション定義を変更したものとのことです。

```bash
$ 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``` で
あることがわかったので、この値でチェックアウトを行います。

```bash
$ cd esp-idf
$ git checkout 2c95a77cf93781f296883d5dbafcdc18e4389656
$ git submodule update --init --recursive
$ cd ..
```

# MicroPython のビルド

```bash
$ cd micropython-esp32
$ make -C mpy-cross
$ cd ports/esp32
$ make
```

# ESP32-DevKitCへの書込み

ESP32-DevKitC とMacをmicroUSBケーブルで繋ぎます。ポートは私の環境では ```/dev/tty.SLAB_USBtoUART``` になりました。このポートを指定して、以下で書込みます。

```bash
PORT=/dev/tty.SLAB_USBtoUART make erase
PORT=/dev/tty.SLAB_USBtoUART make deploy
```

# 動作確認

とりあえず、ターミナル.app を開いて screen コマンドでシリアル接続して REPL が起動するかを確認します。

```bash
$ screen /dev/tty.SLAB_USBtoUART 115200
```

REPLのプロンプト ```>> ``` が現れ、キーボードからの入力が受け付けられればOKです。

![スクリーンショット 2017-12-02 23.16.15.png](https://qiita-image-store.s3.amazonaws.com/0/106817/0df171e1-9d5b-2d52-9f4a-725589316385.png)

screen コマンドを抜けるには control-a k とします。

# Lチカっぽいこと

ESP32-DevKitC のIO32, 33, 25 にLEDを繋いで出力を試してみました。以下をmain.pyというファイル名で作成します。

```py3
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を使っている場合は以下でインストールします。

```bash
$ pip3 install adafruit-ampy
```

ファイル転送は以下で行います。

```bash
$ ampy -p /dev/tty.SLAB_USBtoUART put main.py
```

転送のあと、RESETボタンを押すとプログラムが起動して、３つのLEDが順番に点滅します。

![IMG_4233.JPG](https://qiita-image-store.s3.amazonaws.com/0/106817/65c48c47-3ee1-7f80-b95c-f6429960285c.jpeg)

# さて

BLE はどうしたんだと言われそうですが、インターフェースのもの試したもの出しても営業妨害になりそうなので、別ネタで次回に。