実用ライブラリシリーズ:赤外線送受信ライブラリ
Languages
English version is here : http://mbed.org/users/shintamainjp/notebook/remote_ir_en/
概要
mbedを使ってユーザの入力を受け付ける事を考えた時、いちばん簡単に実現可能なのはスイッチの接続です。
しかしながら、mbedの各ピンにはペリフェラルが割り当てられていますし、それらのペリフェラルを使うならばスイッチはそれらのピンを避けて割り当てる必要があります。
数個ならまだしも、数十個のスイッチを接続するのは現実的ではありませんし、美しさに欠けます。
そこで、今回は赤外線リモコンを使ってユーザ入力受付処理を実現することを実現してみました。
これならば1つのピンを使って数十個のスイッチからの入力を受け付ける事ができます。
更にこのライブラリは送信にも対応しました。これにより家庭にある沢山の赤外線リモコンで制御する機器をmbedから制御できるようになります。
特徴
この赤外線送受信ライブラリには以下の特徴があります。
- NEC、AEHA、SONYの3つのプロトコルを標準でサポートします。
- 送信と受信に対応しています。
- 送信、受信処理は割り込みを使って自動的に行われます。
- データの中身については解釈しません。これにより様々なコントローラに対応可能です。
ライブラリ
クラス構成
ライブラリは以下のように2つのクラスから構成されています。
これらの2つのクラスを知っているだけで赤外線送受信処理を追加することができます。
- TransmitterIRクラスはデータをセットすると、自動的にデータを送信することのできるクラスです。
- ReceiverIRクラスは自動的にデータを受信して、データをゲットすることのできるクラスです。
プロジェクト
関連するプロジェクトはRemoteIRとRemoteIR_TestProgramの2つです。
ライブラリはRemoteIRにあります。このライブラリは他のプログラムでそのまま使うことができるようにmbedのライブラリ及びテストプログラムは含んでいません。
テストプログラムを実行してみたい時にはRemoteIR_TestProgramを使って下さい。
使い方
受信クラスと送信クラスの使い方をそれぞれ解説します。
受信クラス
プログラム内部でReceiverIRを生成します。生成時のパラメータに赤外線受光モジュールを接続したピン名を与えます。
#include "ReceiverIR.h" ReceiverIR ir_rx(p15);
後はgetState()を呼んでReceiverIR::Received状態になっていればデータを読み込みます。
RemoteIR::Format format; uint8_t buf[32]; int bitcount; if (ir_rx.getState() == ReceiverIR::Received) { bitcount = ir_rx.getData(&format, buf, sizeof(buf) * 8); }
formatには認識したフォーマット種別が格納されます。getDataの最後の引数は与えたバッファに格納可能な最大ビット数です。
bitcountには受信したビット数が格納されます。
上記のように2つのAPI(getState, getData)のみで赤外線受信処理を行うことができます。
回路
送信クラス
プログラム内部でTransmitterIRを生成します。生成時のパラメータに赤外線LEDを制御するピン名を与えます。
#include "TransmitterIR.h" TransmitterIR ir_tx(p21);
後はgetState()を呼んでTransmitterIR::Idle状態になっていればデータを書き込みます。
RemoteIR::Format format = RemoteIR::SONY; uint8_t buf[] = { 0x80, 0x00 }; int bitcount = 12; if (ir_tx.getState() == TransmitterIR::Idle) { bitcount = ir_tx.setData(format, buf, bitcount); }
formatには送信時に用いるプロトコルを指定します。setDataの最後の引数は与えたバッファに格納されているデータビット数です。
上記のように2つのAPI(getState, setData)のみで赤外線送信処理を行うことができます。
回路
その他
簡単なサンプル実装があります。
RemoteIR_TestProgramを参考にして下さい。
研究と検証
赤外線通信には様々な規格が存在します。ここでは各社のフォーマットの実波形を元に簡単に赤外線通信について触れます。
また、ライブラリ動作の検証もここで行います。
信号はいずれも赤外線受信デバイスの出力を観測したもので、この信号は論理が反転しています。
また、各プロトコル共にデータは1バイト単位でLSBから順に送信する形になっています。
NEC
- 単位時間:T=562u[sec]
- リーダ:16T+8T(データ送信時)、16T+4T(リピート送信時)
- データ:32ビット固定長(データ送信時)、なし(リピート送信時)
- ストップ:あり
- データビット:1T+1T(ビット0)、1T+3T(ビット1)
上記の観測結果からデータを抽出すると以下のようになります。
それではこのデータを受信してサンプルプログラムで確認してみましょう。
AEHA
- 単位時間:T=425u[sec]
- リーダ:8T+4T(データ送信時)、8T+8T(リピート送信時)
- データ:可変長(データ送信時)、なし(リピート送信時)
- ストップ:あり
- データビット:1T+1T(ビット0)、1T+3T(ビット1)
上記の観測結果からデータを抽出すると以下のようになります。
それではこのデータを受信してサンプルプログラムで確認してみましょう。
SONY
- 単位時間:T=600u[sec]
- リーダ:4T
- データ:可変長
- ストップ:なし
- データビット:1T+1T(ビット0)、1T+2T(ビット1)
12ビット
上記の観測結果からデータを抽出すると以下のようになります。
それではこのデータを受信してサンプルプログラムで確認してみましょう。
15ビット
上記の観測結果からデータを抽出すると以下のようになります。
それではこのデータを受信してサンプルプログラムで確認してみましょう。
参考文献
更新履歴
バージョン | 日付 | 更新内容 |
1.0.0 | 2010/08/21 | 初版。 |
1.0.1 | 2010/10/18 | 送受信回路図を追加。 |
- | - | - |
- | - |
- |
- | - | - |
- | - | - |
- | - | - |
- | - | - |
- | - |
- |
謝辞
ありがとうMr.Johan Philippeさん。
0 comments
You need to log in to post a comment