終わった雑談ロボットを救ってみた

# 前書き
実家の掃除を手伝っていたらこんなものが見つかりました
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/018e4db1-887e-3f1b-c7d0-7a1e7670ce5b.jpeg" width=50%>
タカラトミーが開発したコミュニケーションロボット『OHaNAS』でございます。このロボットの特長は、なんと『ドコモ雑談API』の技術が使われており、雑談会話が可能となっているという点ですね。<br><br><br><br><br>
多人数会話、言語処理系の研究経験がある方やその方面の知識がある方、お察しの通りです。
『ドコモ雑談API』、サービス終了しています。よって、このロボットはもう喋ることはありません。
けど、喋れなくなったからゴミ箱へポイって可哀そうじゃないですか、でも喋らなくなったらもうただの文鎮だしなぁ[^1]<br>
ということで、このロボットがまた雑談できるように、スマートスピーカーの機能を埋め込んでまた喋ってもらいます。

# スマートスピーカーを作る
まず、実際に埋め込むスマートスピーカーを選定しようと思いましたが、意外とスマートスピーカーって大きいんですね。外装とかを外して小型化したとしても入りそうにないですね。
ということで、今回は最近電子工作界隈で話題のあれを埋め込みます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/0734975d-92f7-f7c3-d2b0-3135140520a0.jpeg" width=50%>
M5Stack社のESP32デバイス『M5stack Core2 for AWS』[^2]でございます。
M5stackとAmazonのコラボ商品で、なんとBOTTOM部分にMicrochip社製のATECC608A Trust&GOセキュアエレメントが内蔵されているためAWSを使ったIoTのアプリケーション構築が比較的簡単にできるといった商品となっています。


今回はこの『M5stack Core2 for AWS』にアレクサを突っ込んでスマートスピーカーの代用とします。

## M5stack Core2 for AWSのチュートリアルをある程度こなす
まずは、このデバイスの仕様を把握するために、すこしチュートリアルを進めましょう。
ついこの間公式のチュートリアルページが日本語化されたようなので、日本語版のURLを貼っておきます。
https://edukit.workshop.aws/jp<br>
全部やると結構ボリュームがあるので、そうですね、第2章【Blinky Hello World(Lチカ)】まで進めておくといいかもしれません。
多少誤訳や誤植も見られますが、見た感じ2章までは致命的な誤訳誤植は無かったので問題なく進められると思います。<br>
## M5Stackをアレクサにする
デバイスの仕様をある程度把握出来たら、次はいよいよAlexaを実装していきます。
手順は一応先ほどのチュートリアルページにも掲載されてはいますが、情報が古いまま和訳されたのか、それとも誤植なのかわかりませんが正しい手順になっていないので執筆時点(2021年3月)での正しい手順を説明します。

1\. チュートリアル用のリポジトリをクローンする
　チュートリアルをLチカまで進めていれば既にクローン済みだと思うのでスキップしても大丈夫です。

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

2\. 証明書生成用データをダウンロード
　AWS IoT証明書の生成に必要なデータをダウンロードします。公式ページにメールアドレスを打ち込むとメールで必要なデータが届きます
https://espressif.github.io/esp-va-sdk/#/

　メールに7つほどデータが添付されてると思うので、わかりやすい階層に『espcredentials』というフォルダ(ディレクトリ)を作りそこに入れておいてください。

3\. 証明書を生成しM5Stackに書き込む
　espcredentialsフォルダ内に移動した『mfg_config.csv』に証明書生成に必要なデータのpathが書かれているので、正しいpathに修正します。

```mfg_config.csv
key,type,encoding,value
device,namespace,,
device_id,file,binary,/path/to/device.info　//ここにdevice.infoのpath
account_id,file,binary,/path/to/account.info　//ここにaccount.infoのpath
mqtt_host,file,binary,/path/to/endpoint.info　//ここにendpoint.infoのpath
client_cert,file,binary,/path/to/device.cert　//ここにdevice.certのpath
client_key,file,binary,/path/to/device.key　//ここにdevice.keyのpath
server_cert,file,binary,/path/to/server.cert　//ここにserver.certのpath
```

(解説のためにコメントアウト入れましたが、データ形式がCSVなのでコメントアウトは消しておいてください)<br>
　mfg_config.csvを修正後、以下のコマンドを実行することで証明書が生成されます。

```
python %IDF_PATH%\components\nvs_flash\nvs_partition_generator\nvs_partition_gen.py generate 《mfg_config.csvのpath》 mfg.bin 0x6000
```

　証明書が無事生成されたら、M5Stackに書き込みましょう。

```
python %IDF_PATH%\components\esptool_py\esptool\esptool.py --chip esp32 --port 《COM番号》 write_flash 0x10000 mfg.bin
```

4\. Alexaのプログラムを書き込む
　これでようやくAlexaのプログラムを書き込む準備ができました。あと一息です。
　クローンしたチュートリアルのリポジトリ内の『Alexa_For_IoT-Intro』フォルダ(ディレクトリ)にcdコマンド等を使用して移動した後、以下のコマンドで書き込みます

```
　idf.py build flash monitor -p 《COM番号》
```

5\. Alexaの動作確認
　ESP Alexaアプリ([iOS](https://apps.apple.com/in/app/esp-alexa/id1464127534)/[android](https://play.google.com/store/apps/details?id=com.espressif.provbleavs))をインストールしてデバイス登録を行い、あとは普通のAlexaと同様に会話ができればOKです。お疲れ様でした。

# OHaNASを改造する
![IMAG1608.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/f86685d9-d194-5446-3d8d-0aaf8cf54f81.jpeg)
とりあえずOHaNASを分解してみましたが、だいぶスカスカですのでM5Stackは問題なく入りそうです。<br>
ただ、ざっくりと見た感じですと、このロボットにM5Stackを組み込むには以下の問題を解決する必要がありそうですね。<br>
・LEDがメインボードに内蔵されているため、代わりのLED周りの回路を製作してメインボードと取り換える必要がありそう
・マイクが既存の位置には付けられそうもないため、目立たない位置に穴をあけて対応する

ということで、上から順に解決していきます。
## LED周りの回路を製作する
LED周りの回路はOHaNAS由来の物をそのまま載せることはできませんので、少し工夫が必要です。
あまり凝った回路にしてしまうとプログラム側の改修が必要になってとても面倒くさいので、M5GO BOTTOM2内のLED回路を改造して何とかします。
今回は、LEDを2つほど外して、代わりにケーブルを伸ばしました。
![IMAG1661_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/a4a32299-aff4-0ac9-9791-e2fe18c5645d.jpeg)


OHaNASのメインボードの代わりになる基板は、業務でも使用しているEAGLE[^3] [^4]を使用して設計を行いました。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/a9a1bd59-ae55-2081-b148-ca33a4ec5dbf.png)


基板レイアウトはOHaNASについていたメインボードを実測して再現します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/69e09017-e042-a4b5-f2b0-9271491129c2.png)



今回製作した基板データはこちらです
[EAGLE](https://drive.google.com/file/d/1KyQeSBfQEcNVfMyyCRDaZB2jgBDKGsmr/view?usp=sharing)

軽く動作確認もしましょう。できればPCBにする前にブレッドボードとかで試作したほうが良いのですが、時間が無いのでPCBにした後に動作確認をしています。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">やっと目が光った <a href="https://t.co/CjjTQphQpt">pic.twitter.com/CjjTQphQpt</a></p>&mdash; 樋口グッピー (@Guppy_T_Higuchi) <a href="https://twitter.com/Guppy_T_Higuchi/status/1381523458819956739?ref_src=twsrc%5Etfw">April 12, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
※PCB化したLED基板をOHaNASの顔に取り付けて動作確認を取っている図

## マイクの検討
マイクを取り付ける位置を決め、マイク穴を適当に開けます。あまり目立たないようにメッシュを貼ったり穴を小さくする等、工夫をした方がよさそうですね。
![IMGana.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/58d25716-1169-0dfc-9129-3e588792dbf0.jpeg)


M5stack自体にもマイクは内蔵されていますが、ロボットの内部だと反響して音声がきれいに取得できないので、少しでも条件をよくするため外付けのマイクを使用しました。
https://www.switch-science.com/catalog/6620/

当初はそのままGROVE端子経由で接続しプログラムの修正をして対応するかとのんきに考えていましたが、
どうやらマイクとスピーカーのアンプが同じピンに割り当てられているらしくピン宣言を弄ったら盛大に音割れしたので、M5Stack用プロトモジュールを使ってマイクのピンであるG0とG34ピンを引き出して接続しました。
(注：そのまま取り付けるとマイクが二つ接続されてしまうので、BOTTOMの方のG0,G34ピンは物理的に導通しないよう外しておいてください)
![IMAG1669.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/574c365e-8357-fe49-90ec-f81ed74972f7.jpeg)



## M5Stackを取り付けるための検討をする
M5Stackを取り付けるために必要な追加パーツの検討をします。必要ならば3DプリンターやCNCで作るのもありです。
とりあえず今回は小さめの板のようなものとそれなりに固定できる接着剤で何とかなりそうなので、<ruby>逸般の誤家庭<rp>（</rp><rt>いっぱんのごかてい</rt><rp>）</rp></ruby>で余りがちな捨て基板を板の代わりとして使いました。

また、M5stack本体をそのままロボット内部に収めてしまうと電源ボタンが押せないので、OHaNASの頭頂部にあるボタンの線をM5stackの電源ボタンのランドにはんだ付けして電源を入れる手段を確保します。
あとこれは必須ではありませんが、ついでにスピーカーの線も伸ばしておいて組み込み時にOHANAS本体のスピーカーと接続しましょうかね。
![IMAG1659.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/bde347d2-f1bb-030d-8870-0528ab58461b.jpeg)

![IMAG1662.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/c77104e9-abd3-595b-0dea-73be4a94829b.jpeg)


## 組み込む
あとは組み込むだけです。試行錯誤しながらがんばって組み込みましょう。
![IMAG1667.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600123/47b9b411-dc3f-c2db-bfbd-518b944cdd37.jpeg)


以上で完成です。お疲れ様でした。
# 動作確認
完成品はこちらになります。
(とりあえず急いで撮ったものを仮でおいておきますが、後日撮影しなおして差し替えます)
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">やっと完成したので仮組みして動作確認。後でしっかりした場所で撮り直します <a href="https://t.co/rB3LGlcseR">pic.twitter.com/rB3LGlcseR</a></p>&mdash; 樋口グッピー (@Guppy_T_Higuchi) <a href="https://twitter.com/Guppy_T_Higuchi/status/1382645785964146689?ref_src=twsrc%5Etfw">April 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


[^1]: というのは建前で、大学卒論で思いっきりこのロボットを例に出していたので少し愛着があるだけです
[^2]: https://www.switch-science.com/catalog/6784/
[^3]: https://www.autodesk.co.jp/products/eagle/free-download
[^4]: EAGLEを使ったことのない人向けの解説書はこちら　https://shortlovers.booth.pm/items/2646682