(SKU:RB-03T002)紅外發(fā)射接收套件
目錄 |
概況
Arduino 紅外無(wú)線遙控套件由Mini超薄紅外遙控器和38KHz紅外接收模塊組成,Mini超薄紅外遙控器具有20個(gè)功能鍵,發(fā)射距離最遠(yuǎn)可達(dá)8米,非常適合在室內(nèi)操控各種設(shè)備。紅外接收模塊可接收標(biāo)準(zhǔn)38KHz調(diào)制的遙控器信號(hào),通過(guò)對(duì)Arduino進(jìn)行編程,即可實(shí)現(xiàn)對(duì)遙控器信號(hào)的解碼操作,從而可制作各種遙控機(jī)器人以及互動(dòng)作品。
規(guī)格參數(shù)
- CR2025環(huán)保紐扣電池,容量160mah
- 發(fā)射距離:8m以上(具體和周圍環(huán)境、接收端的靈敏度等因素有關(guān))
- 有效角度:60度
- 面貼材料:0.125mmPET,有效壽命2萬(wàn)次。
- 品質(zhì)穩(wěn)定,性價(jià)比高
- 靜態(tài)電流3-5uA,動(dòng)態(tài)電流3-5mA。
使用方法
- 什么是紅外接收頭?
紅外遙控器發(fā)出的信號(hào)是一連串的二進(jìn)制脈沖碼 為了使其在無(wú)線傳輸過(guò)程中免受其他紅外信號(hào)的干擾,通常都是先將其調(diào)制在特定的載波頻率上,然后再經(jīng)紅外發(fā)射二極管發(fā)射出去,而紅外線接收裝置則要濾除其他雜波,只接收該特定頻率的信號(hào)并將其還原成二進(jìn)制脈沖碼,也就是解調(diào).
- 工作原理
內(nèi)置接收管將紅外發(fā)射管發(fā)射出來(lái)的光信號(hào)轉(zhuǎn)換為微弱的電信號(hào),此信號(hào)經(jīng)由IC內(nèi)部放大器進(jìn)行放大,然后通過(guò)自動(dòng)增益控制、帶通濾波、解調(diào)變、波形整形后還原為遙控器發(fā)射出的原始編碼,經(jīng)由接收頭的信號(hào)輸出腳輸入到電器上的編碼識(shí)別電路。
- 紅外接收頭的引腳與連線
D為數(shù)據(jù)輸出 GND為電源地 VCC為電源正
紅外遙 控接收 傳感 器的測(cè)試
我們使用 Arduino 控制器來(lái)做個(gè)測(cè)試,要用到硬件設(shè)備如下:
- Arduino 控制器×1
- Arduino LCD1602 字符液晶擴(kuò)展板×1
- 紅外遙控接收傳感器模塊×1
- 蜂鳴器發(fā)聲模塊×1
- 超薄紅外遙控器×1
- 通用 3P 傳感器連接線×2
- USB 數(shù)據(jù)通信線×1
紅外遙控實(shí)驗(yàn)
- 實(shí)驗(yàn)器件 紅外遙控器 1個(gè) IR Receiver Module 1個(gè) 數(shù)字傳感器連接線 1根
- 實(shí)驗(yàn)原理 要想對(duì)某一遙控器進(jìn)行解碼必須要了解該遙控器的編碼方式,這就叫知己知彼,百戰(zhàn)不殆 。本產(chǎn)品使用的遙控器的編碼方式為:NEC協(xié)議。下面就介紹一下NEC協(xié)議:
?NEC協(xié)議介紹:
特點(diǎn):
(1)8位地址位,8位命令位
(2)為了可靠性地址位和命令位被傳輸兩次
(3)脈沖位置調(diào)制
(4)載波頻率38khz
(5)每一位的時(shí)間為1.125ms或2.25ms
?邏輯0和1的定義如下圖:
協(xié)議如下:
?按鍵按下立刻松開(kāi)的發(fā)射脈沖:
上面的圖片顯示了NEC的協(xié)議典型的脈沖序列。注意:這是首先發(fā)送LSB(最低位)的協(xié)議。在上面的脈沖傳輸?shù)牡刂窞?x59命令為0x16。一個(gè)消息是由一個(gè)9ms的高電平開(kāi)始,隨后有一個(gè)4.5ms的低電平, (這兩段電平組成引導(dǎo)碼)然后由地址碼和命令碼。地址和命令傳輸兩次。第二次所有位都取反,可用于對(duì)所收到的消息中的確認(rèn)使用。總傳輸時(shí)間是恒定的,因?yàn)槊恳稽c(diǎn)與它取反長(zhǎng)度重復(fù)。如果你不感興趣, 你可以忽略這個(gè)可靠性取反,也可以擴(kuò)大地址和命令,以每16位!
?按鍵按下一段時(shí)間才松開(kāi)的發(fā)射脈沖:
一個(gè)命令發(fā)送一次,即使在遙控器上的按鍵仍然按下。當(dāng)按鍵一直按下時(shí),第一個(gè)110ms的脈沖與上圖一樣,之后每110ms重復(fù)代碼傳輸一次。這個(gè)重復(fù)代碼是由一個(gè)9ms的高電平脈沖和一個(gè)2.25ms低電平和560μs的高電平組成。
?重復(fù)脈沖
注意:脈沖波形進(jìn)入一體化接收頭以后,因?yàn)橐惑w化接收頭里要進(jìn)行解碼、信號(hào)放大和整形,故要注意在沒(méi)有紅外信號(hào)時(shí),其輸出端為高電平,有信號(hào)時(shí)為低電平,故其輸出信號(hào)電平正好和發(fā)射端相反。接收端脈沖大家可以通過(guò)示波器看到,結(jié)合看到的波形理解程序。
?本實(shí)驗(yàn)編程思想
根據(jù)NEC編碼的特點(diǎn)和接收端的波形,本實(shí)驗(yàn)將接收端的波形分成四部分:引導(dǎo)碼(9ms和4.5ms的脈沖)、地址碼16位(包括8位的地址位和8位的地址的取反)、命令碼16位(包括8位命令位和8位命令位的取反)、重復(fù)碼(9ms、2.25ms、560us脈沖組成)。 利用定時(shí)器對(duì)接收到的波形的高電平段和低電平段進(jìn)行測(cè)量,根據(jù)測(cè)量到的時(shí)間來(lái)區(qū)分:邏輯“0”、邏輯“1”、引導(dǎo)脈沖、重復(fù)脈沖。引導(dǎo)碼和地址碼只要判斷是正確的脈沖即可,不用存儲(chǔ),但是命令碼必須存儲(chǔ),因?yàn)槊總€(gè)按鍵的命令碼都不同, 根據(jù)命令碼來(lái)執(zhí)行相應(yīng)的動(dòng)作。設(shè)置遙控器上的幾個(gè)按鍵VOL+:控制LED燈亮的;VOL-:作為控制蜂鳴器響;
實(shí)驗(yàn)代碼
程序功能:對(duì)遙控器發(fā)射出來(lái)的編碼脈沖進(jìn)行解碼,根據(jù)解碼結(jié)果執(zhí)行相應(yīng)的動(dòng)作。按下前進(jìn)鍵紅燈亮,松開(kāi)紅燈滅停止;按下后退鍵蜂鳴器響,松開(kāi)蜂鳴器停止響;這樣大家就可以用遙控器遙控你的器件了,讓它聽(tīng)你的指揮。其它按鍵的譯碼方式與這幾個(gè)鍵一樣,只要大家用示波器測(cè)出它們各自的波形,了解各自的命令碼,在執(zhí)行譯碼結(jié)果的函數(shù)中寫(xiě)上對(duì)應(yīng)的命令碼和要執(zhí)行的動(dòng)作即可。
#define BUZZER 10//蜂鳴器 #define LED_RED 11//紅燈 #define IR_IN 8 //紅外接收 int Pulse_Width=0;//存儲(chǔ)脈寬 int ir_code=0x00;//命令值 void timer1_init(void)//定時(shí)器初始化函數(shù) { TCCR1A = 0X00; TCCR1B = 0X05;//給定時(shí)器時(shí)鐘源 TCCR1C = 0X00; TCNT1 = 0X00; TIMSK1 = 0X00; //禁止定時(shí)器溢出中斷 } void remote_deal(void)//執(zhí)行譯碼結(jié)果函數(shù) { switch(ir_code) { case 0xff00://停止 digitalWrite(LED_RED,LOW);//紅燈不亮 digitalWrite(BUZZER,LOW);//蜂鳴器不響 break; case 0xfe01://VOL+ digitalWrite(LED_RED,HIGH);//紅燈亮 break; case 0xf609://VOL- digitalWrite(BUZZER,HIGH);//蜂鳴器響 break; } } char logic_value()//判斷邏輯值“0”和“1”子函數(shù) { while(!(digitalRead(8))); //低等待 Pulse_Width=TCNT1; TCNT1=0; if(Pulse_Width>=7&&Pulse_Width<=10)//低電平560us { while(digitalRead(8));//是高就等待 Pulse_Width=TCNT1; TCNT1=0; if(Pulse_Width>=7&&Pulse_Width<=10)//接著高電平560us return 0; else if(Pulse_Width>=25&&Pulse_Width<=27) //接著高電平1.7ms return 1; } return -1; } void pulse_deal()//接收地址碼和命令碼脈沖函數(shù) { int i; //執(zhí)行8個(gè)0 for(i=0; i<8; i++) { if(logic_value() != 0) //不是0 return; } //執(zhí)行6個(gè)1 for(i=0; i<6; i++) { if(logic_value()!= 1) //不是1 return; } //執(zhí)行1個(gè)0 if(logic_value()!= 0) //不是0 return; //執(zhí)行1個(gè)1 if(logic_value()!= 1) //不是1 return; //解析遙控器編碼中的command指令 ir_code=0x00;//清零 for(i=0; i<16;i++ ) { if(logic_value() == 1) { ir_code |=(1<<i); } } } void remote_decode(void)//譯碼函數(shù) { TCNT1=0X00; while(digitalRead(8))//是高就等待 { if(TCNT1>=1563) //當(dāng)高電平持續(xù)時(shí)間超過(guò)100ms,表明此時(shí)沒(méi)有按鍵按下 { ir_code = 0xff00; return; } } //如果高電平持續(xù)時(shí)間不超過(guò)100ms TCNT1=0X00; while(!(digitalRead(8))); //低等待 Pulse_Width=TCNT1; TCNT1=0; if(Pulse_Width>=140&&Pulse_Width<=141)//9ms { while(digitalRead(8));//是高就等待 Pulse_Width=TCNT1; TCNT1=0; if(Pulse_Width>=68&&Pulse_Width<=72)//4.5ms { pulse_deal(); return; } else if(Pulse_Width>=34&&Pulse_Width<=36)//2.25ms { while(!(digitalRead(8)));//低等待 Pulse_Width=TCNT1; TCNT1=0; if(Pulse_Width>=7&&Pulse_Width<=10)//560us { return; } } } void setup() { unsigned char i; pinMode(LED_RED,OUTPUT);//設(shè)置與紅燈連接的引腳為輸出模式 pinMode(BUZZER,OUTPUT);//設(shè)置與蜂鳴器連接的引腳為輸出模式 pinMode(IR_IN,INPUT);//設(shè)置紅外接收引腳為輸入 } void loop() { timer1_init();//定時(shí)器初始化 while(1) { remote_decode(); //譯碼 remote_deal(); //執(zhí)行譯碼結(jié)果 } }
遙控器鍵值附表
相關(guān)鏈接
購(gòu)買地址:紅外發(fā)射接收套件