前回の記事の”ESP8266とalexaで家電を制御する fauxmoESP編 〜TVを音声コントロール〜”ではfauxmoESPの導入までは簡単ですが、実際のプログラムなどが複雑→たとえばTVを制御する為に赤外線信号を使うのでIRRemotoというライブラリなども必要でプログラムが煩雑・・
なので今回はわかりやすく、fauxmoESPを単純にalexaと連携させて、aleaxからの音声制御にてESP8266のポートをon、offさせて他の機器を制御するという簡単な仕組みを目指します。
安い照明器具などはアレクサに対応していませんが、簡単な改造でアレクサによる音声制御ができてしまいます。
照明を音声制御する全体像について
alexaで蛍光灯を制御する全体図は↓こんな感じ。
今回も第3世代のamazon echoを使うので、ESP8266とalexaを連携するライブラリはfauxmoESPというライブラリを使用します。
詳細はこちらから→ESP8266とalexaで家電を制御する fauxmoESP編 〜TVを音声コントロール〜”
赤外線信号をESP8266から出さなくてよく、ESP8266からはON,OFFの信号だけでいいのでプログラム的に楽です。
on,offの信号を蛍光灯の既存の赤外線リモコンに出力してリモコンを操作します。
それには既存のリモコンの物理ボタンをESP8266からの出力で動くように簡単な改造をします。
alexaとESP8266で動かせる照明リモコンの改造
今回使った蛍光灯のリモコンはmaruzennの赤外線リモコンです、10年以上前のもので、もちろんalexa連携できないものです。
↓これがそれです。
リモコンとしてはすごーく簡単な仕組みで
単三電池2本(3V)で動作しており、スイッチはプッシュスイッチになっています。
分解したリモコン↓
プッシュスイッチはスイッチングによってリモコンのICのどこかの入力をONにしているようです。
なので、ESP8266からの信号でリモコンのICに電圧が加わるようにします。
今回はフォトカプラという部品を使って電気的にリモコンのスイッチングを行うようにします。
他にもトランジスタやFETやリレーなどでも応用可能だと思いますが手持ち部品にフォトカプラが余っていたので使う事にしました。
フォトカプラっつうのは電気的に絶縁して他の機器のスイッチングをしたりするもので、電圧が違う機器どうしを繋いだり電気的に絶縁したい時なんかに使います。
使い方は簡単で、1番のアノードに電圧を加えるとフォトカプラ内のLEDが光ってその光によって4番のコレクタから3番のエミッタへ電流が流れます。
なので、リモコンのプッシュスイッチの電圧の高い方を4番につないで、3番にもう一方を接続します。
ESP8266は出力ポートから1KΩくらいの抵抗をいれて1番のアノードへ接続し2番のカソードはESP8266のGNDへ接続するだけです。
今回はESP8266からの出力ON→フォトカプラが導通→リモコンのスイッチON という構図です。
蛍光灯のリモコンのプッシュスイッチも取り外して、電線を取り付けました。
白色側の電線の電圧が高いので、フォトカプラの4番を白、3番に黄色を取り付ける事にします。
全体の回路図
下図のように配線します。
プログラムについて
とりあえずarduinoのプログラムを全文いれときます。
ほとんどfauxmoESPのライブラリ通りです。
ポイントは110行目の実際にポートをオンオフさせるプログラムですが、蛍光灯リモコンの特性で一度点けて消す時に一段暗くなってもう一回押すと消えるといった調光の機能がついている為プログラム上で消す司令のときは2回の出力を出すようにしています。
- #include <Arduino.h>
- #ifdef ESP32
- #include <WiFi.h>
- #else
- #include <ESP8266WiFi.h>
- #endif
- #include “fauxmoESP.h”
- // Rename the credentials.sample.h file to credentials.h and
- // edit it according to your router configuration
- #include “kazunet.h”
- fauxmoESP fauxmo;
- // —————————————————————————–
- #define SERIAL_BAUDRATE 115200
- #define light 4 //ESP8266でD2にあたる
- #define ID_Light “light lamp”
- // —————————————————————————–
- // —————————————————————————–
- // Wifi
- // —————————————————————————–
- void wifiSetup() {
- // Set WIFI module to STA mode
- WiFi.mode(WIFI_STA);
- // Connect
- Serial.printf(“[WIFI] Connecting to %s “, WIFI_SSID);
- WiFi.begin(WIFI_SSID, WIFI_PASS);
- // Wait
- while (WiFi.status() != WL_CONNECTED) {
- Serial.print(“.”);
- delay(100);
- }
- Serial.println();
- // Connected!
- Serial.printf(“[WIFI] STATION Mode, SSID: %s, IP address: %s\n”, WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
- }
- void setup() {
- // Init serial port and clean garbage
- Serial.begin(SERIAL_BAUDRATE);
- Serial.println();
- Serial.println();
- // lightsetup lightを出力に設定
- pinMode(light, OUTPUT);
- //とりあえずD2のlight出力をlowにして出力を0Vにしておく
- digitalWrite(light, LOW);
- // Wifi
- wifiSetup();
- // By default, fauxmoESP creates it’s own webserver on the defined port
- // The TCP port must be 80 for gen3 devices (default is 1901)
- // This has to be done before the call to enable()
- fauxmo.createServer(true); // not needed, this is the default value
- fauxmo.setPort(80); // This is required for gen3 devices
- // You have to call enable(true) once you have a WiFi connection
- // You can enable or disable the library at any moment
- // Disabling it will prevent the devices from being discovered and switched
- fauxmo.enable(true);
- // You can use different ways to invoke alexa to modify the devices state:
- // “Alexa, turn yellow lamp on”
- // “Alexa, turn on yellow lamp
- // “Alexa, set yellow lamp to fifty” (50 means 50% of brightness, note, this example does not use this functionality)
- // Add virtual devices
- fauxmo.addDevice(ID_Light);
- fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state, unsigned char value) {
- // Callback when a command from Alexa is received.
- // You can use device_id or device_name to choose the element to perform an action onto (relay, LED,…)
- // State is a boolean (ON/OFF) and value a number from 0 to 255 (if you say “set kitchen light to 50%” you will receive a 128 here).
- // Just remember not to delay too much here, this is a callback, exit as soon as possible.
- // If you have to do something more involved here set a flag and process it in your main loop.
- Serial.printf(“[MAIN] Device #%d (%s) state: %s value: %d\n”, device_id, device_name, state ? “ON” : “OFF”, value);
- // Checking for device_id is simpler if you are certain about the order they are loaded and it does not change.
- // Otherwise comparing the device_name is safer.
- //ここからアレクサで司令を出した時のアクションを設定 デバイスの名前が呼ばれた時に下が反応してstateの種類により動作をわけました。
- if (strcmp(device_name, ID_Light)==0) {
- if(state==true){
- //lightをONして!!の反応
- digitalWrite(light,HIGH);
- delay(300);
- digitalWrite(light,LOW);
- }else{
- //lightをOFFして!!の反応だけど調光機能で、2回押さないと消えないので2回ボタンを押したのと同様のプログラムにする。
- //一回め
- digitalWrite(light,HIGH);
- delay(300);
- digitalWrite(light,LOW);
- delay(300);
- //二回め
- digitalWrite(light,HIGH);
- delay(300);
- digitalWrite(light,LOW);
- }
- }
- });
- }
- void loop() {
- // fauxmoESP uses an async TCP server but a sync UDP server
- // Therefore, we have to manually poll for UDP packets
- fauxmo.handle();
- // This is a sample code to output free heap every 5 seconds
- // This is a cheap way to detect memory leaks
- static unsigned long last = millis();
- if (millis() – last > 5000) {
- last = millis();
- Serial.printf(“[MAIN] Free heap: %d bytes\n”, ESP.getFreeHeap());
- }
- }
書き込み時の注意点
2019年10月の時点ではFaumoESPを使用してESP8266とalexaを連携する時にはなにも異常がなかったのですが、12月に入って同様のプログラムを書き込みalexa側でデバイスを検索すると、3デバイス以上を設定しているとデバイスが検索できないという事態に遭遇しました。
FauxmoESP側でデバイス数を3つまでにすると、認識するのに・・・
書き込み時のライブラリバージョンは
ESP8266wifi1.0
FauxmoESP 3.1.0
ESPAsyncTCP-master 1.2.0
IRremoteESP8266 2.7.1
esp8266Community 2.6.3
で色々ライブラリのバージョンをもどしたりしましが改善せず。
いろいろ探した結果↓同様の内容で困っている外国人を発見し書き込み時の設定を見直す事で複数のデバイスを認識させる事に成功しました。
https://bitbucket.org/xoseperez/fauxmoesp/issues/94/cannot-create-more-than-3-devices
v1.4Higher Bandwidthに変更する事で解決です。!!
ライブラリの内容をほとんど変える事なく簡単に家電を音声制御できるようになりました。
たくさん書いているようですが本当にライブラリの例をほとんど変更してません。
詳しくは→ESP8266とalexaで家電を制御する fauxmoESP編 〜TVを音声コントロール〜”
あとは、自宅のwifi環境でこのESP8266に電源を供給してwifiと繋がる事を確認したのちに、スマホでアレクサでのデバイス検出を行い定型アクションで呼び出しの言葉を設定してやるだけです。
第3世代のalexaでも動作するfauxmoESPは最高です。