AlexaからESP32につながったLEDを操作した話
去年のアマゾンのサイバーマンデーにてEcho dotが通常価格5,980円のところ3,240円で売られていたのでつい衝動買いしていたことを思い出したのでESP32との連携をして遊んでみることにしました。
目次
実行環境
- OS : macOS Mojave 10.14.2
- Arduino IDE : 1.8.5
- ESP32 : ESPr Developer 32(SWITCH SCIENCE)
- Echo dot : 第3世代
目標
AlexaからESP32に接続されたLEDを操作する。
準備
ソフトウェア領域
- ESP32の開発環境
- ライブラリ各種(下記参照)
- Alexaのスマホアプリ
ハードウェア領域
- LED(ここでは赤色を利用しました)
- 抵抗(LEDの色に合わせた大きさを利用しましょう。ここでは330Ωを利用しました)
- ESP32
- Echo dot
使用したライブラリ
FauxmoESPというライブラリを利用させていただきました。私の環境で実行した時のバージョンは3.1.0でした。
xoseperez / fauxmoESP — Bitbucket
READMEを見てみると、依存関係にあるライブラリがあるそうです。ESP8266とESP32で違うそうなので、ESP32用の依存ライブラリも入れておきましょう。
$ cd your_ArduinoDir/libraries $ git clone https://bitbucket.org/xoseperez/fauxmoesp.git $ git clone https://github.com/me-no-dev/AsyncTCP.git
コードを書く
ライブラリのサンプルコードを少し変更したものです。
#include <Arduino.h> #include <WiFi.h> #include "fauxmoESP.h" fauxmoESP fauxmo; const char *ssid = "****************"; const char *password = "****************"; const int ledpin = 26; const char *id_led = "led"; void WifiSetup() { WiFi.mode(WIFI_STA); Serial.printf("connecting to %s¥n", ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(100); } Serial.println(); Serial.print("WiFi connected: "); Serial.println(WiFi.localIP()); } void setup() { Serial.begin(115200); pinMode(ledpin, OUTPUT); digitalWrite(ledpin, LOW); WifiSetup(); fauxmo.createServer(true); fauxmo.setPort(80); //※ fauxmo.enable(true); fauxmo.addDevice(id_led); fauxmo.onSetState([](unsigned char device_id, const char *device_name, bool state, unsigned char value) { Serial.printf("Device #%d (%s) state: %s value: %d\n", device_id, device_name, state ? "ON" : "OFF", value); if (strcmp(device_name, id_led) == 0) { digitalWrite(ledpin, state ? HIGH : LOW); } }); } void loop() { fauxmo.handle(); }
※ fauxmo.setPort(80);
のところですが、第3世代のEcho dotを使う場合は使用するポート番号は80番でないといけないようです。
回路を組む
ESP32の26番ピン - LED - 抵抗 - GND となるようにつなぎます。よくあるLEDの回路ですね。
Alexaのスマホアプリを開いてESP32を認識させる
ここでEcho dotに電源を接続してWiFiに接続します。
- 下のメニューからデバイスを選択して右上の「+」のアイコンをクリックします。
- 下からメニューが出てくるので「デバイスを追加」を選択します。
- セットアップするデバイスの種類を選ぶ画面に移動したらすべてのデバイス > その他(一番下にあるのでスクロールします)を選択します。
- 「デバイスを検出」をタップします。ここで数秒待ってESP32を検出します。
デバイスが検出されたら上の画像のようになるはずです。「デバイスをセットアップ」をタップしてデバイスを登録します。その後、fauxmo.addDevice();
の引数として渡した文字列がデバイス名として登録されます。今回は"led"という名前で登録されますね。ここまでやれば作業は終了です。
完成
AlexaにLEDをつけたり消したりしてもらった with ESP32 pic.twitter.com/tpPi7QQybc
— ゆべしネコ (@yubeshineko) January 6, 2019
「アレクサ ledつけて」と言うとつけてくれます。反対に「アレクサ led消して」と言うと消してくれます。
赤外線通信用ライブラリとEcho dot
赤外線通信をして音声で家電操作をしたいと考え、赤外線通信用ライブラリであるIRremoteをこれと試したのですが、実行中にGuru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
などと言うエラーを吐かれてしまいました。espressifの公式サイトによるとこう書かれていました。
This CPU exception happens when application attempts to read from or write to an invalid memory location.
ふむふむ、不適切なメモリ領域にアクセスしてしまい、パニックを起こしていると...。ESP8266とEcho dotの組み合わせで赤外線通信をしている例があったので、どうしても赤外線を飛ばしたいというならそちらを使うか、ライブラリを使わずに赤外線を飛ばすように実装するしかないですね。いづれはこちらも実装してみたいものです。