ゆべねこの足跡

IT系のはなしを残しておく場所です

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を操作する。

f:id:yubeshineko:20190108005339p:plain

準備

ソフトウェア領域

  • 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に接続します。

f:id:yubeshineko:20190107234724p:plain

  1. 下のメニューからデバイスを選択して右上の「+」のアイコンをクリックします。
  2. 下からメニューが出てくるので「デバイスを追加」を選択します。
  3. セットアップするデバイスの種類を選ぶ画面に移動したらすべてのデバイス > その他(一番下にあるのでスクロールします)を選択します。
  4. 「デバイスを検出」をタップします。ここで数秒待ってESP32を検出します。

f:id:yubeshineko:20190107235526p:plain

バイスが検出されたら上の画像のようになるはずです。「デバイスをセットアップ」をタップしてデバイスを登録します。その後、fauxmo.addDevice();の引数として渡した文字列がデバイス名として登録されます。今回は"led"という名前で登録されますね。ここまでやれば作業は終了です。

完成

「アレクサ 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の組み合わせで赤外線通信をしている例があったので、どうしても赤外線を飛ばしたいというならそちらを使うか、ライブラリを使わずに赤外線を飛ばすように実装するしかないですね。いづれはこちらも実装してみたいものです。

参考サイト

ESP32をAmazon Alexaのスマートホームのデバイスに登録する方法 - クラクスの記録帳