#freeze
閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)

*TVリモコン信号の受信機 [#q05d231d]

赤外線受信素子が安価(@150円)で販売されている。この素子を用いてTVリモコンの
信号の受信機を試作してみたので紹介します。
リモコンのチャンネルボタンを押している間だけLEDが点灯、ボタンをはなすとLED消灯
07/02/17

赤外線受信素子:SPS-450-1 (SANYO社製) @150円
http://akizukidenshi.com/catalog/items2.php?q=%A3%D3%A3%D0%A3%D3&s=score&p=1&r=1&page=#I-00572

TVリモコンは手持ちの物を利用
マルチTVリモコン:ATV-516 (audio-technica社製)
http://www.audio-technica.co.jp/products/remocon/atv-516.html
信号フォーマットは「NECフォーマット」を使用

【参考情報】
NECフォーマット
http://www.necel.com/ja/faq/mi_com/__com_remo.html#0101

受信ロジック
http://nis-ei.eng.hokudai.ac.jp/~aoki/laboratory03.html
の「7.実験6:リモコンによるフルカラーLEDの制御」の項

|&attachref(P1010299.JPG,zoom,150x150,button){新しい写真添付};|&attachref(P1010298.JPG,zoom,150x150,button){新しい写真添付};|&attachref(cdHxxR1C.JPG,zoom,150x150,button){新しい写真添付};|


 /**
 * TVリモコン信号(赤外線)受信器
 * (ボタンと押している間だけLED点灯、ボタンをはなすとLED消灯) 
 *
 * PIC16F628A   内蔵4MHz
 * RB0: 赤外線受信器 SPS-450-1(SANYO社製)
 * LED: RB2, RB3, RB4, RB5 
 * 電源:乾電池3本(4.5V)
 *
 * Device Flags: _BODEN_OFF _BOREN_OFF _CP_OFF _PWRTE_ON _WDT_OFF
 *        _LVP_OFF _MCLRE_OFF _INTRC_OSC_NOCLKOUT
 * MikroC 6.2.1
 */
 unsigned short int flag = 0;
 unsigned short int custom_a = 0;
 unsigned short int custom_b = 0;
 unsigned short int data_a = 0;
 unsigned short int data_b = 0;
 unsigned short int old_F2 = 0;
 unsigned short int old_F3 = 0;
 unsigned short int old_F4 = 0;
 unsigned short int old_F5 = 0;
 
 void interrupt() { //割込み関数
     unsigned short int i, b;
     
     if(INTCON.INTF) { //割込み種がRB0/INT割込みの場合
         INTCON.INTE = 0; //RB0/INT割込みの禁止
 
         //リーダ部の確認
         TMR0 = 0; //timer0リセット
         while(PORTB.F0 == 0);
         if(TMR0 < 120) { // < 141 (=9.0ms * 4MHz/4 /64)
             flag = 1;
             return;
         }
         TMR0 = 0; //timer0リセット
         while(PORTB.F0 == 1);
         if(TMR0 < 27) { // < 35 (=2.250ms * 4MHz/4 /64)
             flag = 1;
             return;
         }else if(TMR0 < 60) { // < 71 (=4.5ms * 4MHz/4 /64)
             //リピートリーダを受信した時 
             PORTB.F2 = old_F2;
             PORTB.F3 = old_F3;
             PORTB.F4 = old_F4;
             PORTB.F5 = old_F5;
             Delay_ms(96);
             flag = 1;
             return;
         }
         
         //custom codeの取得
         custom_a = 0;
         for (i = 0; i < 8; i++) {
             TMR0 = 0; //timer0リセット
             while(PORTB.F0 == 0);
             while(PORTB.F0 == 1);
             if(TMR0 < 27) // < 18 (=1.125ms * 4MHz/4 /64)
                 b = 0;
             else          // < 35 (=2.250ms * 4MHz/4 /64)
                 b = 1;
             custom_a |= (b << i);
         }
         custom_b = 0;
         for (i = 0; i < 8; i++) {
             TMR0 = 0; //timer0リセット
             while(PORTB.F0 == 0);
             while(PORTB.F0 == 1);
             if(TMR0 < 27) // < 18 (=1.125ms * 4MHz/4 /64)
                 b = 0;
             else          // < 35 (=2.250ms * 4MHz/4 /64)
                 b = 1;
             custom_b |= (b << i);
         }
         
         //data codeの取得
         data_a = 0;
         for (i = 0; i < 8; i++) {
             TMR0 = 0; //timer0リセット
             while(PORTB.F0 == 0);
             while(PORTB.F0 == 1);
             if(TMR0 < 27) // < 18 (=1.125ms * 4MHz/4 /64)
                 b = 0;
             else          // < 35 (=2.250ms * 4MHz/4 /64)
                 b = 1;
             data_a |= (b << i);
         }
         data_b = 0;
         for (i = 0; i < 8; i++) {
             TMR0 = 0; //timer0リセット
             while(PORTB.F0 == 0);
             while(PORTB.F0 == 1);
             if(TMR0 < 27) // < 18 (=1.125ms * 4MHz/4 /64)
                 b = 0;
             else          // < 35 (=2.250ms * 4MHz/4 /64)
                 b = 1;
             data_b |= (b << i);
         }
         //while(PORTB.F0 == 0); //ストップビット受信 
         
         if (data_a == ~data_b) { //data誤りのチェックOKの場合
             switch (data_a) {
                 case 0x11:  //2チャンネルボタン
                     PORTB.F2 = 1;
                     PORTB.F3 = 0;
                     PORTB.F4 = 0;
                     PORTB.F5 = 0;
                     break;
                     
                 case 0x13:  //4チャンネルボタン
                     PORTB.F2 = 0;
                     PORTB.F3 = 1;
                     PORTB.F4 = 0;
                     PORTB.F5 = 0;
                     break;
 
                 case 0x15:  //6チャンネルボタン
                     PORTB.F2 = 0;
                     PORTB.F3 = 0;
                     PORTB.F4 = 1;
                     PORTB.F5 = 0;
                     break;
 
                 case 0x17:  //8チャンネルボタン
                     PORTB.F2 = 0;
                     PORTB.F3 = 0;
                     PORTB.F4 = 0;
                     PORTB.F5 = 1;
                     break;
 
                 default:
                     PORTB.F2 = 0;
                     PORTB.F3 = 0;
                     PORTB.F4 = 0;
                     PORTB.F5 = 0;
                     break;
             }
             old_F2 = PORTB.F2;
             old_F3 = PORTB.F3;
             old_F4 = PORTB.F4;
             old_F5 = PORTB.F5;         
         }
     }
     Delay_ms(40);
     flag = 1;
 }
 
 void main() {
     //使用変数の定義
     unsigned short int i;
 
     PORTB = 0b00000000; //PORTBの中身をきれいにする
     TRISB = 0b00000001; //RB0を1:入力、他は0:出力に設定
 
     //PIC稼働確認(LED点滅)
     for (i=0; i < 5; i++) {
         PORTB = 0b11111110;
         Delay_ms(50);
         PORTB = 0b00000000;;
         Delay_ms(50);
     }
 
     //RB0/INT立下りエッジ割込み
     //timer0プリスケーラ64回に設定
     OPTION_REG = 0b10000101;
 
     INTCON.INTE = 1; //RB0/INT割込みの許可
     INTCON.GIE = 1; //全体割込み許可
 
     do {
         if(flag == 1) {
             flag = 0;
             PORTB.F2 = 0;
             PORTB.F3 = 0;
             PORTB.F4 = 0;
             PORTB.F5 = 0;
             INTCON.INTE = 1; //RB0/INT割込みの許可
         }
     }while(1);
 }
~
~
★この情報は役に立ちましたか?
#vote(はい[21],普通[4],いいえ[6])

#comment_nospam