赤外線リモコン(家電方式)

  1. 赤外線通信

    1. 赤外線通信

       赤外線(Infra Red)は、可視光より波長が長い光(電磁波)です。日光や照明器具の出す赤外線は可視光に比較すれば弱いので、近距離の通信手段として利用できます。
       無線と比較して、到達範囲が限定されるため他の機器に影響することが少ない利点があります。


        図は 鈴木著 PIC&C言語でつくる赤外線リモコン より

    2. 赤外線デバイス

       LEDの仲間に赤外線を発光する素子があります。多くは900nm程度の近赤外線を発行します。
      赤外線を受けて電気信号に変換する受光素子も各種あります。赤外線を利用したリモコンは 38KHz で変調した赤外光を利用しますから、38KHzのフィルタ機能を有する素子(モジュール)を利用すると便利です。
       38KHz変調の意味は、下図のように赤外LEDの発光を38KHzでオン・オフすることです。この38KHzの断続があり期間を情報1、無い区間を情報0とします。変調をする目的は、他の赤外光との区別です。



       受光モジュールは、38Khzで断続した赤外光があるとき0を出力し、それ以外では1を出力します。38KHzの成分のみを取り出すことで、他の自然光と区別が可能で、他の光による「雑音」と区別できます。

    3. 家電用リモコンフォーマット

       TVやエアコンなどに利用されているリモコンには赤外線が利用されています。ここでは多くの場合、38KHzの断続光が0.6m秒継続したとき 1 とし、0.6m〜1m 秒の無信号(光なし)を 0 とします。

  2. 設計


    1. 機能

       ここでは、鈴木著 「PIC&C言語でつくる赤外線リモコン」 の1章のモデルを例に、紹介します。3個のタクトスイッチで、受光側の二つのLEDを点滅します。
       ここでの目的は赤外線を利用した基礎実験です。

    2. 赤外LED

       赤外LEDは各種販売されています。瞬間的には 1A 程度流すことができます。使用法は通常の可視光LEDと同じです。

    3. 受光素子

      受光素子は 赤外光を電気信号に変換するフォトダイオード、入力を増幅するアンプ、38KHzの信号を通過させる帯域フィルタ、変調信号をDCレベルに変換する復調回路から構成されます。


      図は 後閑著「8bitマイコンでつくる電子回路」から引用させていただきました。

       モジュール(PL-IRM0208-A358)の外観を下図に示します。仕様書はこちらです。
       図は、「秋月電子」のHPより

      端子は、左から 出力、GND、電源(5V)になります。電源電圧は、4.5Vから5.5Vで、出力電流は5mA、消費電力は 50mW です。

    4. 送信フォーマット

       最初にスタートビット1 を送ります。次に、デバイスアドレスを2ビット、スイッチ情報2ビットを送り、最後に チェックデータとして、10101 を送ります。デバイスアドレスは受信装置を区別するための情報です。
       受信する方では、先頭に1 (断続波)を受信後 0.3秒待ち、信号が継続していることを確認します。以後、0.6秒間隔で、ビットを受信します。最後のチェックビット 10101 を受信できない場合、他の信号と考え、受信データは無視します。

    5. 利用可能距離

       送信部を電池とし、赤外LEDの電流を50mA程度とした場合、到達距離は1m弱でした。赤外LEDの抵抗を減らしたり、同時に制御する端子数を増やせば、もう少し距離を増やせると思います。

  3. 送信回路とプログラム


    1. 送信回路

      原著(PIC&C言語でつくる赤外線リモコン)では、9V電池を5Vに変換して電源としていますが、ここでは1.5Vの電池2本で16F88を駆動します。16F88は4MHzの内臓クロックがありますが、10μ秒のパルスを生成するには無理があるので、20MHzの発振子を利用します。赤外LEDは50mA程度を流します。A1,A0 から抵抗120オームで並列に流します。A3には確認用に通常のLEDを接続します。sw のプルアップは、PICのプルアップ抵抗を利用します。
       図では省略していますが、プログラムではB4 に動作確認用のLEDを利用しています。


      写真右上のLED(大きい方)が赤外LEDです。


    2. 送信プログラム

      3.2Vの駆動になるため、
           #fuses NOBROWNOUT
      で、停電圧リセット機能を無効にします。、また、実行をモニタするため、RB4 にLEDを接続し、ループを回るごとに点滅させます。output_toggle(PIN_B4) は、実行の度に0,1 を反転します。
      他の部分は変更ありません。
       情報1を出力する 38KHz の変調信号は、26μ秒の周期になります。そこで、点燈後12μ秒後に消燈し11μ秒待つことで、26μ秒のパルスを出すことができます。、
          port_a=0; //赤外LED1を点灯
          delay_us(12);//12μSタイマ
          port_a = 0x07; //赤外LEDを消灯
          delay_us(11);
      これを、23回繰り返すことで 0.6m秒の断続波形を生成できます。これを組み込んだ関数が、p1() です。

      //
      #include <16f88.h>
      
      #fuses HS,NOWDT,PUT,NOLVP,NOPROTECT,NOBROWNOUT
      #use delay(clock=20000000)
      #use fast_io(a)
      #use fast_io(b)
      
      #byte port_a=5
      
      //赤外リモコン送信
      //スタート*1、デバイスコード*2、操作コード*2、チェック*5
      //RB0,RB1,Rb2の3個のスイッチの値を2bitで送信
      //1bit:600μ秒、1を48KHz変調
      
      void p1();//1を送信
      void p0();//0を送信
      
      void main()
      {
        int a;
        
        port_b_pullups(true);//PORTBの内蔵プルアップ抵抗
        set_tris_a(0x38);//PORTA下位3ビット出力に設定
        set_tris_b(0x07); //PORTBのRB2〜RBOは入力ビットに設定
        
      while(1){
              
        a=10;
        output_toggle(PIN_B4);//check
        
        switch(a){          
        case 10:
         if(input(PIN_B2)==0){
      
          p1();//スタートビット
          
          p0();p1();//デバイスコード
          p0();p1();  //スイッチコード(電球Ll点灯、L2消灯)
          
          p1();p0(); p1();p0();p1();//ストップビット
          
          delay_ms(20);//…20msの送信停止時間
          a=20;
          break;
          
          }
          
      case 20:
      
        if(input(PIN_B1)==0){ //PBS1 0Nなら次へ行きます
        p1();
        p0();p1();  
        p1();p0();//スイッチコード(電球L2点灯、Ll消灯)  
        
        p1();p0(); p1();p0();p1();
        
        delay_ms(20);
        a=30;
        port_a = 0x07; //赤外LEDを消灯
        
        break;
        }
      
        case 30://
        if(input(PIN_B0)==0){// PBS0 0Nなら次へ行きます
      
        p1();
        p0();p1();
        p1();p1();//スイッチコード(電球L2点灯、Ll消灯)
        p1();p0(); p1();p0();p1();
        delay_ms(20);
      
        a=10;
        break;
        
        }
      
        }//case  
        }//while
      }
      
      void p1()
      {
        int c;
        
        for(c=0;c<23;c++){
          //1周期26μS
          port_a=0; //赤外LED1を点灯
          delay_us(12);//12μSタイマ
          port_a = 0x07; //赤外LEDを消灯
          delay_us(11);
        }
      }
      
      void p0()
      {
        port_a = 0x07;// 赤外LEDを消灯
        delay_us(600);// 600タイマ
      }

  4. 受信回路とプログラム


    1. 受信回路

      受光モジュール(PL-IRM0208-A358)は、4.5Vが必要なため電池駆動は出来ず、5Vの電源が必要です。
      A1,A2 に接続したLED が送信回路のSWのオンオフで点滅します。
      B0,B1、B2、に接続したLEDは動作確認用です。


       写真左下が赤外受信モジュールです。


    2. 受信プログラム


      #include<16f88.h>
      
      #fuses HS,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT
      #use delay(clock=20000000)
      #use fast_io(a)
      #use fast_io(b)
      
      //赤外線リモコン信号受信
      //赤外受信素子が4.5V必要なので、単4*2の電源では実行不可
      //スタート*1、デバイスコード*2、操作コード*2、チェック*5
      //受信中の処理は最小限にすること
      //1bit:600μ秒
      
      void main()
      {
         int a,a2,a1;
         set_tris_a(0x01);
         set_tris_b(0xf8);
         //port_b_pullups(true);
         output_a(7);
         output_b(7);
         
         while(1){
         
            output_toggle(PIN_B0);//動作チェック用
            
            while(1){
               
               a=0;a1=0;a2=0;
               output_high(PIN_B1);
               output_high(PIN_B2);
               
               if(input(PIN_A0)==0){//スタート検出
                 //output_low(PIN_B1);
                 delay_us(300);
      
               }
               else break;
               
               if(input(PIN_A0)==0){//確認
                 //output_low(PIN_B2);
                 delay_us(600);
                }
               else break;
               
               if(input(PIN_A0)==1){//デバイスコード1
                 delay_us(600);
                 //output_low(PIN_B1);
               }
               else break;         
               
               if(input(PIN_A0)==0)//デバイスコード2
                 delay_us(600);
               else break;         
               
      
               if(input(PIN_A0)==0){//スイッチコード1
                 //output_low(PIN_B2);           
                 a2 = 2;
               }
               delay_us(600);
               
               if(input(PIN_A0)==0){ //スイッチコード2
                 a1 = 1;           
               }
               delay_us(600);
               
               if(input(PIN_A0)==0){//ストップコード確認1
                delay_us(600);
                //output_low(PIN_B1);
               }   
               else break;
               
               if(input(PIN_A0)==1){//ストップコード確認2
                delay_us(600);
                output_low(PIN_B1);
               }   
               else break;
               
               if(input(PIN_A0)==0){//ストップコード確認3
                delay_us(600);
                output_low(PIN_B2);
               }   
               else break;
               
               if(input(PIN_A0)==1){//ストップコード確認4
                delay_us(600);
                //output_low(PIN_B2);
               }   
               else break;
               
                if(input(PIN_A0)==0)//ストップコード確認5
                a=a2 + a1;
                //output_low(PIN_B2);   
               else break;
               
               a=a1+a2;
             //受信修了、実行
                switch(a){
                 
               case 1:
                 output_low(PIN_A1);
                 delay_ms(500);
                 break;
                
               case 2:
                 output_low(PIN_A2);
                 delay_ms(500);
                 break;   
               
               case 3:
                 output_high(PIN_A1);
                 output_high(PIN_A2);
                      delay_ms(500);
                 break;
                 
               default:
                 break;
                 
               }//switch(a)
            }
            
         }
         
      }

  5. 発展


    1. 到達距離

       赤外LEDへの電流を500mA程度まで増やせば、数m程度は制御可能です。この場合、トランジスタを利用する必要があります。

    2. タイマー利用

       タイマーを利用して0.6m秒を測れば、待ち時間の間に処理をすることが可能です。また、割り込みを利用すれば、赤外信号がこない時間帯は sleep することができます。後閑著「8bitマイコンでつくる電子回路」 を参考にしてください。

    3. PWM機能

       16F88 にはPWM機能があります。これを利用すれば、38KHzの変調をハードウエアで正確に行うことができます。後閑著「8bitマイコンでつくる電子回路」 を参考にしてください。

    4. 文字送信

       RS232Cと組み合わせれば、無線文字通信も可能かと思います。