Подключаем приемник ИК

В каждом доме можно найти с десяток различный пультов дистанционного управления. Все они, как правило, работают в инфракрасном (ИК) диапазоне. Мастеря какую-либо «микропроцессорную штучку», да еще и на платформе Arduino, невольно возникает мысль воспользоваться готовым «ИК пультиком» для управления создаваемой конструкцией. du_kucha

Вся беда в том, что существует масса различных протоколов кодирования данных в дистанционном управлении. На помощь приходит сообщество Arduino: за нас уже потрудились и создали универсальную библиотеку, которая позволяет определять протокол и декодировать сообщение, принятое ИК приемником.ir_rec36

Для приема сигнала я использовал обычный ИК-приемник. Брал «из того, что было»: в магазине был 136АА71 — по внешнему виду похож на более распространенные; некоторые сомнения возникали в частоте модуляции (36КГц) — вдруг мои пульты все как один работают на 38КГц? Но, опасения были напрасны: практически все пульты успешно «считываются» приобретенным устройством. Рекомендуют включать ИК-приемник через RC-фильтр по питанию и подтягивать резистором выход к VCC — я этого не делал. Схема включения проста: подаем +5V на VCC, выход приемника подключаем к pin11 Arduino (можно и к другому — просто для меня так было удобно). Цоколевку приемника видно из рисунка, если словами, то: если смотрим спереди на излучатель выводами вниз, то (слева — направо): 1 — GND, 2 — VCC, 3 — OUT

Немного доделанный пример из библиотеки позволяет управлять двумя выходами с помощью четырех кнопок ТВ пульта (я использовал цветные на пульте ДУ от телевизора LG).

#include <IRremote.h> //подключаем библиотеку

int RECV_PIN = 11;    //к 11 выводу подключен выход ИК-приемника
int ch1 = 10;         //первый управляемый канал (например светодиод)
int ch2 = 12;         //второй канал

IRrecv irrecv(RECV_PIN);  //определяем вход
decode_results results;   //результат декодирования

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();      // "запускаем" прием
  pinMode(ch1, OUTPUT);     
  pinMode(ch2, OUTPUT);     
  digitalWrite(ch1, HIGH);  // мигнем светодиодами каналов
  digitalWrite(ch2, HIGH);  // чтоб было видно, что все ОК
  delay(500);               // wait for a second
  digitalWrite(ch1, LOW);   // turn the LED off 
  digitalWrite(ch2, LOW);   // turn the LED off 
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX); //"показываем" принятый код
    if (results.value == 0x20DF8679) { //код синей клавиши пульта
          digitalWrite(ch2, LOW);  }   //выключаем второй канал
    if (results.value == 0x20DF8E71) { //green
          digitalWrite(ch1, LOW);  }   // turn the LED off
    if (results.value == 0x20DFC639) { //yellow
          digitalWrite(ch2, HIGH);  }  // turn the LED on 
    if (results.value == 0x20DF4EB1) { //red
          digitalWrite(ch1, HIGH);  }  // turn the LED on 
    irrecv.resume();                   // Receive the next value
  }
  delay(100);
}

Конечно, коды клавиш у всех пультов разные, для этого в скетче и оставлен вывод принятого кода по последовательному каналу. Т.е. действуем так: собираем схему, запускаем программу и смотрим монитор последовательного порта. Нажимаем выбранные для управления кнопки и смотрим в мониторе их код. Меняем скетч: прописываем обнаруженные коды в соответствующих местах (например, вместо 0x20DF8679 пишем свой код и т.д.) Перезаливаем скетч в Arduino и пользуемся системой ДУ для двух каналов. Скетч легко расширить на произвольное число кнопок/каналов управления.

Подключаем приемник ИК: 4 комментария

  1. Вопрос не про приемник, но про библиотеку Rough , Можешь подсказать как отправить пачку импульсов? Не один из описанных в ней протоколов не подходит. Мне нужно зажигать ик-диод на определенные интервалы, естественно на частоте 36-38-40 кГц. Можно это сделать через эту библиотеку?

  2. А это нормально, что при такой схеме ИК приемник начинает хорошо так греться? Приемник новый, из упаковки достал, подключил как на схеме

Добавить комментарий