Arduino(ESP-WROOM-32)とGoogleHomeを組み合わせて
家の照明を音声で操作できるようにしました。
本当はエアコンの操作をしてみたかったのですが、エアコンの信号は全状態(運転モード/温度/風量など)をひとまとめにして送るらしく。。。
赤外線のパターン解析だけでも心が折れそうだったので照明の操作をすることにしました。
・用意したもの
ブレッドボード
ESP-WROOM-32
100円均一のランプのアンテナ(?)
5V電源装置
抵抗
トランジスタ(2SC1815Y)
処理の流れ
→GoogleHome(ねぇグーグル、明かりつけて)
→IFTTT
→Blynk
→Arduinoが赤外線発信
→明かりがつく!
いやー。ドラえもんの世界が近づいてきた感ありますね。
最の高であります。
・参考にさせていただいたサイト
赤外線リモコンを作る
Google Homeに話しかけてESP32でLチカしてみる
基本的なところは上記サイトの焼きましになってしまうので
上記サイトをご参照ください。
以下、つまづきポイントに絞って記述します
音声コマンド
ここでいきなりつまづきました。
「あかりつけて」はGoogleHomeが予約しているコマンドのようで。
そのままだと一般的なスマート家電に対して処理をしようとしてしまい、IFTTTにコマンドを送ってくれません。
なのでGoogleHomeアプリからルーティンで「あかりつけて」を別のコマンドとして無理やり認識させます。
これで「あかりつけて」と言うとGoogleHomeは「コマンド明かりつけて」と言われたと理解してくれます。
あとは音声コマンドにあわせてIFTTTから
http://【BlinkのIP】/【BlinkのAuthToken】/update/V1?value=【★★】
をWebRequestに入れてやることでIFTTTを経由してArduinoに信号がとんできます。
★★の部分はparam[0]で受け取ることができます。
ちゃんと信号がArduinoに届いてるかわからない
赤外線LEDは光っても肉眼では見えません。
なのでスマホのカメラ越しに確認してました。
わりとめんどうなのですが、他にいい手が思いつかなかった・・・
なんか不安定
エミッタフォロワが必要でした。
電子工作はデバッグが難しいですね。
赤外線の光が弱い
赤外線LEDに大電流をながすべく抵抗1Ωをつけてみたのですが全然照明が反応しませんでした。
今回作成した赤外線LEDの光り方と照明用リモコンの赤外線の光り方を見比べると、照明用リモコンのがだいぶ明るい。。。
いろいろ見ていると抵抗なしで赤外線リモコンを作られている方も多いようだったので思い切って(!)抵抗なしでやってみました。
が、スマホカメラ越しに確認するとだいぶ明るくなったようだが、まだ若干?暗い。
トランジスタがあかんのかなぁ・・・と思ってたときふとパラボラつけたらいけんじゃないかなと思いつきました。
以前、分解して電池ボックスを得ようと100均でLEDランプを買ったのですが
LEDランプについていたパラボラ反射板をたまたま捨てずにとっておいたのです。
赤外線LEDにパラボラをかぶせながら音声コマンドを言ってみたら・・・照明がついたー!
できたのがこちら。
ESP32がなぜかブレッドボードに刺さらなかったので浮いてます。雑。
ソースコードはこちら
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 |
#include "types.h" #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h> // 設定 char auth[] = "****"; //ご自分のBlynk用 auth コードに書き換えてください char ssid[] = "****"; //ご自分のルーターの SSID に書き換えてください char pass[] = "****"; //ご自分のルーターのパスワードに書き換えてください // 設定(Define) #define SERIAL_BPS (115200) /* Serial bps */ #define IR_OUT (13) /* Output */ #define DATA_SIZE (200) #define LIGHT_ON (0) //IFTTTのWebRequestのValue部分に該当 #define LIGHT_OFF (1) #define LIGHT_UP (2) #define LIGHT_DOWN (3) #define LIGHT_TIMER (4) //Panasonic製LED照明用赤外線コマンド定義 int irData[][DATA_SIZE] = { /*LIGHT_ON*/ {3512,1688,400,536,328,520,356,1344,396,1344,400,508,360,1348,392,540,328,540,336,508,360,1348,392,540,336,508,360,1340,400,540,328,1348,396,516,356,1344,400,528,340,508,360,1348,392,512,364,508,360,508,364,532,336,1344,400,496,372,1348,392,1348,392,540,328,1348,400,476,392,540,328,520,356,512,356,1348,392,520,348,520,356,1344,396,512,356,512,364,0}, /*LIGHT_OFF*/ {3420,1776,396,516,356,512,356,1384,360,1340,400,508,360,1348,400,504,364,512,356,516,360,1340,400,508,360,512,444,1260,392,520,356,1340,400,512,356,1344,400,508,360,480,392,1344,400,508,360,508,364,540,328,512,356,1348,396,1348,392,1348,392,1352,392,508,364,1380,364,508,360,508,360,516,356,1344,400,1340,400,540,328,484,384,1348,392,520,356,512,356,0}, /*LIGHT_UP*/ {3420,1776,400,512,356,512,364,1344,392,1348,392,496,380,1340,400,496,372,512,364,508,360,1348,392,512,356,484,392,1340,400,512,356,1348,392,512,356,1352,392,516,356,512,356,1344,400,516,352,516,356,540,328,540,336,540,328,540,328,1384,364,1344,396,512,356,1344,400,508,360,480,392,1380,364,508,360,1340,400,540,328,536,340,1340,400,512,356,496,372,0}, /*LIGHT_DOWN*/ {3504,1696,392,508,456,420,440,1260,492,1256,392,512,448,1260,480,420,364,512,356,540,420,1260,480,420,456,420,448,1252,488,420,448,1260,392,516,360,1340,492,420,444,428,444,1264,476,428,356,512,452,416,448,424,448,420,360,1348,484,1256,392,1352,480,420,448,1260,484,424,448,424,452,1252,492,1248,492,1252,480,420,448,428,448,1260,484,416,456,420,448,0}, /*LIGHT_TIMER*/{3504,1656,432,540,336,512,440,1264,392,1344,400,508,360,1340,400,512,364,508,364,504,360,1348,392,536,420,428,360,1348,392,516,444,1256,484,432,352,1344,396,540,328,520,356,1344,396,1344,392,1384,356,548,328,536,424,1256,392,540,336,476,392,512,356,516,360,1340,400,540,328,1348,396,508,356,484,392,540,328,1348,392,1352,392,536,340,508,360,1340,400,0} }; // プログラム void sendSignal(int signalID){ u2 time = 0; u4 count = 0; u4 us = 0; us = micros(); Serial.printf("sendSignal with signalID = %d count = %d datasize = %d \r\n", signalID,count,DATA_SIZE); for(count = 0; count < DATA_SIZE; count++){ time = irData[signalID][count]; //Serial.println(time); if(time == 0) { break; } us = micros(); do { digitalWrite(IR_OUT, !(count&1)); delayMicroseconds(8); digitalWrite(IR_OUT, 0); delayMicroseconds(7); }while(s4(us + time - micros()) > 0); } } void setup(){ // board setup Serial.begin(SERIAL_BPS); pinMode(IR_OUT, OUTPUT); // wifi setup sigmaDeltaSetup(0, 312500); sigmaDeltaAttachPin(5,0); sigmaDeltaWrite(0, 0); // blynk setup Blynk.begin(auth, ssid, pass); } void loop(){ Blynk.run(); } BLYNK_WRITE(V1){ //Blynk Virtual Pin sendSignal(param[0].asInt()); } |