ESP32の赤外線リモコン学習/コピーツール

published_with_changes 更新日: event_note 公開日:

labelESP32 labelIoT

エアコンや照明などの家電を自作Alexaデバイスで操作できるようにします。つまり、赤外線(以下、IR)リモコンをAlexaで動かします。同じコンセプトの商品は色々売っています。ひとつは購入しリビングに置いて大変重宝しています。ただ、値段がちょっと張るので、各部屋用に買うのは無理です。だから、自作します。

(注記) これを作ったのは2年ほど前です。当時は市販のスマートホームコントローラーは1万円位してました。今はずいぶん安くなったみたいです。当時買ったものはモデルチェンジされたのか、もう売っていません。

コピーツールを作る

まずは、リモコンのIR信号を学習しコピーするためのツールを作りました。この学習リモコンで実際に家電が動くことを確認できたら、その内容で個別のAlexaリモコンデバイスに展開するという計画です。

事前に調べると、エアコンではIR信号の情報量が大きく、RAMが大きなマイコンを利用した方が良さそうです。そこで、ESP32を使うことにしました。


使い方は、① リセットボタンで待機状態にしてから、② リモコンを受信部に向けて押下 ③ 受信を確認したら、④ 送信ボタンを押下 ⑤ うまくいったら、arduino IDEのシリアルモニタに表示されているIRコードを記録(コピペ)です。

参考ブログ

参考にしたのはこのブログです。家電リモコンの出すIR信号を記録/解析し、その信号をそのまま送信します。学習リモコンの取り込んだIR信号でちゃんと動くのかを確認できますので、うまく動いたデータだけをピックアップできます。便利さに感心したので、そっくりまねさせていただきました。

(Arduino)ESP32モジュールを用いた赤外線学習リモコン送受信プログラム - Qiita

(Arduino)ESP32モジュールを用いた赤外線学習リモコン送受信プログラム - Qiita

プログラム動作内容
今回は、前回機能(赤外線リモコン受信モジュール(IRM3638)を使用して様々な赤外線リモコンデータ(テレビ、扇風機、エアコン等)を受信したものをArduinoのシリアルモニタにメーカーや受信データを表示)に...


赤外線信号の仕組みについて要領よくまとめられているのは、次の記事です。赤外線LEDの点灯を見る方法も書かれています。iphoneでは自撮り側のカメラを使います。私の場合は家電リモコンのLEDは点滅が見えましたが、同じようにやっても今回使ったLEDでは点灯が確認できませんでした。

赤外線リモコンについて

赤外線リモコンについて

色々な家電製品についているリモコン。みなさんも、普段から良く利用されていると思います。 でも、リモコンってどう言う原理で動作しているのでしょうか? ほんの少しですが、 赤外線リモコンについて解説したいと思います。

赤外線学習リモコン

学習リモコンはブレッドボード上で組みました。受信部と送信部にはタクトスイッチとプルダウン抵抗を入れています。受信部のタクトスイッチはリセット用、送信部のタクトスイッチは送信用のスイッチです。

送信の目視確認のため、赤色LEDをつけました。


受信部

IR受信モジュールは秋月電子で購入しました。電源にCRのローパスフィルターを設けるように記載があったので、事例と同じカットオフ周波数を狙い47Ωと47uFにしています。fc = 72Hzです。

CRフィルターなしではうまく受信できないケースがありましたが、CRフィルターをつけるとかなり取り込み精度が上がりました。(感覚では8,9割OK)


送信部

ESP32は3.3Vで動いており、デジタルpinも3.3V出力です。一方、上記の受信モジュールSPS-42は5V電源なので、IR LEDも同じ5V電源を利用します。

秋月電子購入の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Ωにしています。

パーツリスト

Part TypePropertiesAmount
ESP32-DevkitCvariant variant 11
IR Reciever赤外線リモコン受信モジュール SPS-442-1(38kHz)1
Infrared (940nm) LED3mm赤外線LED 940nm OSI5FU3A11C2
Red (633nm) LEDカラー Red (633nm); leg yes; パッケージ 5 mm [THT]1
NPN-Transistor2SC1815-Y タイプ NPN (ECB); パッケージ TO92 [THT]1
Electrolytic Capacitor電圧 16V; パッケージ 100 mil [THT, electrolytic]; capacitance 47uF1
47Ω Resistorbands 4; 抵抗 47Ω; tolerance ±5%; 3
1kΩ Resistorbands 4; 抵抗 1kΩ; tolerance ±5%; 1
10kΩ Resistorbands 4; 抵抗 10kΩ; tolerance ±5%; 2
4.7kΩ Resistorbands 4; 抵抗 4.7kΩ; tolerance ±5%; 1
220Ω Resistorbands 4; 抵抗 220Ω; tolerance ±5%; 1
Pushbuttonタクトスイッチ;A接点;1回路;1接点2


ソフトウエア

スケッチ

IR RecieverとIR LEDのピンアサイン以外は、参考にした"(Arduino)ESP32モジュールを用いた赤外線学習リモコン送受信プログラム - Qiita"のものをそのまま使わせていただきました。正しく読み込むための調整が施されているようです。

なお、このスケッチでは送信されるデータはrawデータではなく解析されたデータです。

送信コマンドはAC以外では、このようになっています。
      irsend.send(protocol_code, recv_data, recv_bits, 0); 
            //AC以外送信データコード(protocolコード、送信データ、送信ビット数、リピート回数)

ライブラリ

上記のスケッチでは、IR送受信のためのライブラリにIRremoteESP8266利用しています。ESP8266またはESP32で使えるライブラリです。


受送信データ事例

REGZAのチャンネル送りを受信したデータを示します。5回繰り返して、①と④は失敗していますが、他は成功しています。同じCode/Dataが取得できています。Raw データー(ON/OFF Data)ではパット見で違いは判りません。


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

Powered by Blogger | Designed by QooQ

keyboard_double_arrow_down

keyboard_double_arrow_down