КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

ИК-приёмник (Trema-модуль)

Исходники изображение:
Библиотеки:

Общие сведения:

Trema-модуль ИК-приёмник - позволяет управлять проектами на расстоянии с помощью обычного ИК-пульта от телевизора или другой техники. Исполнен в линейке Trema-модулей, что позволяет включать модуль в проект, без пайки и макетных плат.

Видео:

Спецификация:

  • Входное напряжение: 2,7 ... 5,5 В
  • Потребляемый ток: 0,65 … 1,05 мА (при Vсс = 5В) номинально 0,9 мА
  • Несущая частота: 38 кГц
  • Длинна световой волны: 850 … 1050 нм (пропускаемая фильтром более 80%)
  • Чувствительность: 0,17… 30000 мW/м2 (к мощности светового потока)
  • Расстояние приёма: до 45 м
  • Рабочая температура: -25 … 85 °C
  • Угол направленности: ±45°

Все модули линейки "Trema" выполнены в одном формате

Подключение:

Модуль подключается к любому цифровому выводу arduino. В комплекте имеется кабель для быстрого и удобного подключения к Trema Shield

Модуль удобно подключать 3 способами, в зависимости от ситуации:

Способ - 1 :  Используя проводной шлейф и Piranha UNO

Используя провода «Папа — Мама», подключаем  напрямую к контроллеру Piranha UNO.

Способ - 2 :  Используя Trema Set Shield

Модуль можно подключить к любому из цифровых входов Trema Set Shield.

Способ - 3 :  Используя проводной шлейф и Shield

Используя 3-х проводной шлейф, к  Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

Подробнее о модуле:

Модуль ИК-приёмника построен на базе модуля TSOP2238, который снабжён:

  • фильтром светового потока;
  • фотодиодом;
  • предусилителем;
  • полосовым фильтром несущей частоты - 38 кГц;
  • демодулятором;
  • операционным усилителем;
  • блоками защиты от помех (электромагнитных, световых, пульсаций напряжения)

Благодаря своим характеристикам модуль позволяет работать с большинством ИК-пультов.

Графики зависимости ИК-приёмника

Для приёма данных с ИК-пультов, предлагаем воспользоваться библиотекой iarduino_IR, которая позволяет работать с ИК-приёмником и(или) ИК-передатчиком.

Библиотека использует второй аппаратный таймер,

НЕ ВЫВОДИТЕ СИГНАЛЫ ШИМ НА 3 ИЛИ 11 ВЫВОД!

Подробнее про установку библиотеки читайте в нашей инструкции..

Дополнительная информация по работе с модулем:

Пакеты: Практически все пульты отправляют не только информационный пакет (указывающий тип устройства и код нажатой кнопки), но и пакеты повтора, сообщающие устройству об удержании нажатой кнопки. Таким образом принимающее устройство может реагировать на нажатие кнопки однократно или в течении всего времени её удержания.

Например: нажимая и удерживая кнопку с номером телевизионного канала, телевизор переключится на данный канал только один раз. В то время, как нажимая и удерживая кнопку увеличения громкости, телевизор будет её увеличивать в течении всего времени удержания кнопки.

Количество информационных пакетов у большинства пультов равно одному, но некоторые устройства, например кондиционеры, используют 2, 3 и более информационных пакетов.

Состав пакетов: Информационный пакет несёт информацию о коде производителя, типе устройства, коде нажатой кнопки и т.д. Пакеты повтора могут частично или полностью совпадать с информационным пакетом, копировать его биты с инверсией, или не нести никакой информации, представляя последовательность из нескольких одинаковых, для каждого пакета повтора, битов.

Длительность пауз между пакетами: обычно не превышает 200мс.

Протоколы передачи данных: определяют следующие, основные, параметры:

  • несущую частоту;
  • способ кодирования информации, длительность импульсов и пауз передаваемых битов;
  • количество информационных пакетов:
  • состав информационного пакета и пакетов повторов;
  • длительность пауз между пакетами;
  • наличие и форму сигналов Start, Stop и Toggle;

Несущая частота: у большинства пультов равна 38 кГц, именно на эту частоту настроен Trema ИК-приёмник.

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

  • кодирование длиной импульсов - сначала передаётся импульс, длина которого зависит от значения передаваемого бита, затем следует пауза, длина которой не зависит от значения бита. Например: в протоколе SIRC (Sony), длина импульса для бита «1» = 1200мкс, а для бита «0» = 600мкс, длина пауз всегда равна 600мкс. Таким образом можно отличить «1» от «0» по длине импульса.
  • кодирование длинной пауз - сначала передаётся импульс, длина которого не зависит от значения передаваемого бита, затем следует пауза, длина которой зависит от значения бита. Например: в протоколе NEC, длина паузы для бита «1» = 1687,5мкс, а для бита «0» = 562,5мкс, длина импульсов всегда равна 562,5мкс. Таким образом можно отличить «1» от «0» по длине паузы.
  • бифазное кодирование - длина импульса равна длине паузы, а их последовательность определяет тип передаваемого бита. Например: в протоколе RS5 (Philips), для бита «1» импульс следует за паузой, а для бита «0» пауза следует за импульсом. Для протокола NRC (Nokia), наоборот, для бита «1» пауза следует за импульсом, а для бита «0» импульс следует за паузой.

Сигналы Start, Stop и Toggle: по своему названию располагаются в начале, конце или середине пакета.

Stop: При кодировании длинной паузы, нельзя определить значение последнего бита в пакете, так как после пакета следует большая пауза, и последний бит будет всегда определяться как «1», поэтому в пакет добавляется сигнал Stop представляющий из себя импульс не несущий никакой информации.

Start: При бифазном кодировании требуется подать сигнал Start, так как невозможно начать передачу пакета с паузы.

Toggle: Это бит, который меняет своё значение при каждом новом нажатии на кнопку, используется в протоколах RS5, RS5X, RS6 (Philips), где пакеты повторов полностью повторяют данные информационного пакета. Таким образом принимающее устройство может отличить удержание кнопки от её повторного нажатия.

Примеры:

Проверка наличия данных поступивших с ИК-пульта, осуществляется функцией check(). Эта функция реагирует на нажатие кнопок ИК-пульта, но если её вызывать с параметром true, то она будет реагировать и на удержание кнопок.

Чтение данных с любого пульта, реагируем только на нажатие кнопок:

#include <iarduino_IR_RX.h>                      // Подключаем библиотеку для работы с ИК-приёмником
iarduino_IR_RX IR(7);                            // Объявляем объект IR, с указанием вывода к которому подключён ИК-приёмник
void setup(){
  Serial.begin(9600);                            // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бит/сек
  IR.begin();                                    // Инициируем работу с ИК-приёмником
}
void loop(){
  if(IR.check()){                                // Если в буфере имеются данные, принятые с пульта (была нажата кнопка)
    Serial.println(IR.data, HEX);                // Выводим код нажатой кнопки
    Serial.println(IR.length   );                // Выводим количество бит в коде
  }
}

В данном скетче функция check() вызывается без аргументов, значит и реагирует она только на нажатия кнопок ИК-пульта.

Чтение данных с любого пульта, реагируем на удержание кнопок:

#include <iarduino_IR_RX.h>                      // Подключаем библиотеку для работы с ИК-приёмником
iarduino_IR_RX IR(6);                            // Объявляем объект IR, с указанием вывода к которому подключён ИК-приёмник
void setup(){
  Serial.begin(9600);                            // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бит/сек
  IR.begin();                                    // Инициируем работу с ИК-приёмником
}
void loop(){
  if(IR.check(true)){                            // Если в буфере имеются данные, принятые с пульта (удерживается кнопка)
    Serial.println(IR.data, HEX);                // Выводим код нажатой кнопки
    Serial.println(IR.length   );                // Выводим количество бит в коде
  }
}

В данном скетче функция check() вызывается с параметром true, значит и реагирует она как на нажатия, так и на удержания кнопок ИК-пульта.

Чтение данных с любого пульта, с указанием как реагировать на какие кнопки.

#include <iarduino_IR_RX.h>                          // Подключаем библиотеку для работы с ИК-приёмником
iarduino_IR_RX IR(6);                                // Объявляем объект IR, с указанием вывода к которому подключён ИК-приёмник
                                                     //
bool flgKey1 = false; uint32_t codKey1 = 0xFF30CF;   // Определяем флаг нажатия и код кнопки 1
bool flgKey2 = false; uint32_t codKey2 = 0xFF18E7;   // Определяем флаг нажатия и код кнопки 2
bool flgKey3 = false; uint32_t codKey3 = 0xFF7A85;   // Определяем флаг нажатия и код кнопки 3
bool flgKey  = false; uint32_t tmrKey  = 0;          // Определяем флаг разрещающий вывод данных в монитор и время последнего нажатия кнопки.
                                                     //
void setup(){                                        //
  Serial.begin(9600);                                // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бит/сек
  IR.begin();                                        // Инициируем работу с ИК-приёмником
}                                                    //
                                                     //
void loop(){                                         //
  if(IR.check(true)){                                // Если в буфере имеются данные, принятые с пульта (удерживается кнопка), то ...
    if(millis()-200 > tmrKey){                       // Если с последней поступившей команды прошло более 200 мс, то
      flgKey1=false;                                 // Считаем что кнопка 1 не удерживается
      flgKey2=false;                                 // Считаем что кнопка 2 не удерживается
      flgKey3=false;                                 // Считаем что кнопка 3 не удерживается
    } tmrKey = millis();              flgKey=true;   // Сохраняем время последней реакции на пульт и азрешаем вывод данных
    if(IR.data==codKey1){ if(flgKey1){flgKey=false;} flgKey1=true; }else{flgKey1=false;} // Запрещаем вывод данных кнопки 1 при её удержании
    if(IR.data==codKey2){ if(flgKey2){flgKey=false;} flgKey2=true; }else{flgKey2=false;} // Запрещаем вывод данных кнопки 2 при её удержании
    if(IR.data==codKey3){ if(flgKey3){flgKey=false;} flgKey3=true; }else{flgKey3=false;} // Запрещаем вывод данных кнопки 3 при её удержании
    if(flgKey){                                      // Если вывод данных разрешен, то ...
      Serial.println(IR.data, HEX);                  // Выводим код нажатой кнопки
      Serial.println(IR.length   );                  // Выводим количество бит в коде
    }                                                //
  }                                                  //
}                                                    //

В данном скетче функция check() вызывается с параметром true, значит она реагирует как на нажатия, так и на удержания кнопок ИК-пульта. Но вывод данных в монитор последовательного порта осуществляется только при установленном флаге flgKey, который сбрасывается при удержании кнопок с кодами 0xFF30CF0xFF18E7 и 0xFF7A85. Получается что на 3 кнопки скетч реагирует только при нажатии, а на остальные кнопки, как на нажатие, так и на удержание.

Чтение данных только с тех пультов, которые работают по указанному протоколу:

#include <iarduino_IR_RX.h>                      // Подключаем библиотеку для работы с ИК-приёмником
iarduino_IR_RX IR(5);                            // Объявляем объект IR, с указанием вывода к которому подключён ИК-приёмник
void setup(){
  Serial.begin(9600);                            // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бит/сек
  IR.begin();                                    // Инициируем работу с ИК-приёмником
  IR.protocol("Ae``QtWL@L`|LJ`G@@@@@BPBp");      // Указываем протокол передачи данных, на который следует реагировать
}
void loop(){
  if(IR.check(true)){                            // Если в буфере имеются данные, принятые с пульта (удерживается кнопка)
    Serial.println(IR.data, HEX);                // Выводим код нажатой кнопки
    Serial.println(IR.length   );                // Выводим количество бит в коде
  }
}

В данном скетче, в коде setup(), указан протокол передачи данных, который редко совпадает у разных производителей ИК-пультов. Значит функция check() в коде loop() будет реагировать только на те ИК-пульты, которые поддерживают указанный протокол.

Получение протокола передачи данных и типа кодировки:

#include <iarduino_IR_RX.h>                      // Подключаем библиотеку для работы с ИК-приёмником
iarduino_IR_RX IR(4);                            // Объявляем объект IR, с указанием вывода к которому подключён ИК-приёмник
void setup(){
  Serial.begin(9600);                            // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бит/сек
  IR.begin();                                    // Инициируем работу с ИК-приёмником
}
void loop(){
  if(IR.check()){                                // Если в буфере имеются данные, принятые с пульта (была нажата кнопка)
    Serial.println(IR.protocol());               // Выводим строку протокола передачи данных
  }
}

В данном примере описано как получить протокол передачи данных ИК-пультов. В статье Wiki ИК-передатчик, описано, как передавать коды кнопок по указанному протоколу.

Таким образом, можно создать скетч ИК-передатчика для имитации сигналов различных ИК-пультов. В результате, устройства будут реагировать на ИК-передатчик, как на собственный ИК-пульт.

Описание основных функций библиотеки:

Подключение библиотеки:

#include <iarduino_IR_RX.h>                // Подключаем библиотеку, для работы с ИК-приёмником.
iarduino_IR_RX IR(№_ВЫВОДА [, ИНВЕРСИЯ] ); // Объявляем объект IR, с указанием номера вывода, к которому подключён ИК-приёмник.
                                           // Вторым параметром, типа bool, можно указать, что данные с приёмника являются инверсными.

Функция begin();

  • Назначение: инициализация работы с ИК-приёмником
  • Синтаксис: begin();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Примечание: Вызывается 1 раз в коде setup.
  • Пример:
IR.begin(); // Инициируем работу с ИК-приёмником

Функция check();

  • Назначение: Проверка наличия принятых с пульта данных.
  • Синтаксис: check( [ УДЕРЖАНИЕ ] );
  • Параметры:
    • УДЕРЖАНИЕ - необязательный параметр, типа bool - указывающий что необходимо реагировать на удержание кнопок пульта.
  • Возвращаемые значения: bool - приняты или нет, данные с пульта.
  • Примечание: Если функция вызвана без параметра, или он равен false, то функция будет реагировать только на сигналы с пульта при нажатии его кнопок, а если указать true, то функция будет реагировать, как на нажатие, так и на удержание кнопок пульта.
  • Пример:
if( IR.check()     ){ ... ;} // Если приняты данные с пульта, при нажатии его кнопки
if( IR.check(true) ){ ... ;} // Если принимаются данные с пульта, при удержании кнопки

Функция protocol();

  • Назначение: Получение, установка или сброс протокола передачи данных.
  • Синтаксис: protocol( [ ПАРАМЕТР ] );
  • Получение протокола: Если функция вызвана без параметра, то она вернёт строку из 25 символов + символ конца строки. Биты данной строки, несут информацию о типе протокола передачи данных пульта, данные которого были приняты последними. Данную строку можно использовать для установки протокола ИК-передатчику, или ИК-приёмнику (см.ниже).
  • Установка протокола: Если функция вызвана с параметром в виде строки из 25 символов протокола + символ конца строки, то после этого, функция chek(), будет реагировать только на пульты, соответствующие указанному протоколу передачи данных.
  • Сброс протокола: Если функция вызвана с параметром IR_CLEAN, то функция chek() опять станет реагировать на сигналы с любых пультов.
  • Получение параметров протокола: Если функция вызвана с параметром int, от 0 до 17, то она вернёт не строку протокола, а значение типа int с одним из параметров протокола передачи данных пульта, данные которого были приняты последними:
    • 0 - тип кодировки:
      • IR_UNDEFINED - тип кодировки не определён;
      • IR_PAUSE_LENGTH - кодирование длинной паузы;
      • IR_PULSE_LENGTH - кодирование длинной (шириной) импульса (ШИМ);
      • IR_BIPHASIC - бифазное кодирование;
      • IR_BIPHASIC_INV - бифазное кодирование с инверсными битами;
      • IR_NRC - пакеты повтора идентичны, а первый и последний пакеты специальные;
      • IR_RS5 - кодировка PHILIPS с битом toggle;
      • IR_RS5X - кодировка PHILIPS с битом toggle;
      • IR_RS6 - кодировка PHILIPS с битом toggle.
    • 1 - несущая частота передачи данных (в кГц);
    • 2 - заявленное количество информационных бит в 1 пакете;
    • 3 - заявленное количество информационных бит в пакете повтора;
    • 4 - длительность паузы между пакетами (в мс);
    • 5 - длительность импульса в стартовом бите (в мкс);
    • 6 - длительность паузы в стартовом бите (в мкс);
    • 7 - длительность импульса в стоповом бите (в мкс);
    • 8 - длительность паузы в стоповом бите (в мкс);
    • 9 - длительность импульса в бите рестарт или toggle (в мкс);
    • 10 - длительность паузы в бите рестарт или toggle (в мкс);
    • 11 - позиция бита рестарт или toggle в пакете (№ бита);
    • 12 - максимальная длительность импульса в информационных битах (в мкс);
    • 13 - минимальная длительность импульса в информационных битах (в мкс);
    • 14 - максимальная длительность паузы в информационных битах (в мкс);
    • 15 - минимальная длительность паузы в информационных битах (в мкс);
    • 16 - флаг наличия стартового бита (true/false);
    • 17 - флаг наличия стопового бита (true/false);
    • 18 - флаг наличия бита рестарт или toggle (true/false);
    • 19 - тип пакета повтора (0-нет, 1-с инверсными битами, 2-идентичен информационному, 3-уникален);
  • Возвращаемые значения: Зависят от наличия и типа параметра.
  • Примечание: Если ранее был установлен протокол, то попытка получения протокола, или параметров протокола, вернёт значения установленного ранее протокола, а не протокола передачи данных пульта, данные которого были приняты последними.
  • Пример:
                                  IR.protocol("AeQQV~zK]Kp^KJp[@@@@@@@Bp"); // Устанавливаем протокол. Теперь приёмник будет получать данные, только от пультов телевизора ELENBERG.
                                  IR.protocol(IR_CLEAN);                    // Сбрасываем ранее установленный протокол. Теперь приёмник снова будет реагировать на любые пульты.
if( IR.check() ){ Serial.println( IR.protocol()   ); }                      // Получаем протокол. Как только приёмник получит данные, в мониторе высветится строка из 25 символов протокола.
if( IR.check() ){ Serial.println( IR.protokol(12) ); }                      // Получаем один из параметров протокола. Как только приёмник получит данные, в мониторе отобразится максимальная длительность импульса информационного бита в микросекундах.

Переменная data

  • Значение: Возвращает код кнопки, принятый с пульта;
  • Тип данных: uint32_t.
if( IR.check() ){ Serial.println( IR.data ); } // Выводим код нажатой кнопки, если он принят

Переменная length

  • Значение: Возвращает размер кода кнопки, в битах;
  • Тип данных: uint8_t.
if( IR.check() ){ Serial.println( IR.length ); } // Выводим размер кода нажатой кнопки, если он принят

Переменная key_press

  • Значение: Возвращает флаг, указывающий на то, что кнопка пульта нажимается а не удерживается;
  • Тип данных: bool.
if( IR.check(true) ){
  if( IR.key_press ){Serial.println( "PRESS" );} // Текст будет выведен 1 раз, когда кнопка нажимается
  else              {Serial.println( "HOLD " );} // Текст будет выводиться постоянно, пока кнопка удерживается
}

Применение:

  • управление роботами, движущимися, летающими и плавающими моделями, бытовой и специализированной техникой.
  • включение/выключение освещения, обогрева, вентиляции, полива и т.д.
  • открывание/закрывание дверей, жалюзи, мансардных окон, форточек и т.д.

Ссылки:




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями