PNA4602 е фоточувствителен сензор само за инфрачервения спектър на светлината. Инфрачервени приемници има във всвеки телевизор, DVD или Hi-Fi система с дистанционно управление. В дистанционното на устройството се намира инфрачервен светодиод, който излъчва инфрачервени сигнали.
Инфрачервената светлина е невидима за човешкото око, но може да се види през камерата на мобилен телефон например.
В IR приемника има специален филтър на светлинните лъчи, който пропуска само тези между 35Khz и 41Khz, като при 38Khz е най-чувствителен. Захранва се с 5V напрежение на два от пиновете. На третия пин се намира цифровия изход, който е на ниво LOW (0V), когато е засечен инфрачервен сигнал и на ниво HIGH (5V), когато не е засечен.
Инфрачервеният приемник може да тествате чрез дистанционно като свържете следната схема:
Дясният пин се свързва към 5V от Arduino, а средният към GND. Лявият пин на сензора се свързва през резистор от 200 до 1000 ома към катода (късото краче) на обикновен светодиод. Анода на светодиода се свързва към 5V.
След като свържете схемата, вземете дистанционно и подавайте команди срещу приемника. Светодиодът ще примигва при всеки натиснат бутон, тъй като изходният пин на светодиода ще бъде 0V и през светодиода ще протече ток в права посока.
Въпреки че IR сензорът е с цифров изход, стандартната функция digitaRead() е прекалено бавна за да следи състоянието на пина. За целта се прилага хардуерно четене, както е показано по-доло за пин 2.
#define IRpin_PIN PIND // входен регистър #define IRpin 2 // пин 2 while (IRpin_PIN & (1 << IRpin)); // докато IRpin е HIGH |
Състоянието на пина IRpin се прочита директно от входния регистър PIND. За останлите пинове входните регистри са следните:
IRpin | IRpin_PIN |
---|---|
pin0 .. pin7 | PIND |
pin8 .. pin13 | PINB |
Приемникът работи с почти всяко дистанционно тъй като сигналът, който излъчва светодиода в него е в диапазона 35Khz - 41Khz. Arduino също може да генерира сигнал с такава честота, благодарение на изходите си с PWM. За сигнал с честота 38Khz е необходим следния код:
#define IR_CLOCK_RATE 38000L // честота 38Khz #define pwmPin 11 // пин, на който ще се генерира PWM void setup() { TCCR2A = _BV(WGM21) | _BV(COM2A0); TCCR2B = _BV(CS20); OCR2A = (F_CPU/(IR_CLOCK_RATE*2L)-1); pinMode(pwmPin, OUTPUT); } |
Пример
Даденият по-долу код генерира лъчение с честота 38Khz чрез инфрачервен светодид, анода на който е закачен за pin11, а катода за GND. Ако IR приемникът, изходът на който е на pin2, засече лъчението, ще се светне светодиод между pin13 и GND.
Код
/* Описание: * Генерира IR лъчение с честота 38Khz * Проверява чрез IR сенозор * Светва светидиод, ако засече лъчението Свързване: Vout -> pin2 GND -> GND Vcc -> 5V IR LED -> pin11 LED -> pin13 Tihomir Trifonov (02-2012) email:tisho@inbox.com с подкрепата на Robotev.com */ #define IR_CLOCK_RATE 38000L // честота 38Khz #define pwmPin 11 // PWM на pin11 #define IRpin_PIN PIND // входен регистър за порт D #define IRpin 2 // pin2 за вход от IR сензора #define ledPin 13 // pin13 за светодиода void setup() {// инициализации pinMode(pwmPin, OUTPUT); pinMode(ledPin, OUTPUT); // генерира PWM с честота IR_CLOCK_RATE TCCR2A = _BV(WGM21) | _BV(COM2A0); TCCR2B = _BV(CS20); OCR2A = (F_CPU/(IR_CLOCK_RATE*2L)-1); } void loop(){// програмен цикъл if((IRpin_PIN & (1 << IRpin)) == LOW){ // проверява IRpin digitalWrite(ledPin,HIGH); // свети ако е LOW } else {// ако е HIGH digitalWrite(ledPin,LOW); // угася светодиода } } |