閲覧総計:22886 (本日:2 昨日:2)
赤外線受信素子が安価(@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の制御」の項
/** * 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); }
★この情報は役に立ちましたか?