Дистанционное управление: связь с Arduino через инфракрасное излучение

Добавлено 28 февраля 2017 в 04:40

Датчик инфракрасного (ИК, IR) излучения позволяет использовать Arduino для приема и декодирования сигналов с пульта дистанционного управления от телевизора.

Большинство ТВ пультов дистанционного управлению использует инфракрасное излучение, чтобы передавать телевизору закодированные сообщения. Длина волны этого инфракрасного свет равна, как правило, 930 и 950 нм, что делает его невидимым для людей. Когда вы нажимаете одну из кнопок на пульте дистанционного управления телевизором, пульт модулирует ИК сигнал широтно-импульсно модулированным (ШИМ) сигналом, уникальным для этой кнопки. Этот сигнал улавливается ИК приемником в телевизоре, который демодулирует сигнал и определяет, какая кнопка была нажата. Мы можем сделать что-то похожее с Arduino, если снабдим нашу плату ИК приемником.

ИК приемник имеет три вывода: два для питания устройства и один для выходного сигнала датчика. Приемник демодулирует ИК сигнал и выдает демодулированный ШИМ сигнал. Выходной вывод подключен к выводу 3 платы Arduino. Затем Arduino, проанализировав ШИМ сигнал, определяет, какая кнопка была нажата.

Эксперимент 1

В данном эксперименте мы будем использовать пульт дистанционного управления телевизором для включения и выключени двух светодиодов.

Необходимые комплектующие

Схема соединений

Соедините компоненты, как показано на рисунке ниже. Инфракрасный приемник подключен к выводу 3. Светодиоды подключены к выводам 4 и 5 через токоограничивающие резисторы 330 Ом.

Управление Arduino через IR ПДУ. Схема соединений
Управление Arduino через IR ПДУ. Схема соединений

Код для эксперимента 1

Для данного эксперимента мы воспользуемся библиотекой IRemote.h для Arduino. Перед написанием кода мы определили, что ИК приемник выдает код 2049, если на ПДУ была нажата кнопка 1, и код 2050, если была нажата кнопка 2. Нажатие кнопки 1 включит светодиоды. Нажатие кнопки 2 выключит их.

#include "IRremote.h"
 
int rec = 3; // вывод, к которому подключен выход TSOP4838
int led_1 = 4;
int led_2 = 5;

#define code1  2049 // код, принятый от кнопки 1
#define code2  2050 // код, принятый от кнопки 2


 
IRrecv ir_rec(rec);
 
decode_results result;
 
void setup()
{
  Serial.begin(9600);   
  ir_rec.enableIRIn();  
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
 
}
 
void loop() 
{
  if (ir_rec.decode(&result)) 
  {
    unsigned int val = result.value;
    switch(val) 
    {
       case code1:
          digitalWrite(led_1,HIGH);
          digitalWrite(led_2,HIGH);
          break;
       case code2:
          digitalWrite(led_2,LOW);
          digitalWrite(led_1,LOW);
          break;       
    } 
      
    Serial.println(val); 
    ir_rec.resume();                   // принять следующее значение
  }
}

Эксперимент 2

В этом эксперименте мы будем включать и выключать светодиоды по отдельности с помощью ТВ ПДУ.

Необходимые комплектующие

Схема соединений

Схема соединений точно такая же, как и в эксперименте 1.

Код для эксперимента 2

В этом эксперименте вместе с кнопками 1 и 2 мы будем использовать кнопку включения/выключения на пульте дистанционного управления. Вывод ИК датчика при нажатии кнопки включения соответствует коду 2060. Нажатие кнопки 1 включает светодиод 1, нажатие кнопки 2 включает светодиод 2, нажатие кнопки включения/выключения выключает оба светодиода.

#include "IRremote.h"
 
int rec = 3; // вывод, к которому подключен выход TSOP4838
int led_1 = 4;
int led_2 = 5;

#define code1  2049 // код, принятый от кнопки 1
#define code2  2050 // код, принятый от кнопки 2
#define code3  2060 // код, принятый от кнопки включения/выключения



 
IRrecv ir_rec(rec);
 
decode_results result;
 
void setup()
{
  Serial.begin(9600);   
  ir_rec.enableIRIn();  
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
 
}
 
void loop() {
  if (ir_rec.decode(&result)) 
  {
    unsigned int val = result.value;
    switch(val) 
    {
       case code1:
          digitalWrite(led_1,HIGH);// включаем светодиод 1, если нажата кнопка 1
          digitalWrite(led_2,LOW);
          break;
       case code2:
          digitalWrite(led_2,HIGH);// включаем светодиод 2, если нажата кнопка 2
          digitalWrite(led_1,LOW);
          break;
       case code3:
          digitalWrite(led_2,LOW);// выключаем оба светодиода, если нажата кнопка вкл/выкл
          digitalWrite(led_1,LOW);
          break;   
    } 
      
    Serial.println(val); 
    ir_rec.resume();                   // принять следующее значение
  }
}

Видео

Вот и всё! Надеюсь, статья оказалась полезной. Оставляйте комментарии!

Теги

ArduinoIRДистанционное управлениеИК пультИнфракрасное излучениеПульт дистанционного управления

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.