Amazon Echoで照明をオン・オフする 1(Arduino編)
※ はてなブログから引っ越しました(2019/10/21)
Philips HueのようにWorks with Alexa認定商品だとAmazon Echoから照明のオン・オフができるけど、自宅の照明は対応していないので自分で作ってみた。
こんな感じで、Amazon Echo、AWS、Raspberry Pi、Arduinoを組み合わせた。
この記事ではまずArduinoから照明をオン・オフする機能について書く。
リモコンの信号解析
こちらの記事を参考にリモコン(Panasonic HK9327K)のボタンを押した時にどのような信号が出力されるか解析した。
接続
あまり覚えていないけど、Arduino-IRremoteのexampleにあるIRrecvDumpかIRrecvDumpV2をAruduinoに書き込んで、受光部に向けてリモコンのボタンを押すとシリアルモニタに信号が表示される。1
# 調査結果
## 全灯ボタン
Encoding : UNKNOWN
Code : CA21A230 (32 bits)
Timing[83]:
+3500, -1700 + 450, - 400 + 450, - 400 + 450, -1300
+ 450, -1250 + 450, - 400 + 450, -1300 + 450, - 400
+ 450, - 400 + 450, - 400 + 450, -1300 + 450, - 400
+ 450, - 400 + 450, -1300 + 450, - 400 + 450, -1250
+ 450, - 400 + 450, -1300 + 450, - 400 + 450, - 400
+ 450, -1300 + 450, - 400 + 450, - 400 + 450, - 400
+ 450, - 400 + 450, - 400 + 450, - 400 + 450, -1300
+ 450, -1300 + 450, - 400 + 450, -1250 + 450, - 400
+ 450, - 450 + 400, -1300 + 450, - 400 + 450, -1300
+ 450, - 400 + 450, - 400 + 450, -1300 + 450, - 400
+ 450, - 400 + 450
unsigned int rawData[83] = {3500,1700, 450,400, 450,400, 450,1300, 450,1250, 450,400, 450,1300, 450,400, 450,400, 450,400, 450,1300, 450,400, 450,400, 450,1300, 450,400, 450,1250, 450,400, 450,1300, 450,400, 450,400, 450,1300, 450,400, 450,400, 450,400, 450,400, 450,400, 450,400, 450,1300, 450,1300, 450,400, 450,1250, 450,400, 450,450, 400,1300, 450,400, 450,1300, 450,400, 450,400, 450,1300, 450,400, 450,400, 450};
## お好みボタン
Encoding : UNKNOWN
Code : F6B92168 (32 bits)
Timing[83]:
+3500, -1700 + 450, - 400 + 450, - 450 + 450, -1250
+ 450, -1300 + 450, - 400 + 450, -1250 + 450, - 450
+ 400, - 450 + 450, - 400 + 450, -1250 + 450, - 400
+ 450, - 450 + 400, -1300 + 450, - 400 + 450, -1300
+ 450, - 400 + 450, -1250 + 450, - 450 + 450, - 400
+ 450, -1250 + 450, - 400 + 450, - 400 + 450, - 450
+ 450, - 400 + 450, -1250 + 450, - 400 + 450, -1300
+ 450, -1300 + 400, - 450 + 450, -1250 + 450, - 400
+ 450, - 400 + 450, - 450 + 450, - 400 + 450, -1250
+ 450, - 400 + 450, - 400 + 450, -1300 + 450, - 400
+ 450, - 400 + 450
unsigned int rawData[83] = {3500,1700, 450,400, 450,450, 450,1250, 450,1300, 450,400, 450,1250, 450,450, 400,450, 450,400, 450,1250, 450,400, 450,450, 400,1300, 450,400, 450,1300, 450,400, 450,1250, 450,450, 450,400, 450,1250, 450,400, 450,400, 450,450, 450,400, 450,1250, 450,400, 450,1300, 450,1300, 400,450, 450,1250, 450,400, 450,400, 450,450, 450,400, 450,1250, 450,400, 450,400, 450,1300, 450,400, 450,400, 450};
## 消灯ボタン
Timing[83]:
+3500, -1700 + 450, - 400 + 450, - 400 + 450, -1300
+ 450, -1250 + 450, - 400 + 450, -1300 + 450, - 400
+ 450, - 400 + 450, - 400 + 450, -1300 + 450, - 400
+ 450, - 400 + 450, -1300 + 450, - 400 + 450, -1250
+ 450, - 450 + 450, -1250 + 450, - 400 + 450, - 400
+ 450, -1300 + 450, - 400 + 450, - 400 + 450, - 400
+ 450, - 400 + 450, -1300 + 450, -1300 + 400, -1300
+ 450, -1300 + 450, - 400 + 450, -1250 + 450, - 400
+ 450, - 450 + 450, - 400 + 450, -1250 + 450, -1300
+ 450, - 400 + 450, - 400 + 450, -1300 + 450, - 400
+ 450, - 400 + 450
unsigned int rawData[83] = {3500,1700, 450,400, 450,400, 450,1300, 450,1250, 450,400, 450,1300, 450,400, 450,400, 450,400, 450,1300, 450,400, 450,400, 450,1300, 450,400, 450,1250, 450,450, 450,1250, 450,400, 450,400, 450,1300, 450,400, 450,400, 450,400, 450,400, 450,1300, 450,1300, 400,1300, 450,1300, 450,400, 450,1250, 450,400, 450,450, 450,400, 450,1250, 450,1300, 450,400, 450,400, 450,1300, 450,400, 450,400, 450};
信号出力
シリアルから1を入力すると「お好みボタン」、0を入力すると「消灯ボタン」を押した時と同じ信号を出力するようにする。 こちらの記事を参考に回路を作って動くには動いたけど、自分の部品構成ではこれで良いのかどうかよくわからず。抵抗の値が正しくないような気がする。。。
接続
Arduinoに書き込むコードはこちら。いくつかのサイトを参考に作成。コードがいまいちだがひとまずOKとした。
#include <IRremote.h>
IRsend irsend;
const int KHZ = 38; // 38kHz carrier frequency for the NEC protocol
const unsigned int IR_SIGNAL_ON[] = {3500,1700, 450,400, 450,450, 450,1250, 450,1300, 450,400, 450,1250, 450,450, 400,450, 450,400, 450,1250, 450,400, 450,450, 400,1300, 450,400, 450,1300, 450,400, 450,1250, 450,450, 450,400, 450,1250, 450,400, 450,400, 450,450, 450,400, 450,1250, 450,400, 450,1300, 450,1300, 400,450, 450,1250, 450,400, 450,400, 450,450, 450,400, 450,1250, 450,400, 450,400, 450,1300, 450,400, 450,400, 450}; // UNKNOWN F6B92168
const unsigned int IR_SIGNAL_OFF[] = {3500,1700, 450,400, 450,400, 450,1300, 450,1250, 450,400, 450,1300, 450,400, 450,400, 450,400, 450,1300, 450,400, 450,400, 450,1300, 450,400, 450,1250, 450,450, 450,1250, 450,400, 450,400, 450,1300, 450,400, 450,400, 450,400, 450,400, 450,1300, 450,1300, 400,1300, 450,1300, 450,400, 450,1250, 450,400, 450,450, 450,400, 450,1250, 450,1300, 450,400, 450,400, 450,1300, 450,400, 450,400, 450}; // UNKNOWN 1B9C2A92
void setup() {
Serial.begin(9600);
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
if (Serial.available() > 0) { // シリアル通信でデータが送られてくるまで待つ。
char c = Serial.read(); // 一文字分データを取り出す。
if (c == '1') { // 1が送られてきたらLEDを点灯させる。
digitalWrite(LED_BUILTIN, HIGH);
for (int i = 0; i < 3; i++) {
irsend.sendRaw(IR_SIGNAL_ON, sizeof(IR_SIGNAL_ON) / sizeof(IR_SIGNAL_ON[0]), KHZ);
delay(400);
}
} else if(c == '0') { // 0が送られてきたらLEDを消灯させる。
digitalWrite(LED_BUILTIN, LOW);
for (int i = 0; i < 3; i++) {
irsend.sendRaw(IR_SIGNAL_OFF, sizeof(IR_SIGNAL_OFF) / sizeof(IR_SIGNAL_OFF[0]), KHZ);
delay(400);
}
}
}
delay(1000);
}
動作確認
Arduinoに12VのACアダプタを接続して、シリアルモニタから1または0を入力して照明がオン・オフすることを確認する。2
わかったこと
- 赤外線LEDは940nmであること。他の波長ではダメ。
- 赤外線LEDはパワーが弱いものだと動作しない。最初使っていたものはダメだったので、買い直した。
- 今回使ったLEDは、ACアダプタから電源を供給する必要がある。
- MOSFETを使うことで電流を増幅することができる。
- V=IRの計算式はわかるが、実現したい回路を構成が今の知識ではよくわからない。
- 誤った回路にするとパーツが壊れる。LEDが何個か壊れた。
次回は、Raspberry Piからのオン・オフ操作