エアコンや照明などの家電を自作Alexaデバイスで操作できるようにします。つまり、赤外線(以下、IR)リモコンをAlexaで動かします。同じコンセプトの商品は色々売っています。ひとつは購入しリビングに置いて大変重宝しています。ただ、値段がちょっと張るので、各部屋用に買うのは無理です。だから、自作します。
(注記) これを作ったのは2年ほど前です。当時は市販のスマートホームコントローラーは1万円位してました。今はずいぶん安くなったみたいです。当時買ったものはモデルチェンジされたのか、もう売っていません。
コピーツールを作る
まずは、リモコンのIR信号を学習しコピーするためのツールを作りました。この学習リモコンで実際に家電が動くことを確認できたら、その内容で個別のAlexaリモコンデバイスに展開するという計画です。
事前に調べると、エアコンではIR信号の情報量が大きく、RAMが大きなマイコンを利用した方が良さそうです。そこで、ESP32を使うことにしました。
参考ブログ
参考にしたのはこのブログです。家電リモコンの出すIR信号を記録/解析し、その信号をそのまま送信します。学習リモコンの取り込んだIR信号でちゃんと動くのかを確認できますので、うまく動いたデータだけをピックアップできます。便利さに感心したので、そっくりまねさせていただきました。
赤外線信号の仕組みについて要領よくまとめられているのは、次の記事です。赤外線LEDの点灯を見る方法も書かれています。iphoneでは自撮り側のカメラを使います。私の場合は家電リモコンのLEDは点滅が見えましたが、同じようにやっても今回使ったLEDでは点灯が確認できませんでした。
赤外線学習リモコン
学習リモコンはブレッドボード上で組みました。受信部と送信部にはタクトスイッチとプルダウン抵抗を入れています。受信部のタクトスイッチはリセット用、送信部のタクトスイッチは送信用のスイッチです。
送信の目視確認のため、赤色LEDをつけました。
受信部
IR受信モジュールは秋月電子で購入しました。電源にCRのローパスフィルターを設けるように記載があったので、事例と同じカットオフ周波数を狙い47Ωと47uFにしています。fc = 72Hzです。
CRフィルターなしではうまく受信できないケースがありましたが、CRフィルターをつけるとかなり取り込み精度が上がりました。(感覚では8,9割OK)
送信部
秋月電子購入のIR LEDを出力アップを狙い2個直列で使います。このとき、ESP32のデジタルpin出力をそのまま使うと電流不足の心配があるらしいので、NPNトランジスタを使って5V電源から引っ張り込むようにします。
5V電源はESP32のVINpinから取り込みます。これはESP32で作られた5Vではなく供給された電圧がそのまま出ているようです。したがって、電流の制限も供給電源(DCアダプタ)で決まり、電流不足は起きないだろうと予想しています。
LED電流制限抵抗:
LEDの順方向電圧降下Vf = 1.35Vです。順方向電流は最大値100mAを狙います。ただし、コレクタ損失は400mWですので「400mW ÷ 5V」で最大80mAしか流せません。その時の抵抗は、
( 5 - 2 x 1.35 ) / ( 80 /1000 ) = 29 Ω 以下が必要になるので、47kΩを並列で使い 23.5Ω とします。
トランジスタまわりの設計:
NPNトランジスタは2SC1815-Y (hfe : 120~240)を使います。コレクタ電流100mAを流せるベース電流は、余裕を2倍にすると、
2 x 100 (mA) / 120 = 1.7mA
2SC1815-Yのベース・エミッタ間飽和電圧1.0Vです。ベースの電流制限抵抗 R3は、
( 3.3 - 1.0) / (1.7 / 1000 ) ≒ 1350 Ω
になるので、1kΩを選びます。 プルアップ抵抗R2は4.7kΩが手元にあったのでこれを選びました。
参考までにLTspiceで計算してみると、コレクタ電流88mA、ベース電流2mAとなりました。
IR LEDだけだと、送信できているのかわからないので、5V電源とコレクタ間に赤色LEDをつけました。このLEDの電流制限抵抗は220Ωにしています。
パーツリスト
ソフトウエア
スケッチ
IR RecieverとIR LEDのピンアサイン以外は、参考にした"(Arduino)ESP32モジュールを用いた赤外線学習リモコン送受信プログラム - Qiita"のものをそのまま使わせていただきました。正しく読み込むための調整が施されているようです。
なお、このスケッチでは送信されるデータはrawデータではなく解析されたデータです。
irsend.send(protocol_code, recv_data, recv_bits, 0);
//AC以外送信データコード(protocolコード、送信データ、送信ビット数、リピート回数)
ライブラリ
上記のスケッチでは、IR送受信のためのライブラリにIRremoteESP8266利用しています。ESP8266またはESP32で使えるライブラリです。
受送信データ事例
Protocol : UNKNOWN
Code : 0x9998DF33
Bits : 36
ON/OFF Data : rawData[71] = {9194, 4242, 818, 302, 810, 310, 806, 312, 804, 316, 796, 324, 792, 326, 790, 1442, 794, 328, 786, 1446, 790, 1442, 792, 1440, 790, 1442, 788, 1444, 788, 1444, 788, 330, 784, 1448, 784, 1448, 784, 1448, 784, 334, 782, 1450, 782, 1450, 782, 338, 778, 342, 778, 344, 772, 346, 774, 346, 770, 1462, 778, 344, 768, 350, 762, 1468, 772, 1462, 772, 1460, 770, 39470, 9068, 2118, 724, }
Data : 0x9998DF33
②
Protocol : NEC
Code : 0x2FDD827
Bits : 32
ON/OFF Data : rawData[71] = {9140, 4294, 686, 432, 700, 420, 702, 418, 702, 420, 700, 418, 696, 424, 692, 1540, 680, 442, 684, 1546, 676, 1556, 676, 1554, 676, 1558, 674, 1558, 674, 1560, 674, 444, 678, 1556, 676, 1556, 674, 1558, 674, 444, 676, 1558, 674, 1558, 672, 446, 674, 446, 674, 446, 674, 444, 674, 444, 674, 1558, 672, 448, 674, 448, 670, 1560, 674, 1560, 672, 1560, 672, 39568, 9064, 2120, 670, }
Address : 0x40
Command : 0x1B
Data : 0x2FDD827
③
Protocol : NEC
Code : 0x2FDD827
Bits : 32
ON/OFF Data : rawData[71] = {9074, 4356, 666, 454, 666, 452, 662, 458, 660, 460, 656, 464, 654, 466, 652, 1580, 652, 468, 648, 1582, 650, 1582, 648, 1586, 648, 1584, 650, 1582, 648, 1586, 648, 470, 648, 1584, 646, 1584, 648, 1586, 646, 474, 646, 1586, 646, 1588, 644, 472, 646, 474, 646, 474, 644, 474, 646, 474, 646, 1588, 646, 474, 646, 476, 644, 1590, 644, 1586, 646, 1588, 646, 39594, 9034, 2150, 646, }
Address : 0x40
Command : 0x1B
Data : 0x2FDD827
④
Protocol : UNKNOWN
Code : 0x9998DF33
Bits : 36
ON/OFF Data : rawData[71] = {9130, 4304, 824, 296, 806, 316, 792, 326, 784, 336, 782, 338, 766, 354, 754, 1478, 784, 336, 762, 1470, 780, 1452, 780, 1452, 782, 1450, 780, 1452, 782, 1454, 776, 342, 738, 1492, 766, 1470, 766, 1464, 768, 352, 728, 1504, 754, 1476, 762, 358, 728, 392, 718, 402, 712, 408, 708, 412, 706, 1526, 726, 392, 710, 412, 704, 1528, 722, 1512, 730, 1502, 732, 39506, 9106, 2076, 746, }
Data : 0x9998DF33
⑤
Protocol: NEC
Code : 0x2FDD827
Bits : 32
ON/OFF Data : rawData[71] = {9172, 4260, 726, 394, 726, 392, 728, 392, 728, 390, 728, 394, 726, 394, 726, 1506, 726, 396, 724, 1508, 726, 1506, 726, 1506, 726, 1506, 726, 1510, 722, 1508, 726, 394, 726, 1506, 726, 1504, 726, 1510, 722, 396, 726, 1506, 726, 1506, 724, 396, 726, 392, 724, 396, 724, 396, 724, 396, 724, 1506, 724, 396, 724, 394, 726, 1508, 722, 1508, 724, 1508, 724, 39514, 9204, 1980, 812, }
Address : 0x40
Command : 0x1B
Data : 0x2FDD827