☆ボードオレンジ:「活用事例2:赤外線リモコンで楽々操作しよう!」
.
Languages
English version is here : StarBoard Orange : "Application example No.2 : Add many buttons to your application with IR remote!"
概要
☆ボードは様々な応用事例を考慮して余計なユーザ入力用スイッチ等がありません。
ユーザの入力が欲しいアプリケーションでは、空いているポートにスイッチを接続することになりますが、これでは折角コンパクトにまとまっている☆ボードの特徴を生かせません。
そこで沢山の入力用スイッチをたった1つのポートで受ける事のできる赤外線リモコンを導入することを考えてみました。
このアプリケーションを使うことで、☆ボードの優れた可搬性を損なうことなく、多数の入力スイッチに対応できます。
コンパクトな☆ボードとあなたのアプリケーションをまるでテレビのように気軽に操作することが可能になります。
後述するサンプルプログラムには他の用途に転用可能なクラスライブラリも含まれますので、是非ご活用下さい。
用意するもの
物品
- ☆ボード
- mbed NXP LPC1768
- 赤外線センサ (PL-IRM2121-A538, PL-IRM0101-3, CRVP1738のいずれかを1つ。)
環境
- 赤外線リモコン (例:SONY社 RM-PZ1FD)
プログラム
以下のプログラムをインポートして下さい。
http://mbed.org/users/shintamainjp/programs/StarBoardOrangeExample2/latest
準備
赤外線リモコンを集める
家の中には沢山の赤外線リモコンがあると思います。幾つかをピックアップして下さい。
赤外線センサを取りつける
赤外線センサを取りつけます。今回はPL-IRM2121-A538を使用しました。
ブレッドボードに赤外線センサを取りつけてリード線を配線します。
☆ボードに接続して完成です。簡単ですね。
動作させてみる
このサンプルアプリケーションでは、赤外線リモートコントロールのプロトコルの中からNEC, AEHA, SONYの3つのプロトコルを認識し、受信パターンをLCDに表示することができます。
実際にプログラムをコンパイルしてmbedに投入し動作させてみましょう。
- プログラムが動作するとスプラッシュ画面の後に、「コントローラのボタンを押して下さい。」と表示されます。
- リモートコントローラのボタンを何か押してみて下さい。
- パターンを認識すると画面に識別パターンが表示されます。
- LEDはサンプリング毎に点灯パターンが変化します。
動作の様子
動画
下記の動画ではSONY社のテレビ用リモートコマンダー(RM-PZ1FD)を使ってNEC, AEHA, SONYの各プロトコルでの動作例を御紹介します。
RM-PZ1FDは電源ボタンを押しながら3桁の数字を入力すると各社のリモコン動作に切り替わる機能を持っています。
今回の例では以下のような切り替えを行いました。
設定番号 | テレビメーカ | プロトコル |
412 | 日立 | NEC |
411 | パナソニック | AEHA |
211 | ソニー | SONY |
サンプルアプリケーションでは左上に状態表示、その横に受信ビット数、右上にプロトコル種別が表示されます。
画面の下側には受信コードが表示されます。
NECプロトコルの出力例
AEHAプロトコルの出力例
SONYプロトコルの出力例
赤外線受信クラスの使い方
使い方の概要
赤外線受信クラスの使い方は簡単です。
コンストラクタに対して、赤外線モジュールの出力ピンを接続したピン名を与えます。例えば以下のような感じです。
ReceiverIR ir(p17);
後は状態取得関数を呼んで、ReceiverIR::Receivedならばデータを読みに行きます。
if (ReceiverIR::Received == ir.getState()) { ReceiverIR::Format format; uint8_t buf[32]; int bc = ir.getData(&format, buf, sizeof(buf)); }
bcには受信したデータのビット数が格納されます。
サンプルコード
以下はサンプルコードの一例です。
while (1) { static int latest_bits = 0; static ReceiverIR::State prev = ReceiverIR::Idle; /* * Get a current state. */ ReceiverIR::State curr = ir.getState(); if (prev != curr) { lcd.locate(0, 0); switch (curr) { case ReceiverIR::Idle: lcd.printf("Idle (%2d) \n", latest_bits); break; case ReceiverIR::Receiving: lcd.printf("Receiving \n"); break; case ReceiverIR::Received: lcd.printf("Received \n"); break; } } prev = curr; /* * Update statuses if it updated. */ if (ReceiverIR::Received == curr) { led = led + 1; ReceiverIR::Format format; uint8_t buf[32]; int bc = ir.getData(&format, buf, sizeof(buf)); latest_bits = bc; lcd.locate(10, 0); switch (format) { case ReceiverIR::UNKNOWN: lcd.printf(": ????"); break; case ReceiverIR::NEC: lcd.printf(": NEC "); break; case ReceiverIR::AEHA: lcd.printf(": AEHA"); break; case ReceiverIR::SONY: lcd.printf(": SONY"); break; default: break; } lcd.locate(0, 1); for (int i = 0; i < (bc / 8); i++) { lcd.printf("%02X", buf[i]); } for (int i = 0; i < 8 - (bc / 8); i++) { lcd.printf("--"); } } }
まとめ
- 赤外線センサを1つ取り付けるだけで沢山のスイッチの入力を受けられるようになります。
- 離れた場所から操作できるので気軽な操作感覚を楽しむことができるようになりました。
- アプリケーションに用いた赤外線受信処理は再利用可能なクラスとして設計実装しました。
関連情報
基本情報
活用事例
- ☆ボードオレンジ:「活用事例1:センサ1つでこんなに楽しいmbedワールド!」
- ☆ボードオレンジ:「活用事例2:赤外線リモコンで楽々操作しよう!」
- ☆ボードオレンジ:「活用事例3:wiiヌンチャクを使ってチョロQを運転しよう!」
関連文書
更新履歴
バージョン | 日付 | 更新内容 |
1.0.0 | 2010/08/13 | 初版。 |
1.0.1 | 2010/08/14 | 関連情報に活用事例を追加。 |
1.0.2 |
2010/08/22 |
動作確認済みデバイスにPL-IRM0101-3を追加。 関連情報に関連文書を追加。 |
1.0.3 | 2010/09/10 | 活用事例を更新。 |
- | - | - |
- | - | - |
- | - | - |
- | - | - |
- | - | - |
2 comments
You need to log in to post a comment
@kanpapa です。
手持ちの赤外線リモコン受信モジュール PL-IRM0101(38kHz)シールド付でも動作確認できました。
http://akizukidenshi.com/catalog/g/gI-00622/
いろいろ活用できそうですね。