fc2ブログ

記事一覧

ArduinoのIRリモコン用ライブラリ(IRremote)を徹底的に試してみる

Arduino用の赤外線リモコン操作のためのライブラリ、IRremoteを利用してIRリモコンのテスターを作ってみた。
IRremotetester07.jpg
使用した、あるいは参考にさせていただいた主なハード、ソフトは以下の通りである。
1. Arduino-IRremote-master(z3t0/Arduino-IRremoteVersion - 2.2.1)
2. TimeOne(タイマー1ライブラリ
3. I2C接続小型キャラクタLCDモジュール(秋月電子 K-08896))
4. arduino_ST7032-master(I2C液晶のArduinoライブラリST7032@オレ工房
5. Arduino Pro Mini 外部発振8MHz(3.3V)のファームウェアを書き込んだAtmega328P。電池動作を考えてこれを選択
6. Arduino IDE Ver. 2.2.1
7. 2色LED付スイッチ付ロータリーエンコーダ(秋月電子 P-05769
8. ロータリーエンコーダ用スケッチ(ラジオペンチさんのブログ)。秋月のロータリーエンコーダではハードでA相、B相の結線の入れ替えが必要だった。

これを作ったきっかけは家人がバザーでLEDキャンドルを購入してきたことである。外装には本物のロウを使っていて、香りも発する、ある意味ヘンテコなものではある。
IRremotetester00.jpg

あるときSonyのテレビのリモコンの番組表ボタンを押すとこれがピカピカと反応することに気が付いた。不思議に思って調べたら、この商品のオプションとしてリモコンが販売されていることが分かったが、amazon.comからの購入が面倒だし、2ボタンしかない小さなリモコンの割には高価なのでこれの自作にチャレンジしてみることにした。ところがそもそもリモコンの送信機がどこにもないのでフォーマット、データ(アドレスあるいはメーカー識別コード、コマンドコード)が分からない。Linux用のリモコンデータの登録サイトを見てもこの機種のデータが見当たらなかったので、フォーマットを変えながらデータをしらみつぶしに送ってそれらを特定しようと考えた。そこでお手軽なArduino IDEとIRremoteライブラリ、そしてあり合わせのパーツを使ってそのための装置を作ることにしたのである。

ただし残念ながらこれまでの処、問題のフォーマット、データの特定には至っていない。というよりもギブアップした。
現状のIRremoteライブラリの作り込みがイマイチ足りず正解を見逃す(スキップする)可能性も大いにあるのに加えて、そもそも調査にかなりの時間がかかることに気が付いたためだ(32ビット長データの場合最大数十万時間必要!)。

ターゲット仕様
ターゲットとした仕様は以下の通りである。
1. IRremoteライブラリに登録されているすべてのフォーマット(RC5、NEC、、SONYなど16種類)に対応できる
2. 送信データ、データのビット長、フレームのリピート回数、フレーム間のインターバルが設定できる
3. データの範囲を定めてその間のデータを順次インクリメントしながら自動的に送信できる
4. 受信とデータの解析もできる。受信したデータは送信のパラメータとしてそのまま利用できる
5. 諸設定はEEPROMに保存して、次回起動時にレストアする

ハードウェア結線図
IRの受光モジュールの信号はArduinoのピン11(OC2A)に接続した。そのせいでロータリーエンコーダ用の割り込みはタイマー1を使うこととなってしまった。IR送信信号はライブラリ内の設定に従ってピン3(OC2B).に接続した。電池電圧をピン23(PC0)に抵抗分圧して印加して測定する。
<20170804 高解像の画像に置き換え>
IRremotetester09.jpg

ソフトウェア
プログラムストレージ領域の22,110バイト (71%)を使用している。IRremoteライブラリ内のすべてのIRフォーマットを使っているので大きくなっているようだ。データ(IRremoteではアドレスとコマンドコードを一緒くたにMSBファーストで合わせたものである。日本人的なきめ細かさを期待してはいけない)の大きさは最大32ビットに対応できるようにしている。
スケッチはこちら
<2019/07/31追記> 更新。クロックを8MHzとしたのと受信データの解析、表示部分に問題があったのを修正。
<2019/08/26追記> 更新。ライブラリマネージャーからインストールできるライブラリだけを使うように変えました。
<2022/04/02追記> 更新。チャタリング問題をほぼ解消しました。
ポリマーリチウム電池を電源とするようにハードを変更しましたので、電池電圧を測定し、いい加減な計算をしてコントラストを調整するようにしています。固定電圧で使われる場合はスケッチ中の以下の部分を修正してください。電池電圧測定の部分も適宜変更してください。
 lcd.setcontrast(55.0 * 3300 / BATTV - 25); // コントラスト設定

ハマりどころ
IRremoteライブラリでは受信可能状態(irrecv.enableIRIn()、irrecv.resume() をコールした後)になるとATmegaのIR送信のピンがなんとフローティング(High-z)状態になってしまうのだ。したがってこのピンにIR LEDドライブ用のMOSFETを繋ぐときはゲート電圧が不定にならないように配慮しなければならない。さもないとこのMOSFETがノイズ発生源になってしまい、ありもしない異常データを受信してしまうことになる。

製作物
いつものように秋月電子のC型基板に回路を組み、117ポリカーボケースに収めている(使用したキャラクタLCDモジュールは地の色が暗くて表示状態の写真がうまく撮れない)。各項目のオプションの選択、数値の増減はロータリーエンコーダで行う。ロータリーエンコーダのツマミを押し込むと決定、GO/STOPタクトスイッチを押すとタスクの実行/停止となる。ロータリーエンコーダ内蔵の2色LEDも状態表示に利用している。

単一データの送信設定
IRremotetester01.jpg

データの順次送信設定
IRremotetester02.jpg

フレームのリピート回数、フレーム間のインターバルの設定
IRremotetester03.jpg

受信データの解析、表示
読み込まれたコードはEEPROMに保存されるし、送信時にそのまま利用できる。
コードは、customコード、dataコードを"一緒くた"にして、ベタに「MSBit first」で表示される点に注意(IRフォーマットの規格のコードの記述は「LSBit first」で記述されている)。
IRremotetester04.jpg

その他
IRリモコンの通信フォーマットについては、elm-chanさんのサイトに丁寧に解説してあるので参考になるはず。
スポンサーサイト



コメント

コメントの投稿

非公開コメント

プロフィール

vabenecosi

Author:vabenecosi
ン十年間アキバに通い続けるオジサンです。自転車&バイク=二輪で旅するのも好きです。
本ブログはリンクフリーです。
本ブログの記事の内容を元にした製作等の行為は全て自己責任で行ってください。
またコメントを頂いてもスパム対策、あるいは管理者の判断により返信しない場合や削除する場合がありますが、ご了承ください。
旅関係の記事を書くこともあるでしょうが、専ら「アルバム」にて旅の写真のみを提供するつもりです。「アルバム」はPC画面では右下方に、スマホ画面では左上のメニューボタンの中にリンクがあります。

アルバム

FC2カウンター