● 実験テーマ115

「赤外線リモコン受信モジュールの実験」 (秋月で手軽に入手出来る"OSRB38C9AA"モジュールを使っての実験です。)

※ 190521:
   1回目の更新です。
  
TVの音声アンプとして使っている、Roland MA-8 パワーアンプの、電源ON/OFFを、リモコンで制御
   出来るようにしました。
   パワーアンプ本体の、電源SWはONしておいて、ACテーブルタップに供給されている、AC100Vの片側を
   aitendoの、リレーモジュール:K-M1CH-Nの、リレー接点で、ON/OFFすることにしました。

※ 2019年4月24日からの記事を参照してください。


以下、この実験の顛末記です。

■ 2019.3.29
  ・テレビの音声用・外部アンプの、AC電源を、手持ちのリモコンにより、リレー接点でON/OFFコントロールしようと
   思ったのが、
の実験をしようと思った切っ掛けです。
   受光素子(Infrared Receiver Module)には、秋月で安価で入手出来る、OptpSupply社の「OSRB38C9AA」
   を使うことにしました。
   これにはフォト・ダイオードの他に、I-V変換+フィルタ等による復調回路が組まれており、これだけで
   リモコンからの受信コード信号(TTL又はCMOSレベル)が得られる優れ物です。


■ 2019.3.30〜 2019.4.1
 
 ・簡単な実験冶具を作り、手持ちのリモコンの送信コードを受信して、シリアル信号を観測してみました。
   以下に観測結果を示します。

  ・最初に、SonyのDVD Playerの、リモコン:RMT-D152Jの、DVD電源ボタンを押した時の受信波形を観測してみました。
   2.4mS幅のガイドパルスの後、20bitデータ(7bit+13bitアドレス)+エンド・マークになり、これがボタンを押している
   間、繰返し送信されて来ます。
   送信側では、副搬送波:37.9kHzで変調された発光on/off信号が送信されます。
   受信側では、on部は、Loバルスになり、off部は、Hiパルスになります。
   受信側でデータ部の、Hi/Loは、Hiパルス幅と、Loバルス幅の比で判断します。
   Hiパルス幅は、両者共に、0.6mSです。
   なので、Loパルス幅の違いで判断できます。
   Loパルス幅が、1.2mS(0.6x2)の時は、Hiで、Loパルスの時は、0.6mS(0.6x1)という具合です。

   次に、audio-technicaのTVリモコン:ATV-515を、Sonyコード出力に設定して、TV電源ボタンを押した時の受信波形を観測してみました。
   こちらは、データ送信区間が短く、12bitデータ(7bit+5bitアドレス)でした。
   コードを目視読取りすると、0x0A90 でした。
   繰り返し間隔は、45mSでした。

   ※ 尚、赤外線通信の解説については、このサイトが解りやすかったです→ 「ELM by ChaN:赤外線リモコンの通信フォーマット」


■ 2019.4.4〜 2019.4.7
 
 ・最初の実験では、赤外線モジュールの電源を、+5Vにしていたが、+3.3Vでも動作範囲なので、
   MPUは、使い慣れている、PIC24FJ64GA002を使うことにした。(実験は、何時ものトレーニング基板使用)

  ・データビットの論理判定を行うためには、パルス幅測定のための、基準(サンプル)パルスが必要。
   Timer1のインターバル・タイマ割込みを使うとして、タイマ周期は、100uSとした。
   外部水晶発振子を、10MHzとすれば、システム周波数:Fcy=5Mzなので、プリスケーラ:PS<1:0>=0b00(1/1)、
   分周レジスタ:PR1=499(n=500)にすれば良いはず。
   この設定で正しいか、LEDのトグル動作をさせて確認してみた。カウンタで測れば、5kHzになれば正解。
   以下の通リ問題なかった。(トレーニング基板で、外部X'talでも実験出来るように、改造を施しました。)

  


■ 2019.4.8〜 2019.4.9
 
 ・次のステップとして、赤外線受信したシリアルデータの内容を、液晶に表示してみる。
   <動作仕様>
    @ Sonyコードに限定する。
    A フォーマットは、12bitデータ(7bit+アドレス:5bit)に限定する。
    B Aを、液晶上段に上位バイト・下段に下位バイトとしてhex表示する。
    C audio-technicaのTVリモコン:ATV-515を、Sonyコード出力に設定して使用し、
       音量+ボタンを押した時、基板上の、緑LEDが点灯し、 音量‐ボタンを押した時、消灯する。

   <参考にした記事>
    ・トラ技 2012年6月号 PIC特集記事から、第5章:パソコンとつなげるアダプタの開発に最適/
     「赤外線リモコン受信処理」の記事を参考にした。
      <記事の概要>
       ・PIC18F14K50使用
       ・T=100uの、タイマ割込み使用
       ・3社(NEC・Sony・家電協)のコードを自動認識
       ・USBの仮想シリアルインターフェースを介して、PCモニター上に、受信パルス幅・データコード等を表示する。


■ 2019.4.18
 
 ・「PIC24F_IR_TEST」プロジェクト
   PIC24F_IR_TEST.c 作成開始。
   記事の内容を大筋把握した。
   何とか書けそうな感触なので書き始めてみる。


■ 2019.4.19
 
 ・書上げて、コンパイル〜HEX準備まで、OKになる。
   デバッグ開始。
   まずは駄目。
   初期メッセージ表示OKだが、
リモコン受信せず。(受信コード表示せず。)
    <調査>
     @ 赤外線モジュールの供給電源= 3.24V
        OUTpinを、ロジアナで見るが、出力出ず。
     A OUTpinにプルアップ必要か?
        RB5ポートの内部プルアップを有効にしてみたが、駄目。
     B 赤外線モジュール単体でチェック。
        Vccを、電池=3.3V供給にて、出力チェック
        一応出るが、電源供給ラインに、パスコン等ノイズ対策がされてないと、リモコン送信しない待機状態でも
        自然光の中のノイズ成分? に反応してしまうような感じ。

        ※ 電源ラインのノイズ対策は必要なようなので、
2019.3.30〜 2019.4.1に実施した、Vcc=5Vの時と同じ
       フィルタ回路+パスコン+プルアップ構成にしてみたら、出力が正常に出る様になった。
       供給元Vcc= 3.28V→ フィルタ後Vcc= 3.23V


■ 2019.4.20
 
 ・デバッグ続行
   @ T1割込み周期 100u確認→ カウンタで確認 OK(5kHz)
   A しかし受光してもデータ表示しない。
   B どこまで、RUNしているか?
      2byte受信終了のところで、ブレイク→ ここまでは、RUNしてない。
      最初の、1byte受信終了のところでブレイク→ ここまでは、RUNしていた。
   C ここで、最初の、1byteのみデータ表示させてみたが、もくろみと異なりNG
      上位バイトは、電源ONボタンの場合、0xA9なはずが、0x95になる?
      ちなみに他のキーを押すと、それなりに異なるデータ表示にはなっている。
      sprintf文を使って、HEX表示しているが、その書式が正しいか固定データ(ird_data[0]= 0xA9)として
      実行してみた。
      → 正しく"a9"と表示した。

   ※ 感覚的に気になることがある。
      シリアルデータを読む時、MSBファーストとして読むか、LSBファースとして読むかで、全く違う読取りコードになってしまう。
      何かそんな気がする。


■ 2019.4.21
 
 ・現在参考にしている記事は前記した通リ、トラ技 2012年6月号の記事だが、これのソースコードを見ると
   データマスクの初期化は、'0'で、1bit読取り後の、データマスクのシフトは、左に1ビットになっている。
   つまり、LSBファースとして読んでいるようである。
   実は、これの前に参考にした、トラ技 2011年10月号 eagle cad特集ーstep4:
ディジタル・オーディオ・ステーションの製作ー
   「赤外線リモコンの解読」の記事に、受信分析したシリアル波形が載っており、MSBファーストで読込んでいることが明記
   されていた。


   このつもりでいたので?ということになった。
   うまり、
データマスクの初期化を、'0x80'、データマスクのシフトは、右に1ビットに修正すれば良いはず。


■ 2019.4.22
 
 ・一応、LSBファーストから、MSBファースト読込みに修正して、もくろみのコードが正しく受信出来た。


■ 2019.4.23
 
 ・大方OKだが、HEX表示にやや不満あり。
   sprinf文を使っているので、まずアルファベットが小文字になるのと一桁の場合、ゼロサプレスされない。
   これは、簡易的な、HEXキャラクタ・デコード・テーブル参照方式のHEX表示関数に修正した。
   また、HEXなので、頭に、"0x"を表示するようにし、":"は、"="に変更した。

  ・Sonyコードしか確認してないが、TVのリモコンコマンドの場合は、何のキーが押されたかは、上位バイトを
   チェックすればokということが解った。(下位バイトは常に、0x00)

  ・今回は対象外にしたデータ長が、20bit:表示bit=3byte(20bit= 7bit+13bitアドレス)のコマンド例のシリアル波形を
   もう少し取得してみた。
   TVでなく、SonyDVD Playerのリモコン:RMT-D152Jの例
   どうも、アドレス・ビットは、対象機種の判別のためにあるようだ。

  ・これで当面の目標だった受信コード表示は、OKになった。
   次に、トレーニング基板のLED ON/OFFを、リモコンで制御することを考える。
   本来なら、電源ONボタンの、トグル動作で、ON/OFFしたいところだが、リモコンのキーは、押している間
   同じコードを繰返し送信して来るので、単純に、100uS割込みの中で、キーセンス後、トグル動作させると、
   繰返し間隔で、ON/OFFを繰返してしまう。
   適当なタイマを入れるなどしてトグルタイミングを取るなどの工夫が必要。
   面倒なので今回は、簡易的に、「音量+」キーをON、「音量−」キーをOFFに割付けた。
   動作確認は問題無し。
   尚、動作模様は、このページトップの写真を、参照してください。
   まずは、ここまでをアップすることにした。


---<ここから、追試:「リモコンでACラインON/OFF実験〜使える形に、まとめる」の記事>-------------------------------------

■ 2019.4.24
  ・PICポートを使って、ACをON/OFFするハードを追加し、最終的に、ACテーブルタップをコントロール
   出来るようにする。
   リレー回路は、たいしたことないが、aitendoから便利な、モジュール:
K-M1CH-N
   
が基板+部品付で安価に売られていたので、それを利用することにした。
   リレーは、DC5Vの物:SDR-05V DC-SL-Cを選んだ。
   接点容量:10A 125VACで、パターンも十分太くなっていたので、ACをON/OFFしても問題ない。
   コントロール系のトランジスタ回路は、5V動作なので、PICの、ポート出力は、O.D(オープン・ドレイン)
   に設定し、10kで+5Vにプルアップすることにした。(モジュールの裏側に追加)
   実験基板(トレーニング基板)にモジュールをセットし、接点出力をテスターのΩ計で動作確認したところ
   問題無く動いた。


■ 2019.4.30
  ・本番の基板は、このままこのモジュールを使うこととし、ユニバーサルで製作することにした。
   部品を秋月に手配した。
   GW中なので発送が遅れるかも・・・


■ 2019.5.7
  ・予感は当たった。
   GW空けなのに、未だ、秋月通販センターのステータスが、発送準備から変化無し。
   秋月通販センターに電話確認した。
   GW中、銀行の入金業務がストップしていたとのこと。
   早くて本日発送という話だった。


■ 2019.5.8
  ・ようやく秋月より、パーツ到着


■ 2019.5.11
  ・実装上がり

  ・動作チェック開始
   @ 電源ショートチェック→ OK
   A PIC実装・液晶未実装
      +5V→ +5.22V
      +3.3V→ +3.30V
      この状態で、HEX書込みOK

   B 液晶実装して、電源電圧測定→ Aと変わらずで、OK
      しかし動作は駄目。
      液晶表示NG・リレーが動かない。 
      これは、配線ミスが原因だった。
      液晶のデータビット:D4⇔D5がテレコだった。修正で、OKになる。


■ 2019.5.13
  ・パワーアンプの、ACプラグ⇔接点間の配線等、設置を行い、動作確認。
   まあ、上手く行く。
   ただ、BAT駆動時の持ちが気掛かり。
   省エネが今後の課題。

  ・ここで、不具合発覚。
   初回、P_ON直後の、[音量+]キーONで、リレーONにならない症状が、2回起きた。
   再度、P_ONして、OKになるが?


■ 2019.5.14
  ・症状の詳細を再確認してみた。
    @ TVモニターを、P_ONしておいて、本機P_ONでは、OK
    A TVモニターを、P_OFFしておいて、本機P_ONでは、OKだが、この状態で、TVモニター、P_ONして
       リモコン操作すると、NG(反応しなくなる。)
    B Aの状態で、本機の、リセットSWを、ONすれば復帰する。
   このような状況から、TV液晶モニターの、バックライト・インバータ・ノイズの影響かと思ったりしたが・・・


■ 2019.5.16
  ・NG時、どこかの受信処理でループしているような気がする。
   T1割込み周期と、処理時間の関係を、オシロで確認してみた。
   ird_resv関数の前後に、空ポートon/offを追加して、その波形を観測してみた。
   割込み周期は、100uSで、OK。
   処理時間は、OK時は、処理内容によって、約10uS〜60uSの間で変動していた。
   ところが、NG時は、60uSに固定される。



   やはり、どこかの受信リトライ処理で、ループしているようである。

  ・原因が、特定出来た。
   今迄、TVモニターからのノイズと思っていたが、そうでは無かった。
   一旦、リモコンで、OKなところ、TVモニターの電源を手でONし、次にリモコン操作した時の動作は、OK
   だが、TVモニター(これは、ソニーでなく三菱製)を、三菱の付属リモコンで、P_ONした時、それを受信して
   しまうので、ソニー・コードしか対応してないシーケンスのところ、他社コードを受信した場合の、イリーガル
   処理を入れて無い為と判明した。


■ 2019.5.17
  ・ソニーとの違いを知りたく、三菱の付属リモコンの、受信波形(電源onボタンon時)を取得してみた。
   TVモニター:Mitubishi VISEOの、付属リモコン:RU-DM105

   上波形から判ること、
    @ ソニーに比べ、ガイドパルスのLow幅が長い。→ 約8mS
    A フレーム長も長い。→ 約60mS
    B データビットの論理基準が異なるように見える。
       ソニーの場合:パルス幅=0.6mSベースで、Lowパルスの幅で、論理判断
       三菱の場合:パルス幅=0.4mSベースで、Hiパルスの幅で、論理判断
    C データは、セパレータ・パルスの後に、1バイト+1ストップ・ビットを、2回(2byte)送っているように見える。


■ 2019.5.18
  ・他社コードを受信した場合の、イリーガル処理を追加して、OKになる。
  ・設置の模様は、本ページ冒頭の写真を参照してください。


<回路図>
 ・こちらからどうぞ
 PIC24_赤外線リモコン実験回路」
              「IR受信コード表示・AC制御基板回路」 : 使える形にまとめた回路 190521

<最終ソース・ヘッダファイル>
 ・こちらから、どうぞ
    /// メインソース
     PIC24F_IR_REC_TEST.c
             PIC24F_IR_REC_TEST_2.c   190521更新

     /// 液晶ライブラリ
     LCD_Lib3.c
     LCD_Lib3.h


← 実験テーマ1に戻る   TOP PAGEに戻る   実験テーマ116へ →