一、什么是紅外接收頭?
紅外遙控器發(fā)出的信號是一連串的二進制脈沖碼。為了使其在無線傳輸過程中免受其他紅外信號的干擾,通常都是先將其調制在特定的載波頻率上,然后再經紅外發(fā)射二極管發(fā)射出去,而紅外線接收裝置則要濾除其他雜波,叧接收該特定頻率的信號并將其還原成二進制脈沖碼,也就是解調。
二、工作原理
內置接收管將紅外發(fā)射管發(fā)射出來癿光信號轉換為微弱的電信號,此信號經由IC內部放大器進行放大,然后通過自動增益控制、帶通濾波、解調變、波形整形后還原為遙控器發(fā)射出的原始編碼,經由接收頭的信號輸出腳輸入到電器上的編碼識別電路。
三、紅外接收頭的引腳與連線
紅外接收頭有三個引腳,用的時候將VOUT接到模擬口,GND接到實驗板上的GND,VCC接到實驗板上的+5V。
四、紅外遙控實驗
1.實驗器件
紅外遙控器:1個
紅外接收頭:1個
LED燈:6個
220Ω電阻:6個
多彩面包線:若干
2.實驗連線
首先將板子連接好;接著將紅外接收頭按照上述方法接好,將VOUT接到數字11口引腳,將LED燈通過電阻接到數字引腳2,3,4,5,6,7。這樣就完成了電路部分的連接。
3.實驗原理
要想對某一遙控器進行解碼必須要了解該遙控器的編碼方式。本產品使用的遙控器的編碼方式為:NEC協(xié)議。下面就介紹一下NEC協(xié)議:
·NEC協(xié)議、特點:
(1)8位地址位,8位命令位
(2)為了可靠性地址位和命令位被傳輸兩次
(3)脈沖位置調制
(4)載波頻率38kHz
(5)每一位的時間為1.125ms或2.25ms
·邏輯 0和1的定義,按鍵按下立刻松開的發(fā)射脈沖:
顯示了NEC協(xié)議典型的脈沖序列。注意:這首先發(fā)送LSB(最低位)的協(xié)議。在上面的脈沖傳輸的地址為0x59,命令為0x16。一個消息是由一個9ms的高電平開始,隨后有一個4.5ms的低電平(返兩段電平組成引尋碼),然后有地址碼和命令碼。地址和命令傳輸兩次。第二次所有位都取反,可用于對所收到的消息確認使用。總傳輸時間是恒定的,因為每一點與它取反長度重復。如果你不感興趣,你可以忽略這個可靠性取反,也可以擴大地址和命令,以每16位按鍵按下一段時間才發(fā)射脈沖:
一個命令發(fā)送一次,即使在遙控器上的按鍵仍然按下。當按鍵一直按下時,第一個110ms的脈沖與一樣,之后每110ms重復代碼傳輸一次。這個重復代碼是由一個9ms的高電平脈沖和一個2.25ms低電平及560μs的高電平組成。
注意:脈沖波形進入一體化接收頭以后,因為一體化接收頭里要進行解碼、信號放大和整形,故要注意:在沒有紅外信號時,其輸出端為高電平,有信號時為低電平,故其輸出信號電平正好和發(fā)射端相反。接收端脈沖大家可以通過示波器看到,結合看到的波形理解程序。
程序代碼
#include <IRremote.h>
int RECV_PIN = 11;
int LED1 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;
int LED6 = 7;
long on1? = 0x00FFA25D;
long off1 = 0x00FFE01F;
long on2 = 0x00FF629D;
long off2 = 0x00FFA857;
long on3 = 0x00FFE21D;
long off3 = 0x00FF906F;
long on4 = 0x00FF22DD;
long off4 = 0x00FF6897;
long on5 = 0x00FF02FD;
long off5 = 0x00FF9867;
long on6 = 0x00FFC23D;
long off6 = 0x00FFB047;
IRrecv irrecv(RECV_PIN);
decode_results results;
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//? decode_results *results = (decode_results *)v
void dump(decode_results *results) {
int count = results->rawlen;
if (results->decode_type == UNKNOWN)
{
Serial.println(“Could not decode message”);
}
else
{
if (results->decode_type == NEC)
{
Serial.print("Decoded NEC:");
}
else if (results->decode_type == SONY)
{
Serial.print("Decoded SONY:");
}
else if (results->decode_type == RC5)
{
Serial.print("Decoded RC5:");
}
else if (results->decode_type == RC6)
{
Serial.print("Decoded RC6:");
}
Serial.print(results->value, HEX);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println("bits)");
}
Serial.print("Raw (");
Serial.print(count, DEC);
Serial.print("):");
for (int i = 0; i < count; i++)
{
if ((i % 2) == 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else
{
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println(" ");
}
void setup()
{
pinMode(RECV_PIN, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}
int on = 0;
unsigned long last = millis();
void loop()
{
if (irrecv.decode(&results))
{
// If it's been at least 1/4 second since the last
// IR received, toggle the relay
if (millis() - last > 250)
{
on = !on;
//? ? ? ?digitalWrite(8, on? HIGH : LOW);
digitalWrite(13, on? HIGH : LOW);
dump(&results);
}
if (results.value == on1 )
digitalWrite(LED1, HIGH);
if (results.value == off1 )
digitalWrite(LED1, LOW);
if (results.value == on2 )
digitalWrite(LED2, HIGH);
if (results.value == off2 )
digitalWrite(LED2, LOW);
if (results.value == on3 )
digitalWrite(LED3, HIGH);
if (results.value == off3 )
digitalWrite(LED3, LOW);
if (results.value == on4 )
digitalWrite(LED4, HIGH);
if (results.value == off4 )
digitalWrite(LED4, LOW);
if (results.value == on5 )
digitalWrite(LED5, HIGH);
if (results.value == off5 )
digitalWrite(LED5, LOW);
if (results.value == on6 )
digitalWrite(LED6, HIGH);
if (results.value == off6 )
digitalWrite(LED6, LOW);
last = millis();
irrecv.resume(); // Receive the next value
}
}
五、程序功能
對遙控器發(fā)射出來的編碼脈沖進行解碼,根據解碼結果執(zhí)行相應的動作。這樣大家就可以用遙控器遙控你的器件了,讓它聽你的指揮。
注意:把 IRremote 文件夾放到 編譯器安裝目錄下的\Arduino\libraries里,不然編譯不過。例如我的:C:\Program Files\Arduino\libraries。