Infra érzékelés


Az IR érzékelő egy kis mikrocsip egy fotocellával egybeépítve, ami az infravörös fény érzékelésére van behangolva. Az IR fény az emberi szem számára láthatatlan, ezért is használják előszeretettel különböző eszközök távirányítására, például tévékhez, DVD-khez, Hifikhez, riasztók ki-be kapcsolásához, valamin mozgás érzékeléséhez is.
Ahhoz hogy a külső fényforrások ne zavarhassák a megfelelő érzékelést csak egy szűrt IR tartományt képes érzékelni, és a tartományon belül is csak egy bizonyos frekvenciával modulált jelet, ez általában 38kHz-en van. Tartomány szerint 35kHz-től 41kHz-ig biztos hogy érzékeli az infra jeleit.( 900nm-1000nm hullámhossz közötti IR ledeket kell használni, ilyeneket szerezzünk be.)
Az érzékelő amíg érzékel 38kHz IR jelet 0V-ot ad ki, ha megszakad az érzékelés át vált 5V-ra.

Egy kicsit bővebben az IR távirányítókról:
A távirányítók egy bizonyos alapfrekvenciás PWM jellel dolgoznak, ez esetünkben egy 38kHz-es
jel(38ezerszer kapcsolja be és ki a ledünket). A távirányító erre ültet rá egy kódot ami pár tized
millisecundumos jelekből áll. Ez úgy néz ki, hogy 0.6ms-ig ad a távirányító 38kHz jelet,
0.2ms-ig nem, 1.2ms-ig ad 38kHz jelet, 0.2ms-ig nem. Ezekből a jelekből épít fel egy több
bites kódot amit a vevőegység kikódol és végrehajtja a megfelelő utasítást.

Lássuk a kapcsolást:

/* Raw IR decoder PNA4602
Code is public domain, check out www.ladyada.net and adafruit.com
for more tutorials!
*/
//Mivel a digitalRead() eljárás túl lassú az infra jeleinek beolvasására ezért
// magára a digitális bemenetre érkező jelet olvassuk le a max. sebességgel

// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
#define IRpin_PIN PIND
#define IRpin 2
// for MEGA use these!// Arduino Megához
//#define IRpin_PIN PINE
//#define IRpin 4

// maximum érzékenység
#define MAXPULSE 65000

//ha az időzítés kisebb időközöket használ akkor rámehet a pontosságra ha meg túl

//nagyokat akkor nem tudja leolvasni az IR érzékelőt, meg kell találni az ideális értéket
#define RESOLUTION 20

// 100 impulzus tárolása
uint16_t pulses[100][2]; // tároló tömb
uint8_t currentpulse = 0; // index kezdőérték

void setup(void) {
Serial.begin(9600);// soros monitor bitráta
Serial.println("Ready to decode IR!");// kezdő szöveg kiiratása
}

void loop(void) {
uint16_t highpulse, lowpulse; // magas és alacsony érték tároló létrehozása
highpulse = lowpulse = 0; // kezdőérték beállítása


// while (digitalRead(IRpin)) { // ez túl lassú!
while (IRpin_PIN & (1 << IRpin)) {
//ha a pin bemeneti értéke magas

//ezred másodperc számolás
highpulse++;
delayMicroseconds(RESOLUTION);

//ha az impulzus túl hosszú és nem érkezett semmi akkor
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();//kinyomtatja az értéket a soros monitorra
currentpulse=0;//nullára állítja az indexet és visszatér
return;
}
}
//ha nincs időtúllépés akkor értéket irunk a tömbbe
pulses[currentpulse][0] = highpulse;

while (! (IRpin_PIN & _BV(IRpin))) {
// ha pin bemeneti értéke túl alacsony
lowpulse++;
delayMicroseconds(RESOLUTION);
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;//kiiratja az értéket és nullázza az indexet
return;
}
}
pulses[currentpulse][1] = lowpulse;

//sikeres alacsony-magas érték beolvasása után folytassa
currentpulse++;
}
//printpulses függvény kiirja az értékeket a soros monitorra
void printpulses(void) {
Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
for (uint8_t i = 0; i < currentpulse; i++) {
Serial.print(pulses[i][0] * RESOLUTION, DEC);
Serial.print(" usec, ");
Serial.print(pulses[i][1] * RESOLUTION, DEC);
Serial.println(" usec");
}

// print it in a 'array' format
Serial.println("int IRsignal[] = {");
Serial.println("// ON, OFF (in 10's of microseconds)");
for (uint8_t i = 0; i < currentpulse-1; i++) {
Serial.print("\t"); // tab
Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
Serial.print(", ");
Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
Serial.println(",");
}
Serial.print("\t"); // tab
Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
Serial.print(", 0};");
}


Egy tv távirányító segítségével küldjünk jeleket az IR szenzorunk felé, ezt a szenzor fogadja
majd a mikrovezérlőnk egyedi módon feldolgozza a beérkező jelet és átküldi az Arduino IDE
soros monitorára.

Minden távirányító más és más időkódolást használ evvel a módszerrel feltérképezhetjük
távirányítóinkat.

Jó tanulást!