Устройство, представленное в данной статье, декодирует сигнал самых распространенных типов инфракрасных пультов дистанционного управления (ПДУ) для бытовой техники.
Данный проект будет полезен, если вы хотите узнать код пульта и управлять существующими бытовыми устройствами с помощью самодельного пульта или хотите создать устройство, которым можно управлять с помощью имеющегося под рукой пульта.
Как это работает? Чтобы считать коды с пульта ДУ вы наводите пульт дистанционного управления на приемник и нажимаете кнопку. После этого детектор идентифицирует протокол ПДУ и отображает адрес и команду, соответствующие нажатой кнопки.
Детектор протокола ПДУ построен на микроконтроллере ATtiny85, инфракрасном приемнике и OLED-дисплее с разрешением 128×32 и шиной I2C.
Протоколы
Устройство поддерживает следующие протоколы:
- NEC
- Samsung
- Sony SIRC
- RC-5
Протоколы NEC и Samsung
Протокол NEC был изначально разработан производителем бытовой электроники NEC. Данный протокол используют многие японские и китайские производители, а также фирма Samsung.
Данные кодируются с использованием импульсного кодирования расстояния. Каждый бит начинается с 562,5 мкс несущей. Ноль имеет общую ширину 1,125 мс перед началом следующего бита, а единица имеет общую ширину 2,25 мс перед следующим битом:
Несущий импульс состоит из 21 цикла на частоте 38 кГц. Импульсы обычно имеют соотношение mark/space 1:4, чтобы уменьшить потребление тока:
Каждая кодовая последовательность начинается с длинного импульса, известного как импульс АРУ, за которым следует пауза. В протоколе NEC длина импульса составляет 9 мс, а промежутка — 4,5 мс:
В версии Samsung длительность импульса и паузы составляет 5 мс. Далее идут данные, которые состоят из 32 бит (16-битный адреса, за которым следует 16-битная команда):
Обратите внимание, что в конце должен быть один дополнительный импульс, чтобы завершить последний бит. Адрес идентифицирует часть управляемого оборудования, а команда указывает, какая кнопка была нажата.
Если кнопка удерживается, то код не повторяется. Вместо этого повторный код передается каждые 110 мс, состоящий из импульса АРУ длительностью 9 мс, за которым следует интервал 2,25 мс и пакетный сигнал длительностью 560 мкс.
В исходной версии протокола NEC старшие 8 бит адреса были просто инвертированной версией младших 8 бит, и то же самое для команды (как в приведенном выше примере).
Протокол Sony SIRC
Протокол Sony SIRC использует 12-, 15- или 20-битный код, состоящий из 7-битной команды, за которой следуют 5, 8 или 13 бит адреса.
Данные кодируются с использованием кодирования ширины импульса. Ноль состоит из импульса длительностью 600 мкс, а единица состоит из импульса длительностью 1,2 мс. В каждом случае за ними следует пауза в 600 мкс:
Нулевой импульс состоит из 24 циклов на частоте 40 кГц:
Один импульс в два раза длиннее этого. Импульсы обычно имеют отношение mark/space 1:4, чтобы уменьшить потребление тока.
Каждая кодовая последовательность начинается с начального импульса длительностью 2,4 мс, за которым следует пауза в 600 мкс, а затем данные:
Вот пример 20-битной версии, показанной в порядке передачи битов (слева направо):
В приведенном выше примере показана команда 0x2D и адрес 0x1E3A.
Если кнопка удерживается нажатой, то код повторяется с интервалом в 45 мс (от начала до начала), независимо от количества бит в коде. Протестированные пульты Sony посылают как минимум два повторения кода даже при коротком нажатии клавиши.
Протокол RC-5
Протокол RC-5 был первоначально разработан производителем бытовой электроники Philips и широко используется разными производителями, особенно в Великобритании и Европе.
Данные кодируются с использованием двухфазного кодирования, также известного как манчестерское кодирование. Все биты имеют длину 1,778 мс. Ноль представляется как половина бита несущей, за которой следует половина бита тишины, а единица — это половина бита тишины, за которой следует половина бита несущей:
Полубит несущей состоит из 32 циклов на частоте 36 кГц. Импульсы обычно имеют соотношение mark/space 1:4, чтобы уменьшить потребление тока:
Каждая кодовая последовательность состоит из 14 бит: сначала 2 стартовых бита, за которыми следует 1 бит переключения, за которым следует 5-битный адрес и 6-битная команда. Например:
Адрес идентифицирует часть управляемого оборудования, а команда указывает, какая кнопка была нажата. Если одна и та же кнопка нажимается несколько раз, то бит переключения меняется при каждом повторении кода. Если кнопка удерживается нажатой, то код этой кнопки отправляется повторно, один раз каждые 114 мс, без изменения бита переключения.
Расширение протокола с обратной совместимостью, называемое Extended RC-5, удваивает количество доступных команд, используя только один стартовый бит. Второй стартовый бит используется как 7-й командный бит. Его значение инвертируется, гарантируя, что первые 64 команды останутся совместимыми с исходным протоколом RC-5. Данный декодер поддерживает расширенный RC-5 протокол.
Принципиальная схема детектора
Для декодирования сигнала ПДУ использован фотоприемник Vishay TSOP38238 38 кГц. Он имеет достаточно широкую полосу пропускания для работы с несущей частотой 36 кГц, используемой протоколом RC-5, или с частотой 40 кГц, используемой протоколом Sony.
Обратите внимание, что инфракрасный приемник дает инвертированный выходной сигнал (при наличии несущей выход низкий, а при отсутствии несущей высокий).
В качестве дисплея использован OLED-дисплей 128×32 с шиной I2C. Резистор 33 кОм и конденсатор 0,1 мкФ обеспечивают правильный сброс дисплея при первом включении питания.
Программа
OLED-дисплей
Обозначение протокола:
- N для NEC
- M для Samsung
- R для RC-5
- S12, S15 или S20 для трех вариантов Sony
На дисплее также отображается адрес и команда в виде четырехзначных шестнадцатеричных чисел.
Синхронизация импульсов
Инфракрасные коды интерпретируются с помощью прерывания смены контакта, установленного на входе инфракрасного приемника:
// Настраиваем прерывание смены контакта на PB3 PCMSK = 1<<PCINT3; // Прерывание на PB3 GIMSK = 1<<PCIE; // Разрешить прерывания смены контакта
Синхронизация импульсов выполняется с помощью Timer/Counter1 в качестве простого 8-битного счетчика, настроенного с предварительным делителем 1/64:
// Настраиваем Таймер/Счетчик1 (предполагается, что clock работает на частоте 1 МГц) TCCR1 = 7<<CS10; // Нет совпадений для сравнения ; /64
Чтобы получить данные, мы читаем регистр TCNT1, в котором 1 единица равна 64 мкс. Максимальная длительность, которую мы можем измерить, составляет 256×64 мкс или 16 мс, что достаточно, поскольку самый длинный импульс в любом из протоколов составляет 9 мс.
Процедура обслуживания прерывания
Все декодирование протокола выполняется подпрограммой обслуживания прерывания смены контакта, которая вызывается при каждом переходе от инфракрасного приемника:
ISR(PCINT0_vect) { static int Mid; // фронт: 0 = нисходящий, 1 = восходящий int Time = TCNT1; if (TIFR & 1<<TOV1) { IRtype = 0; Edge = 1; } // Переполнение else if (Edge != (PINB>>PINB3 & 1)); // Игнорировать, если неправильный фронт else if (IRtype == 0) { // Конец начального импульса if (abs(Time - RC5Half) < 5) { IRtype = 'R'; RecdData = 0x2000; Bit = 12; Edge = 0; Mid = 0; } else if (abs(Time - RC5Full) < 5) { IRtype = 'R'; RecdData = 0x2000; Bit = 11; Edge = 0; Mid = 1; } else if ((abs(Time - SonyIntro) < 5) && (Edge == 1)) { IRtype = 'S'; RecdData = 0; Bit = 0; TIMSK = TIMSK | 1<<TOIE1; // Разрешить прерывание переполнения } else if (abs(Time - SamsungIntro) < 18) { IRtype = 'M'; RecdData = 0; Bit = -1; Edge = 0; // Игнорировать первый спадающий фронт } else if (abs(Time - NECIntro) < 18) { IRtype = 'N'; RecdData = 0; Bit = -1; Edge = 0; // Игнорировать первый спадающий фронт } // Бит данных } else if (IRtype == 'R') { Edge = !Edge; if ((Time < RC5Mean) && Mid) { Mid = 0; } else { Mid = 1; RecdData = RecdData | ((unsigned long) Edge<<Bit); if (Bit == 0) ReceivedCode('R', RecdData>>6 & 0x1F, (~(RecdData>>6) & 0x40) | (RecdData & 0x3F)); Bit--; } } else if (IRtype == 'S') { if (Time > SonyMean) RecdData = RecdData | ((unsigned long) 1<<Bit); Bit++; } else if ((IRtype == 'N') || (IRtype == 'M')) { if (Time > NECMean && Bit >= 0) RecdData = RecdData | ((unsigned long) 1<<Bit); Bit++; if (Bit == 32) ReceivedCode(IRtype, RecdData & 0xFFFF, RecdData>>16); } TCNT1 = 0; // Очистить счетчик TIFR = TIFR | 1<<TOV1; // Очистить переполнение }
Если с момента последнего перехода прошло более 16 мс, будет установлен флаг переполнения, что указывает на начало новой кодовой последовательности.
Идентификация протокола
Следующим этапом является определение длинны стартового импульса. Длина стартового импульса используется для идентификации протокола: это либо 9 мс для протокола NEC, 5 мс для протокола Samsung или 2,4 мс для протокола Sony. С протоколом RC-5 немного сложнее, потому что первый импульс может быть либо 0,889 мс, если первые два бита равны «11», либо 1,778 мс, если первые два бита равны «10». Переменная IRtype имеет значение «N», «M», «S» или «R» соответственно.
Компиляция программы
Программа компилируется с помощью Spence Konde’s ATTiny Core.
Выберите опцию ATtiny25/45/85 под заголовком ATtinyCore в меню Board. Затем выберите Timer 1 Clock: CPU, BOD Disabled, ATtiny85, 1 MHz (internal) из последующих меню.
Выберите «Записать загрузчик», чтобы правильно установить фьюзы. Затем загрузите программу с помощью ISP (внутрисистемное программирование).
Скачать файл проекта (3,1 KiB, скачано: 210)