- 赤外線リモコンの通信信号を確認する
- Arduinoで赤外線信号を作り機器を操作する
赤外線通信はフォーマットの種類や通信bitなど、掘り下げていけば難しいです。
しかし、実際に行っていることは赤外線LEDをチカチカさせて、その間隔で情報を伝達しているだけです。
なので、通信の中身がわからなくてもリモコンと同じように赤外線LEDをチカチカさせれば本体機器を操作することができます。
今回は、テレビのリモコンの電源スイッチの通信信号(赤外線LEDチカチカする間隔)を観察及び再現して、実際にテレビを操作してみたいと思います。
- 使用した物品一覧
- 通信信号の確認
- 波形の再現
使用した物品一覧
・使用した部品
No | 品名 | 備考 |
1 | 赤外線LED | |
2 | 赤外線LED用の抵抗 | 220Ωを使用 |
3 | タクトスイッチ | |
4 | Arduino Uno |
・使用する道具
No | 品名 | 備考 |
1 | ブレットボード&ジャンパー線 | |
2 | オシロスコープ |
通信信号の確認
オシロスコープと赤外線LEDを使用してリモコンの通信信号を確認します。
赤外線LEDは電力を送ると赤外線を発光しますが、逆に赤外線を受けるとアノード(+)ーカソード(-)間に電圧が発生します。この原理を使ってリモコンの通信信号を観察します。
プローブを赤外線LEDのアノード側にグランドリードをカソード(-)側に接続し、赤外線LEDに向けてリモコンのボタンを押すと通信信号が読み取れます。
Amazon等で4,000円~5,000円で売っている激安オシロスコープを使ってみましたが読取ることができました。しかし、通信信号が長いものは難しいかもしれないです。
波形の再現
観測した通信信号をもとに、タクトスイッチを押したらリモコンの通信信号のように赤外線LEDを点滅させるようなプログラムを書きます。
通信信号の読取りはMANパワーで行いました。横軸(時間)のレンジを工夫して確認します。
- HIGHになっている個数をMANパワーで確認(下の写真で34個分)
- HIGH及びLOWになる時間の種類の個数を確認(下の写真でHIGH時間2種類,LOW時間3種類)
HIGH及びLOWになる時間を変数として設定し、時間の変数を波形に合うように文字列を作成、それをHIGHの個数分だけfor文で回し、 delayの部分に時間の変数を入れるて、波形を再現しました。
また、自然界のノイズを避けるためHIGHとなる部分は38KHzで変調(周波数38KHzの波形になっている)とのこと。これをtone関数で再現しました。
最後に時間の変数を微調整して目標の信号にしていきます。少し違っても意外に本体の機器を操作することができました。最終的なプログラムは下記の通りになります。
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 |
#define frequency 38000 int pin=12; int a=250; //ON1の長さ int b=4000; //ON2の長さ int c=550; //OFF1の長さ int d=1650; //OFF2の長さ int e=2200; //OFF3の長さ int f=4400; //OFF4の長さ int g=16383; //OFF5の長さ int TV_OnTime[] = {b,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,b,a}; int TV_OffTime[] = {f,c,c,c,c,c,c,c,d,c,d,c,d,c,d,d,d,c,d,c,c,d,c,c,c,d,c,d,d,c,d,d,d,g,e,g}; void setup(){ Serial.begin(9600);//シリアルモニターを使うための設定 pinMode(pin,OUTPUT); pinMode(A5, INPUT_PULLUP); } void loop(){ Serial.println(analogRead(A5)); if(analogRead(A5)<50){ for(int i=0; i<36; i++) { tone(pin,frequency); delayMicroseconds(TV_OnTime[i]); noTone(pin); delayMicroseconds(TV_OffTime[i]); } delay(1000); } } |
感想
オシロスコープで波形を読んで、それ通りに赤外線LEDを点滅することで赤外線リモコンを作りました。実際は赤外線送信の規格や波長などの考え方があるようですが、とりあえず動けば良いだけなら今回の方法が考え方が簡単だと思います。