Google Homeに話しかけてESP32でLチカしてみる


# はじめに
ことの発端はカーテンの開け閉めを自動化したくなった。
Google Homeに話しかけるなり照度センサで全自動なりで。

とりあえずググってみると製品があった。
けどカーテン自動化ごときに4,000円は高い。
[めざましカーテン mornin’](https://www.amazon.co.jp/%EF%BC%BB%E3%82%81%E3%81%96%E3%81%BE%E3%81%97%E3%82%AB%E3%83%BC%E3%83%86%E3%83%B3-mornin%E2%80%99%EF%BC%BD-%E3%81%94%E8%87%AA%E5%AE%85%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%86%E3%83%B3%E3%81%AB%E3%82%AB%E3%83%B3%E3%82%BF%E3%83%B3%E8%A3%85%E7%9D%80-%E3%82%AB%E3%83%BC%E3%83%86%E3%83%B3%E8%87%AA%E5%8B%95%E9%96%8B%E9%96%89%E8%A3%85%E7%BD%AE-%E6%9C%9D%E3%81%AE%E5%85%89%E3%81%A7%E5%AF%9D%E8%B5%B7%E3%81%8D%E3%81%8C%E5%A4%89%E3%82%8F%E3%82%8B-2017%E5%B9%B4%E5%BA%A6%E3%82%B0%E3%83%83%E3%83%89%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E8%B3%9E%E5%8F%97%E8%B3%9E/dp/B01ERLNK72)

となると自作でWi-Fiモジュールにモーター繋いでガチャガチャやればいいのかなって安価なWi-Fiモジュールを探してみました。



# Wi-Fiモジュールいろいろ
まずは「[ラズパイゼロW](https://www.switch-science.com/catalog/3200/)」とか手頃で良かったんだけど現状国内入手が困難。
窓の数だけ用意する必要があるので量産できなきゃダメです。
あとちょっとリッチすぎ感ある。

「[FlashAir](https://flashair-developers.com/ja/discover/usage/)」も面白そうだけどそこそこ値が張る。

そんな中見つけたのが「[ESP-WROOM-32](http://akizukidenshi.com/catalog/g/gM-11647/)」です。

1円玉程度のモジュールにWi-FiとBluetoothもついて700円！
しかもArduino IDEで開発できるという。
これは熱い。

早速秋葉へチャリを飛ばしゲット。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">秋月ナウ。<br>ESP32ゲット！ <a href="https://t.co/ryFeffwzzA">pic.twitter.com/ryFeffwzzA</a></p>&mdash; 田中みそ (@miso_develop) <a href="https://twitter.com/miso_develop/status/933889059524509697?ref_src=twsrc%5Etfw">2017年11月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

私が購入したのは秋月電子の[開発ボード](http://akizukidenshi.com/catalog/g/gM-11819/)のやつです。
USB変換とピッチ変換とスイッチついてます。

これでプロトタイプ作って量産はモジュールのみので行う予定。

ちなみに「[ESP-WROOM-02](https://www.switch-science.com/catalog/2346/)」っていう旧型もあって、こっちはBluetoothついてなくてスペックも落ちるけど150円安いです。



# やってみよう
というわけで環境構築～Google HomeでLチカまで、以下の手順で進めて行こうと思います。

* 開発環境構築
    * PCとUSB接続してLチカまで
    * IoTのHallo World
* ESP32→サーバ通信
    * Wi-Fi繋げてHTTPアクセス
    * これができればGETやPOSTでESP32のセンサ情報取得できるよね
* サーバ→ESP32通信
    * ESP32へPush
    * ここまでくればGoogle Homeからの操作もおっけー

なお↑でやること、既に偉大な先達の方々が情報を公開してくれています。
なので参考情報を添えつつ実施手順を箇条書きでサラサラっとまとめてきます。
無心でなぞってけばGoogle HomeでLチカできるはずです。

## 必要なもの
以下のものが必要になります。

* ESP32開発ボード
* PC(私はWindows10 Proを使用)
* USBケーブル(ESP32開発ボードの口はmicroUSB)
* ブレッドボード
* LED
* 抵抗
* 定電流ダイオード 



## 開発環境構築
こちらの記事で完璧です。
[ESP32(ESP-WROOM-32)でLチカ (WindowsでArduino IDE使用)](https://qiita.com/rukihena/items/6a904368700eb1c7d2a3)

ESP32開発ボードなら[ソフトウェア](https://qiita.com/rukihena/items/6a904368700eb1c7d2a3#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)のとこから進めてけばおっけーです。

以下実際の実施手順です。

* Arduino IDEダウンロード&インストール
    * https://www.arduino.cc/en/Main/Software
        * ダウンロードにちょっと時間かかったのでESP32を買いに行く前にダウンロードボタンをポチってから家を出ましょう
* arduino-esp32(Arduino IDEをESP32対応させるやつ)ダウンロード
    * https://github.com/espressif/arduino-esp32
        * 「Clone or download」よりダウンロード
* スケッチブック保存場所に「hardware/espressif/esp32」とディレクトリ作成し、ダウンロードしたzipの「arduino-esp32-master」配下を展開
    * スケッチブック保存場所はArduino IDEの「ファイル > 環境設定」から確認できます
        * Windowsなら「C:/Users/%USERNAME%/Documents/Arduino」 がデフォルトのはず
* 「hardware/espressif/esp32/tools/get.exe」を実行
    * ちょっと時間かかります
* PCとESP32をUSB接続
* IDE起動し以下設定
    * 「ツール > ボード」で「esp32 dev module」選択
    * 「ツール > シリアルポート」で一番下のCOM選択
        * 私の環境では「COM5」でした
* Lチカ回路を組む
    * [ここの写真](https://qiita.com/rukihena/items/6a904368700eb1c7d2a3#%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E7%94%A8%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88)のみたく組めばおっけーです
* IDEにスケッチ(ソース)を書く
    * [ここのソース](https://qiita.com/rukihena/items/6a904368700eb1c7d2a3#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%BD%E3%83%BC%E3%82%B9)をコピペ
* 「スケッチ > マイコンボードに書き込む」でLチカ！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Lチカで満足 <a href="https://t.co/GMdCtQ3Tcp">pic.twitter.com/GMdCtQ3Tcp</a></p>&mdash; 田中みそ (@miso_develop) <a href="https://twitter.com/miso_develop/status/934643561584214021?ref_src=twsrc%5Etfw">2017年11月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



## ESP32→サーバ通信
こちらの記事で完璧です。
[ESP32 で無線LANを使う](https://qiita.com/zakkied/items/ee68f6a49d7921549bc7)

* なんでもいいからサーバ立ち上げとく
    * 私はNode.jsにてexpressを使いました
* [ここのESP32側コード](https://qiita.com/zakkied/items/ee68f6a49d7921549bc7#http-client-get)をIDEにコピペ
    * `SSID`、`PASSWORD`、`URL`を書き換える
* 「ツール > シリアルモニタ」でシリアルモニタを立ち上げておく
    * 右下の「xxxx bps」ってやつを「115200 bps」に変えておく
* 「スケッチ > マイコンボードに書き込む」
    * シリアルモニタに「Response: 200」とか出ればおっけ！
* URLにGETパラメータつけてサーバ側でパラメ取得とかやってみて下さい



## サーバ→ESP32通信
こちらの記事で完璧です。
[Google Home Mini を使って、声で ESP32 の LED を光らせてみた](https://www.mgo-tec.com/blog-entry-esp32-googlehome-ifttt-webhooks-blynk.html)

サーバ→ESP32の通信をどう行うかですが、ESP32上にサーバ立ち上げてアクセスとかだとシンプルですが、Google Homeといったインターネットからのアクセスが面倒です。

上記の記事では「[Blynk](http://www.blynk.cc/)」というクラウドサービスを使っており、簡単にインターネットから自宅のESP32への接続を実現しています。

ということで手順です。

* Blynkプロジェクトを作成
    * スマホアプリをインストール
        * Android: https://play.google.com/store/apps/details?id=cc.blynk
        * iOS: https://itunes.apple.com/us/app/blynk-control-arduino-raspberry/id808760481?ls=1&mt=8
    * アプリ起動してアカウント作成
    * 「New Project」よりプロジェクト作成
        * 「Project Name」はご自由に
        * 「CHOOSE DEVICE」で「ESP32 Dev Board」選択
    * するとアカウント作成時に登録したメアドへメールが送られます
* Blynkライブラリをインストール
    * メールのライブラリリンクからzipをダウンロード
    * スケッチブック保存場所に展開(「libraries」と「tools」)
* IFTTT Applet作成
    * 「this」は「Google Assistant」の「Say a phrase with a number」あたりで数値を引数にします
        * フレーズとかはよしなに。よくわからない方は[こちら](https://www.mgo-tec.com/blog-entry-esp32-googlehome-ifttt-webhooks-blynk.html/2)参照下さい
    * 「that」は「Webhook」
        * 「URL」に「http://188.166.206.43/xxxxxxxx/update/V1?value= {{NumberField}}」
            * 「xxxxxxxx」はBlinkから届いたメールのAuth Tokenを
        * 「Method」は「GET」、「Content Type」は「text/plain」、「Body」は空っぽで
* スケッチ作成
    * [ここのソース](https://www.mgo-tec.com/blog-entry-esp32-googlehome-ifttt-webhooks-blynk.html/4)をコピペ
        * `auth`はメールのAuth Tokenを
        * `ssid`、`pass`も書き換え
* Lチカ回路を組む
    * [ここの図](https://www.mgo-tec.com/blog-entry-esp32-googlehome-ifttt-webhooks-blynk.html/4)みたく組む
* スケッチ実行
    * Arduino IDEにて「ツール > シリアルモニタ」でシリアルモニタを立ち上げておく
    * 「スケッチ > マイコンボードに書き込む」で準備おっけ
    * Google Homeに話かけてLチカしてみましょう

こんな感じ↓。
やたら震えてるの感動のせい。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">Google HomeでESP32をLチカ <a href="https://t.co/ZyvqukbVej">pic.twitter.com/ZyvqukbVej</a></p>&mdash; 田中みそ (@miso_develop) <a href="https://twitter.com/miso_develop/status/934696719538720770?ref_src=twsrc%5Etfw">2017年11月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



# おわりに
電子工作慣れしてない私は最初ESP32の見てくれにビビりまくりでしたが、使ってみるとこんな簡単に通信できちゃうんだとびっくりでした。

まだまだ勉強することが沢山ありますが、カーテン自動化を実現できるよう挫けず進めていきたいと思います。