いつのまにか、本家 MicroPython の github に esp32 ポートのボードに M5 Atom が追加されていたので、最新ソース(2021年8月22日)をビルドして試してみました。
ビルド
ESP-IDF 環境の用意(v4.0.2を使う場合)
以下に従って ESP-IDF 環境を用意
MicroPython コードのフリーズ(コンパイル)環境ビルド
$ cd micropython # MicroPython のソースコードのフォルダ
$ make -C mpy-cross
M5 Atom 用ファームウェアのビルド
$ cd ports/esp32
$ make submodules
$ make BOARD=M5STACK_ATOM
ファームウェアの書込み
$ make PORT=<Atomが繋がっているシリアルポート> erase
$ make PORT=<Atomが繋がっているシリアルポート> BAUD=<ボーレート> deploy
※ PORTのデフォルトは /dev/ttyUSB0
、BAUDのデフォルトは 460800
。
GENERIC ビルドとの違い
ビルド済みで配布されているファームウェアとの違い
以前より M5 Atom ではビルド済みで配布されているESP32用のGENERICファームウェアが使えます。M5 Atom 対応で変わったところをざっと調べてみたところ atom
モジュールの追加だけのようです。
atom
モジュールには GPIO ピンの定数定義、Matrix と Lite のクラスが追加されており、ボタンとLEDの利用が若干便利になっています。
モジュール atom
定数
- `WS2812_PIN`
- フルカラーLED(Neopixel)が繋がっているピン番号(27)
- `BUTTON_PIN`
- ボタンの繋がっているピン番号(39)
- `IR_PIN`
- IRトランスミッターの繋がっているピン番号(12)
- `I2C0_SCL_PIN`
- I2C の SCL に使うピン番号(21)
- `I2C0_SDA_PIN`
- I2C の SDA に使うピン番号(25)
- `GROVE_PORT_PIN`
- Grove ポートに使われているピン番号のタプル (26, 32)
クラス Matrix
- コンストラクタ
- 引数なし。LED数が25個で設定される。
- メソッド `get_button_status()`
- ボタンが押されていなければ 1、押されていれば 0 を返す
- メソッド `set_button_callback(cb)`
- 引数 `cb` に指定した関数をボタンが押されたときに呼び出されるコールバック関数として設定する
- メソッド `set_pixel_color(num, r, g, b)`
- `num` (0-24)番目の LED に RGB 値を設定して実際に LED の点灯に反映する
- メソッド `get_pixel_color(num)`
- `num` (0-24)番目の LED に設定されちる RGB 値を取得する
- メソッド `set_pixels_color(r, g, b)`
- すべての LED に RGB 値を設定して実際に LED の点灯に反映する
クラス Lite
LED数が1にり、LED番号として指定できるのが 0 のみになる以外は Matrix
クラスと同じ。
サンプル
ボタンを押すたびに 消灯→赤→緑→青 で全LEDが切り替わるサンプル。
from atom import Matrix
atom_matrix = Matrix()
led_pat_no = 0
led_pat_num = 4
led_pat = ((0, 0, 0), (127, 0, 0), (0, 127, 0), (0, 0, 127))
def atom_led_cb(pin):
global led_pat_no
led_pat_no += 1
if led_pat_no >= led_pat_num:
led_pat_no = 0
atom_matrix.set_pixels_color(*led_pat[led_pat_no])
atom_matrix.set_button_callback(atom_led_cb)