Amazon Echo と ESP8266 で スマートホーム ―テレビ制御―
以前ラズパイでスマートスピーカAmazon Echoを自作したのだけど、ウェブカメラのマイクで感度が低かったりAmazon Musicと連携ができないなどで。。。
本物ほしいなぁなんて思っていたら。。。。先日のプライムデーでなんとEcho dotが¥2,980(¥3,000 OFF)だったのでやっと買いました。
着後、早速子どもたちは喜んで遊んでます。
Amazon Echo届いた。 しりとり出来るんだ。苦戦中 #alexa #Amazon #アイス pic.twitter.com/1aMoEn1Zwy
— HomeMadeGarbage (@H0meMadeGarbage) 2018年7月18日
そして憧れるのが音声認識による家電制御。そう!スマートホーム!
以下みたいのに憧れていました。
Esp8266 Alexa Wemo switch emulator とスイッチサイエンスのESPr IR赤外線リモコンを組み合わせてAmazon EchoからTVのオン/オフできた!???? pic.twitter.com/GjdMQctTFO
— robo8080 (@robo8080) 2018年2月23日
早速、参考にしてESP8266に赤外線LEDを接続してEchoでコントロールするテレビリモコンを作ってみました。我が家はリモコンがどっかになくなったり、子どもが〇〇観たいとか忙しいときに言ってきたりするので、声でTVコントロールできたらかなり便利。まさに#完全にNEXT!
目次
Arduinoライブラリ準備
マイコンESP8266をArduinoでプログラミングして赤外線を使用できるようにします。かつAmazon Echoと連携させます。
Arduino用ESP8266ライブラリ
バージョンアップ(現在2.4.1)があり、以下を参考に導入しました。
ESP8266 赤外線通信ライブラリ
以下のIRremoteESP8266ライブラリを使用してESP8266で赤外線信号の解析や信号出力しました。
https://github.com/markszabo/IRremoteESP8266
ZipをダウンロードしてArduinoのメニュー[スケッチ]→[ライブラリのインクルード]→[.zip形式ライブラリをインストール…]でダウンロードしたファイルを指定してインストールします。
ESP8266-Alexa連携ライブラリ
以下のライブラリを使用してESP8266をスマートホームデバイスにしてAmazon Echoと繋ぎます。
https://github.com/witnessmenow/esp8266-alexa-wemo-emulator
IRremoteESP8266ライブラリと同様にZipをダウンロードしてArduinoにインストールします。
テレビリモコン赤外線信号解析
まずは自宅のテレビリモコンの赤外線信号の解析を行います。
構成
部品
Arduinoコード
インストールしたIRremoteESP8266ライブラリのexampleコードを使用します。
Arduinoメニュー[ファイル]→[スケッチ例]→[IRremoteESP8266]→IRrecvDumpV2.ino
解析
上記コードを実行しリモコン受信モジュールに向けてテレビリモコンのボタンを押します。
うまく赤外線が受信できるとシリアルモニタに信号解析結果が表示されます。
我が家のテレビリモコンの通信フォーマットはNECフォーマットでした。各リモコンのボタンを解析してCodeをメモしておきます(上図では1C6F00F)。ここでは電源ボタン、音量ボタン、各チャンネルボタン(ch1〜ch8)の解析を実施しました。
赤外線送信
赤外線LEDをESP8266に接続してリモコン信号を出力します。
構成
部品
-
ESPr® Developer(ESP-WROOM-02開発ボード)
-
SIR-34ST3F赤外線LED
Arduinoコード
IRremoteESP8266ライブラリとesp8266-alexa-wemo-emulatorライブラリを使用します。
それぞれのスケッチ例
IRsendDemo.ino
MultiSwitch.ino
を参考にプログラムしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
#include <ESP8266WiFi.h> #include "WemoSwitch.h" #include "WemoManager.h" #include "CallbackFunction.h" #include <IRremoteESP8266.h> #include <IRsend.h> #define IR_LED 4 IRsend irsend(IR_LED); // prototypes boolean connectWifi(); //callbacks void tvOn(); void tvOff(); void soundUp(); void soundDown(); void ch1(); void ch2(); void ch3(); void ch5(); void ch6(); void ch7(); void ch8(); void chNon(); //------- Replace the following! ------ char ssid[] = "your network SSID Name"; char password[] = "your network key"; WemoManager wemoManager; WemoSwitch *tv = NULL; WemoSwitch *sound = NULL; WemoSwitch *chA = NULL; WemoSwitch *chB = NULL; WemoSwitch *chC = NULL; WemoSwitch *chD = NULL; void setup() { Serial.begin(115200); irsend.begin(); // Set WiFi to station mode and disconnect from an AP if it was Previously // connected WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); // Attempt to connect to Wifi network: Serial.print("Connecting Wifi: "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); IPAddress ip = WiFi.localIP(); Serial.println(ip); wemoManager.begin(); // Format: Alexa invocation name, local port no, on callback, off callback tv = new WemoSwitch("テレビ", 80, tvOn, tvOff); sound = new WemoSwitch("sound", 81, soundUp, soundDown); chA = new WemoSwitch("chA", 82, ch1, ch2); chB = new WemoSwitch("chB", 83, ch3, ch5); chC = new WemoSwitch("chC", 84, ch6, ch7); chD = new WemoSwitch("chD", 85, ch8, chNon); wemoManager.addDevice(*tv); wemoManager.addDevice(*sound); wemoManager.addDevice(*chA); wemoManager.addDevice(*chB); wemoManager.addDevice(*chC); wemoManager.addDevice(*chD); } void loop() { wemoManager.serverLoop(); } void tvOn() { Serial.print("TV turn on ..."); irsend.sendNEC(0x001C6F00F, 32); } void tvOff() { Serial.print("TV turn off ..."); irsend.sendNEC(0x001C6F00F, 32); } void soundUp() { Serial.print("sound Up ..."); irsend.sendNEC(0x001C630CF, 32); } void soundDown() { Serial.print("sound Down ..."); irsend.sendNEC(0x001C6B04F, 32); } void ch1() { Serial.print("ch1 on ..."); irsend.sendNEC(0x001C600FF, 32); } void ch2() { Serial.print("ch2 on ..."); irsend.sendNEC(0x001C6807F, 32); } void ch3() { Serial.print("ch3 on ..."); irsend.sendNEC(0x001C640BF, 32); } void ch5() { Serial.print("ch5 on ..."); irsend.sendNEC(0x001C620DF, 32); } void ch6() { Serial.print("ch6 on ..."); irsend.sendNEC(0x001C6A05F, 32); } void ch7() { Serial.print("ch7 on ..."); irsend.sendNEC(0x001C6609F, 32); } void ch8() { Serial.print("ch8 on ..."); irsend.sendNEC(0x001C6E01F, 32); } //予備ch void chNon() { } |
70〜75行でAmazon Echo用のスマートホームデバイスを6個生成しています。ポート番号はそれぞれ違う値を使用します(ここでは80〜85)。
スイッチデバイスをエミュレートしているのでONコールバックとOFFコールバックの2個の動作が実行できます。
デバイスtvでは名前を”テレビ”としてコールバックtvOn()、tvOff()を実行します。それぞれのコールバックでテレビリモコンの電源ボタンの赤外線信号を出力します(91行、96行)。信号は解析した赤外線フォーマットとcodeを指定します。
その他のデバイスで音量とチャンネル切り替えを実施しています。詳細は後ほど。
Amazon Echo連携
ESP8266で生成したスイッチデバイスをEchoに連携して音声でテレビ操作できるようにします。
スイッチデバイス検出
連携にはスマホアプリAmazon Alexaを使用します。
アプリのスマートホームをクリックします。
ESP8266を起動した状態で”デバイスを追加”をクリックすると数十秒でESP8266で生成したスイッチが検出されます。
この状態で
「アレクサ、デバイス名(テレビなど)つけて」、「アレクサ、デバイス名(テレビなど)オン」
「アレクサ、デバイス名(テレビなど)消して」、「アレクサ、デバイス名(テレビなど)オフ」
でそれぞれONコールバックとOFFコールバックが実行されます。
簡単!!
定型アクション指定
デフォルトでスマートホームデバイスは「つけて(もしくはONして)」とか「消して(もしくはOFFして)」で動作します。
しかし、音声をコントロールしたい時やチャンネルを変える時に、「ONして」や「消して」は不自然なので実行発話をカスタマイズします。
音量調整
Amazon Alexaアプリの定型アクションをクリックして、”+”をクリック。
“実行条件を設定”をクリック
「音を大きくして」と入力して保存。
“アクションを追加”をクリック
“スマートホーム”を選択
デバイス”sound”を選択
オン状態で”次へ”→”追加”→”作成”をクリック
これで音量大きくするアクションができました。
続いて音声小さくするアクションも同様に作成します。「アレクサ、音小さくして」でsoundデバイスのOFFコールバックを実行するようにします。
soundデバイスのONコールバックとOFFコールバックではそれぞれテレビリモコンの音量大小ボタンの赤外線code出力が実行されます(上記の赤外線送信プログラムの101行、106行)。
チャンネル切り替え
デバイスchA〜Dでチャンネルボタンを実行します。
chAデバイスのONコールバックではTBSに切り替わるようにしました。
chAデバイスのOFFコールバックでは教育テレビに切り替わるようにしました。実行条件を「アレクサ、Eテレ」にしたかったのですがAlexa側の問題なのかE テレと言語認識できませんでした。しかたなく教育テレビにしました。
同様にchB〜chDのONコールバックとOFFコールバックを利用して各チャンネルに切り替えるようにしました。
動作
ヤッター!
便利!これで子供抱っこしたままでもテレビ消したりチャンネル変えたりできるよ。
便利な世の中になりましたね。
参考
追記
2019/9/10
alexa-wemo-emulator が動かなくなってしまったので fauxmoESP に変更しました。
こんにちは
私は、esp8266-alexa-wemo-emulatorのライブラリーを使った時、SWはオンするのですが、勝手にOFFしてしまいます。更にON/OFFを繰り返します。
この改善法はありますか?