M5Stack core2（無印）をAmazon Alexaにする

# はじめに

* 今流行りのM5Stack。
* 最近はAWSと簡単に連携できるセキュアチップ付きの「[M5Stack Core2 for AWS - ESP32 IoT開発キット](https://www.switch-science.com/catalog/6784/)」なるものが発売され、これにAlexaを入れて家庭内をIoT化出来ちゃったりと非常に気になるところ。
* そんな中、ふと手持ちの無印core2でもAlexa出来ないかと思って試したところ、起動に成功しちゃったのでやり方をメモしておく。

![IMG_3737D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/75c0f83b-66cc-7526-52b3-9738d30ccce4.jpeg)

# 制約
* ここに書いてるやり方については、公式ドキュメント化されていないため、いろいろ制約があると思われる。
* AWS連携してじっくり学習したい場合は時間を無駄にしないためにも「[M5Stack Core2 for AWS - ESP32 IoT開発キット](https://www.switch-science.com/catalog/6784/)」を購入した方が良い。

# M5Stack core2 for AWSと無印core2との違い

無印core2との違いはこんな感じ。

* 「M5Stack core2 for AWS」専用カスタマイズのM5GO Bottom2（M5Stack Core2専用バッテリーボトム）が付いている。
    * Microchip社製 ATECC608A Trust&GO セキュアエレメントを内蔵。
    * 10個のNeopixel LED
    * MPU6886（6軸のIMU）：core2と同じ
    * SPM1423デジタルマイク：core2も同じ
* 本体の色が素敵な黄色。


気になるATECC608Aの説明だが、

 `the onboard Microchip ATECC608 Trust&GO crypto-authentication chip is pre-provisioned with secure keys to simplify connectivity to AWS and accelerate cryptographic computation.` 

となっている。

セキュアチップには予めAWSと暗号化通信するための証明書とか、秘密鍵が組み込まれているので、
証明書をインストールしたり、秘密鍵が漏洩しないように管理したりする手間が省けるよ、ってワケらしい。

`simplify connectivity to AWS`なので、実はCPUで処理することも可能みたい。


# 用意するもの

|Item|URL|価格|
|:---|:---|:---|
| M5Stack Core2 IoT開発キット |https://www.switch-science.com/catalog/6530/| ¥6,589 |
| NeoPixel | https://www.amazon.co.jp/Rasbee-WS2812-パネルモジュール-レインボー-Arduinoに対応/dp/B085N27QYK | ¥160 |
| groveケーブル |https://www.switch-science.com/catalog/5214/| ¥440 |
| ピンヘッダ | https://akizukidenshi.com/catalog/g/gC-00167/ | ¥35 |
| ジャンパケーブル | https://akizukidenshi.com/catalog/g/gC-08933/ | ¥220 |


![IMG_3740D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/2775f615-c476-6b61-9d05-c26f985084eb.jpeg)


## Neopixelの接続

* NeoPixelはAlexaのステータス表示に使用する。
    * 取り敢えずM5Stack単体でもAlexaとして使えるが、発言中なのか、聞き取り中なのか分からなくて何度も「アレクサ！」って言うのが疲れちゃうのであった方が良い。
    * Amazonで安価で入手できるneopoxel基板にピンヘッダをはんだ付けし、groveケーブルから接続する。
    * この辺の工作がめんどくさい人は、素直に「[M5Stack Core2 for AWS - ESP32 IoT開発キット](https://www.switch-science.com/catalog/6784/)」を購入した方が良い。

* M5Stack core2側はGrove Port Aを使う。
    * （購入したGroveケーブルの色の順序とcore2背面にプリントされてるG32の色が違うので注意）

| M5Stack core2 | Neopixel ボード |
|:----|:-------|
| GND | GND    |
| 5V  | 4-7VDC |
| G32 | DIN    |

![IMG_3741D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/ff19df53-c3cd-3935-651c-1fab3bfd71ab.jpeg)



# M5Stack Core2 for AWS IoT EduKit

https://github.com/m5stack/Core2-for-AWS-IoT-EduKit.git

![スクリーンショット 2021-08-15 13.14.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/ba9d0423-8dfb-9777-8b47-0f9597ff26cc.png)

* ここから任意の場所にコードを`git clone`して、サブフォルダ`Alexa_for_IoT-Intro`をVsCodeで開く。
    * 自分の場合、`/Volumes/Thunderbolt3_SSD/workspace/M5StackAlexa/`に格納した。
    * cloneできたら、VsCodeで`/Volumes/Thunderbolt3_SSD/workspace/M5StackAlexa/Core2-for-AWS-IoT-EduKit/Alexa_for_IoT-Intro`を開く。
    * VsCodeで開くと、PlatformIOのプロジェクトとして使える。

# AWS IoT証明書の設定

https://github.com/m5stack/Core2-for-AWS-IoT-EduKit/tree/master/Alexa_for_IoT-Intro

の説明によると、Alexaを使用するにはAWS IoTの証明書が必要で、２通りの入手方法があるらしい。

* a) EspressifのAWS-IoT評価用アカウントのテンポラリな証明書
* b) ユーザ自身のAWSアカウントの証明書

今回は評価用として、a) のやり方でやってみる。

![スクリーンショット 2021-08-15 13.26.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/c868beb7-726d-0909-b88a-34809cdcd566.png)

## Espressifの評価用アカウント証明書の作成

[ここ](https://espressif.github.io/esp-va-sdk/#/)にアクセスし、以下の画面でEmailアドレスを入力して`Generate`ボタンを押すと、証明書ファイル一式を添付ファイルで送信してくれる。

![スクリーンショット 2021-08-15 13.35.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/eace927b-5c75-6bb9-6b91-5889908f95e0.png)

### ファイルの配置

しばらくすると、以下のメールが送られてくるので、`clone`した場所の近くに配置。
（自分は、`/Volumes/Thunderbolt3_SSD/workspace/M5StackAlexa/Core2-for-AWS-IoT-EduKit/Alexa_for_IoT-Intro/___AWSCert`に配置した。）

![スクリーンショット 2021-08-15 13.39.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/dbd2abf9-db52-5f44-a796-bb0afa9e3c3a.png)

### `mfg_config.csv`の書き換え

* メールで送られてきたパーティション作成用のファイルを使るための出力場所のパスを書き換える。
    * 自分の場合、`/Volumes/Thunderbolt3_SSD/workspace/M5StackAlexa/Core2-for-AWS-IoT-EduKit/Alexa_for_IoT-Intro/___AWSCert`に全部集約したいので、`./`に統一。

![スクリーンショット 2021-08-15 13.44.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/a095e912-acff-a3cb-6a82-562cdbb02955.png)

### 証明書ファイルの書き込み

* まず最初にESP32のFlash領域をクリアする。
    * ESP32のFlash領域に古いデータが残ってるとAWSの認証が通らない事があるので、`Erase Flash`しておく。
    * コードがAWSの認証が通らないケースを想定していないため、認証情報が全部揃わない状態でそのまま変な領域にアクセスして`core 0 panic!`になったりする。
    * （筆者はこのせいで数時間デバッグに時間を持って行かれた。。。）

![スクリーンショット 2021-08-15 13.54.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/dd595a6b-ce32-4156-b45f-71e2f1eec5ab.png)


* M5Stackのflash領域にAWSの証明書を書き込む。
    * `IDF_PATH`, `ESPPORT`は各人の環境に合わせて変更する必要がある。
    * シリアルモニタを開いてると書き込めなかったりするので、クリーンな状態で書き込む。

```
cd /Volumes/Thunderbolt3_SSD/workspace/M5StackAlexa/Core2-for-AWS-IoT-EduKit/Alexa_for_IoT-Intro/___AWSCert
export IDF_PATH=/Volumes/Thunderbolt3_SSD/workspace/esp/esp-idf/
export ESPPORT=/dev/tty.usbserial-020418A9
python $IDF_PATH/components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py generate ./mfg_config.csv mfg.bin 0x6000
python $IDF_PATH/components/esptool_py/esptool/esptool.py --chip esp32 --port $ESPPORT write_flash 0x10000 mfg.bin
```

# コードの編集

* Neopixel制御用のGPIO番号の書き換え
    * `/Volumes/Thunderbolt3_SSD/workspace/M5StackAlexa2/Core2-for-AWS-IoT-EduKit/Alexa_for_IoT-Intro/components/core2forAWS/core2forAWS.c` の以下の行をGroveポートの番号`32`に書き換える。
    * これで、Alexaの各種ステータスを外付けのNeopixelに表示できるようになる。

![スクリーンショット 2021-08-15 14.06.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/5f033f70-cf43-e53f-0a53-e7f4de6b1922.png)

# ボードの設定

無印core2には専用チップが載ってないので、

* ① PlatformIOのメニューから`Run Menuconfig`を開く
* ② 表示されるTERMINALのメニューから`Component config`を開く
    * 一番最後の項目付近にある`Core2 for AWS hardware enable`を開く

![スクリーンショット 2021-08-15 14.12.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/50bb0a7c-a9f2-1c54-fdce-f3c48b1bf8ef.png)

* `Encryption chip-ATECC608`のチェックを外す。
    * 無印core2にはこのチップが実装されていないので、無効化。
    * これを無効化すると、暗号化はソフトウェアで処理するようになるみたいだけど、詳細は不明。
    * 普段使ってるAmazonアカウントに紐づけるのは怖いので、使う場合は開発用の専用アカウントを作って使う方が安全かもしれない。
* `q`でSaveして終了。

![スクリーンショット 2021-08-15 14.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/3fc541d0-647d-fe31-8e7b-2fdc7d2194b6.png)


# ビルド&アップロード

あとは普通にビルドしてアップロードする。

![スクリーンショット 2021-08-15 14.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/01a9e382-e432-2a95-3e40-beb57abe3971.png)


正常に起動すると、こんな画面が表示される。

（厳密には`Push to Talk`, `Mute` の文字は後段の手順によってAWSにログイン出来たら表示される。）

![IMG_3739D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/324cc0ee-5703-7453-0678-460e5c89bb55.jpeg)


# コンパニオンアプリによるデバイス認証の紐付け

ここまででM5Stack core2にはAlexaのプログラムは書き込まれたが、WiFi接続、AWSアカウントの情報が全く入ってない状態。
（上記ビルド手順が完了すると、M5Stackからコンパニオンアプリ経由で設定してね、って言う英語の音声案内が流れる）

これらの設定には、専用のスマホアプリを使ってM5Stack内のFlash領域に記録してやる必要がある。

https://github.com/m5stack/Core2-for-AWS-IoT-EduKit/tree/master/Alexa_for_IoT-Intro#4-device-provisioning

![スクリーンショット 2021-08-15 14.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/e530e087-264f-74eb-04f4-258b4f1c6919.png)

上記リンクから、スマホアプリをインストールし、説明ページの案内通りに

* Alexaデバイス(M5Stack core2)の検出
* WiFiアクセスポイントの設定
* Amazonへのログイン

を行うと、Alexaが使えるようになる。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">M5Stack core2無印でもAlexa起動、最新リポジトリのソースでも動いた。<br>ちょっぴり画面が進化してる。<br><br>手順忘れないうちにメモに残しとこう。 <a href="https://t.co/1LlZXk9Epd">pic.twitter.com/1LlZXk9Epd</a></p>&mdash; Nabeshin (@desmoquattro996) <a href="https://twitter.com/desmoquattro996/status/1426528033389780996?ref_src=twsrc%5Etfw">August 14, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ
* 手持ちの無印M5Stack core2でもAlexaを起動させる事ができた。
* 会話のステータスが分からないので、Neopixelがあった方が良い。