Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

Arduino и инфрачервен приемник

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. За останлите пинове входните регистри са следните:

IRpinIRpin_PIN
pin0 .. pin7PIND
pin8 .. pin13PINB

Приемникът работи с почти всяко дистанционно тъй като сигналът, който излъчва светодиода в него е в диапазона 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); // угася светодиода
   } 
}