Как узнать протокол пульта ду

от admin

Arduino.ru

Как определить протокол передачи данных с ИК пульта.

  • Войдите на сайт для отправки комментариев

Помогите определить протокол передачи данных с пульта ДУ при помощи Arduino. Надеюсь существует такой готовый скетч для Arduino?

  • Войдите на сайт для отправки комментариев

вопрос вообще непонятен, какой такой протокол?

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

  • Войдите на сайт для отправки комментариев

Протокол == формат посылок. Куча их.

  • Войдите на сайт для отправки комментариев

библиотеку IRremote пробовали ?

  • Войдите на сайт для отправки комментариев

Конечно же пробовал. И как там протокол передачи определить? Коды кнопок — вопросов нет.
Мне нужно знать по какому протоколу у меня работает мой пульт (NEC, RC5. )

  • Войдите на сайт для отправки комментариев

Конечно же пробовал. И как там протокол передачи определить? Коды кнопок — вопросов нет.
Мне нужно знать по какому протоколу у меня работает мой пульт (NEC, RC5. )

И что же Вы пробовали? Если в примерах к библиотеке есть готовый скетч ReceiveDemo, который среди прочего выводит в сериал протокол?

  • Войдите на сайт для отправки комментариев

Обычно осциллографом или цифровым анализатором снимают последовательность импульсов посылки и сравнивают с известными сигнатурами протоколов. Для одного канала можно и на блюпиле написать анализатор с точностью до микросекунд, нарисовать получившееся и сравнить с сигнатурами.

Как узнать протокол пульта ду

Некоторые протоколы ИК-пультов. Часть первая

Автор: Aheir
Опубликовано 30.07.2007

Количество барахла в кладовке – величина монотонно возрастающая и не являющаяся функцией частоты уборки. Другими словами – бороться с фактом накопления у радиолюбителей нужного и не очень хлама, относящегося к электронике, бесполезно. Но тем не менее, чтобы хоть как-то реабилитироваться в глазах домашних, иногда стоит извлекать из этой кучки что-нибудь полезное на потеху изумленной публике… Ладно, это все лирика.

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

Скажу сразу, что до конкретных применений мы в этот раз не доберемся, но вот что это вообще за звери такие выясним. Сильно в теорию вдаваться не буду, скажу лишь, что как правило информация передается пультом в виде модулированной прямоугольными импульсами разной длительности несущей частоты, которая обычно равна 36кГц. В качестве приемника такого сигнала можно применить фотодиод с необходимыми цепями усиления и фильтрации, а можно пойти по пути для ленивых и использовать интегральный фотоприемник типа TSOP17xx, где хх – и есть та самая несущая частота, который имеет цифровой выход и выдает непосредственно огибающую несущей частоты, те самые заветные нолики и единички. Именно так я и поступил, поэтому все дальнейшее будет происходить при непосредственном живейшем участии приемника TSOP1736:

Интегральный фотоприемник TSOP1736

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

Я, естественно, начал с поиска информации в Сети, но, к своему глубочайшему удивлению, ничего кроме нескольких вариантов исходников для кода RC-5 (один из существующих протоколов) не нашел. Сгоряча зашив пару вариантов этих прошивок в отладочную ATMega16 и убедившись в их неработоспособности, я взялся за осциллограф. Как оказалось, очень правильно. Дело в том, что ни один из имеющихся у меня пультов по протоколу RC-5 не работал.

Очень много полезной информации по этому поводу представлено на сайте https://www.sbprojects.com, которым я и руководствовался в своих дальнейших изысканиях.

После снятия осциллограмм и сравнения их с найденными на уже названном сайте образцами стало ясно, что из пультов один работает по протоколу Sony SIRC (как ни странно, это был пульт о муз.центра Sony), а все остальные — по протоколу NEC.

В частности, для протокола NEC:

Общий вид посылки

Временная диаграмма и способ кодирования 0 и 1

Посылка при удержании кнопки пульта

Временная диаграмма для кода повтора (удержание кнопки)

А для протокола SIRC:

Общий вид посылки

Временная диаграмма и способ кодирования 0 и 1

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

И в том, и в другом случае 0 и 1 кодируются длительностью импульса или, что то же, его шириной. Каждый бит начинается с импульса некоторой неизменной длительности. Соответственно, чтобы понять, получили мы 0 или 1, нам надо измерить длительность паузы после начального импульса бита или длительность паузы вместе с этим импульсом, поскольку его длина неизменна. С этой задачей вполне может справиться таймер микроконтроллера, который будет запускаться в момент начала стартового импульса бита.

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

Замечу, что фотоприемник имеет инверсный выход, т.е. в момент присутствия ИК-излучения на его выходе 0, поэтому прерывание будем настраивать по спаду. Таким образом, в плане аппаратной реализации нам достаточно подсоединить выход фотоприемника к ножке свободного внешнего прерывания микроконтроллера, сконфигурированной как вход с «подтяжкой» (не лишним будет также поставить и внешний подтягивающий резистор килоом на 10 кОм плюсу питания).

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

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

Исходники достаточно подробно прокомментированы, а их более подробное обсуждение предлагаю продолжить на форуме.

Описание протокола Nec

Данные передаются младшим битом вперед. Каждый бит начинается с пачки импульсов несущей частоты. Длительность пачки равна 560 мкс. Путем изменением временного интервала между пачками импульсов осуществляется кодирование нулей и единиц. При передаче логической единицы интервал от начала текущей до начала следующей пачки импульсов составляет 2.25 мс, а при передаче логического нуля – 1.12 мс.

Стартовый импульс представляет собой пачку импульсов несущей частоты длительностью 9 мс. После подачи стартового импульса следует пауза в 4.5 мс.


Существует расширенная версия протокола Nec, в которой используется 16-ти разрядные адреса.

Алгоритм декодирования сигналов ПДУ

Файлы

Ссылки

Related items

  • Модуль приемника ИК сигналов на ATtiny
  • Учебный курс AVR. Работа с SPI модулем. Ч1
  • Знакомство с замкнутой системой управления
  • Робот своими руками. ИК бампер
  • Миниатюрный универсальный ИК пульт дистанционного управления
Comments

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

Мультиметр видит сигнал, если он присутствует около 0,5сек. А длительности команд пульста — несколько милисекунд! Конечно мультиметр не увидит!

попробовал повторить прибор, но не пошло.

вопрос: какие Fuse mega8535, т.к. программатор USBASP AVRDUDE из хекса брать не умеет.

Мне тут подсказали, что в схеме ошибка. Чтобы проект заработал, нужно подправить файл lcd_lib.h
Code:
//порт, к которому подключена шина данных
#define PORT_DATA PORTC
#define PIN_DATA PINC
#define DDRX_DATA DDRC

//порт, к которому подключены управляющие выводы
#define PORT_SIG PORTC
#define PIN_SIG PINC
#define DDRX_SIG DDRC

//управляющие выводы
#define RS 0
#define RW 1
#define EN 2

Микроконтроллер работает от внешнего кварца на 16 МГц. Нужно выставить фуз биты соответствующие этому режиму..

Схему я скоро поправлю.

Не пошёл у меня этот код. Принимает всегда разные значения. Не знаю, это только у меня так, или ещё кому повезло? Немного упростил код, засунув его полностью в обработчик прерывания таймера иь всё пошло как по маслу. Имена многих переменных и констант изменены и некоторые вообще удалены за ненадобностью. Вот код прерывания:

Code:
//прерывание по событию захват
interrupt [TIM1_CAPT] void Timer1Capt(void)
<
#asm("cli")
if (flag==1) <
interval = TCNT1;
>
else
<
interval=0;
TCNT1=0;
flag=1;
#asm("sei")
LED=OFF;
return;
>

switch (state) <
//ждем стартовый импульс
case WAIT:
TCNT1=0;
if (interval < START_BIT_INT) <
if (interval > REPEAT_BIT_INT) <
data = 0;
countBit = 0;
countByte = 0;
buffer[NUM_REPEAT] = 0;
state = RECEIVE;
LED=ON;
>
else <
LED=ON;
buffer[NUM_REPEAT]++;
flag=0;
delay_ms(10);
LED=OFF;
>
>
interval=0;
break;

//прием посылки
case RECEIVE:
TCNT1=0;
if (interval < HIGH_BIT_INT) <
if (interval > LOW_BIT_INT) <
SetBit(data, countBit);
>
countBit++;
if (countBit == 8) <
buffer[countByte] = data;
countBit = 0;
data = 0;
countByte++;
if (countByte == (MAX_SIZE — 1)) <
flag=0;
state = WAIT;
LED=OFF;
break;
>
>
>
else
<
flag=0;
state=WAIT;
LED=OFF;
>
interval=0;
break;

В проекте для CodeVision ошибка. У меня руки не доходят исправить ее. Чтобы код заработал, нужно в файле timer.c кое чего подправить.
Code:
icr1 = icr2;
icr2 = ((unsigned int)ICR1H<<8)|ICR1L;

чтобы было вот так
Code:
icr1 = icr2;
icr2 = ICR1L;
icr2 |= ((unsigned int)ICR1H<<8);

Попробуй, должно заработать.

PS. первый раз неправильно написал. не выспался.

Читать:
Чем залить нихромовую проволоку в нагревателе

Весь код не лезет в размер. Вот объявление переменных и констант.

Code:
#include <mega32.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>
#include <bits_macros.h>
#include <alcd.h>
#define LED PORTD.4
#define START_BIT_INT 3500
#define REPEAT_BIT_INT 3000
#define LOW_BIT_INT 300
#define HIGH_BIT_INT 600
#define RECEIVE 1
#define WAIT 0
#define ON 1
#define OFF 0
#define NUM_REPEAT 4
#define MAX_SIZE 5
unsigned char state;
unsigned char flag = 0;
unsigned char buffer[MAX_SIZE];
unsigned char lcd_buffer[20];
static unsigned int interval;
static unsigned char data;
static unsigned char countBit, countByte;

Функция main выглядит так .
Code:
void main(void)
<
PORTA=0xFF;
DDRA=0x00;
PORTB=0xFF;
DDRB=0x00;

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS — PORTA Bit 4
// RD — PORTA Bit 5
// EN — PORTA Bit 6
// D4 — PORTB Bit 4
// D5 — PORTB Bit 5
// D6 — PORTB Bit 6
// D7 — PORTB Bit 7
// Characters/line: 20
lcd_init(20);
lcd_puts("READY");

while (1)
<
// Place your code here
if ((flag==0)&&(state==WAIT))

Это функция вывода результата.
Code:
void ShowResult()
<
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"%u %u %u %u \n",buffer[0],buffer[1],buffer[2],buffer[3]);
lcd_puts(lcd_buffer);
sprintf(lcd_buffer,"%u ",buffer[4]);
lcd_puts(lcd_buffer);
>

Вот и весь кодю 😉 Да, у меня атмега32, для других надо соответсвенно менять инициализацию оборудования в майн функции.

Всем доброго дня.Есть проблема.Вот тоже занимаюсь декодированием сигналов пульта,только протокол RC5.TSOP подключен так-же как в статье выше к выводу ICP микроконтролера.
Библиотека RC5 использована — kibermaster.net/priem-komand-s-pulta-distantsionnogo-upravleniya/.После инициализации таймера и разрешения прерываний включается захват, и микроконтроллер начинает обрабатывать данные, принятые с пульта. Если получен пакет данных, то активируется флаг rc5.dataOK, а принятая команда записывается с переменную структуры rc5.command.
Сам код который я юзаю являет собой вкл/отключение четырех каналов клавишами 1-4 пульта
Сам код здесь radiomanoff.at.ua/index/distancionnoe_upravlenie_na_atmega8_protokol_rc_5/0-27

Все бы хорошо,но вот если нажатую кнопку пульта «передержать» соответствующий канал включается/выкл ючается.А хотелось чтобы канал включился,и контролер ждал отпускания кнопки пульта,а уже потом обрабатывал следующее нажатие.
Пробовал вставлять
Code: .
_delay_ms(700); //задержка 700 мс
rc5.dataOK = 0; // сбрасываем флаг

while (rc5.dataOK) //ждем отпускания кнопки
<
_delay_ms(200); //задержка 70 мс
rc5.dataOK = 0; // сбрасываем флаг
кнопки
Как бы проверка отпускания кнопки.Тестирую на реальном «железе»не идет

Cпасибо за ответ,но Вы знаете у меня все получилось с циклом while,просто вставил задержку
Code: _delay_ms(200); //задержка 700 мс

Детектор протокола инфракрасного пульта дистанционного управления. Схема на ATtiny85.

Устройство, представленное в данной статье, декодирует сигнал самых распространенных типов инфракрасных пультов дистанционного управления (ПДУ) для бытовой техники.

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

Как это работает? Чтобы считать коды с пульта ДУ вы наводите пульт дистанционного управления на приемник и нажимаете кнопку. После этого детектор идентифицирует протокол ПДУ и отображает адрес и команду, соответствующие нажатой кнопки.

Детектор протокола ПДУ построен на микроконтроллере 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

На дисплее также отображается адрес и команда в виде четырехзначных шестнадцатеричных чисел.

Синхронизация импульсов

Инфракрасные коды интерпретируются с помощью прерывания смены контакта, установленного на входе инфракрасного приемника:

Синхронизация импульсов выполняется с помощью Timer/Counter1 в качестве простого 8-битного счетчика, настроенного с предварительным делителем 1/64:

Чтобы получить данные, мы читаем регистр TCNT1, в котором 1 единица равна 64 мкс. Максимальная длительность, которую мы можем измерить, составляет 256×64 мкс или 16 мс, что достаточно, поскольку самый длинный импульс в любом из протоколов составляет 9 мс.

Процедура обслуживания прерывания

Все декодирование протокола выполняется подпрограммой обслуживания прерывания смены контакта, которая вызывается при каждом переходе от инфракрасного приемника:

Если с момента последнего перехода прошло более 16 мс, будет установлен флаг переполнения, что указывает на начало новой кодовой последовательности.

Идентификация протокола

Следующим этапом является определение длинны стартового импульса. Длина стартового импульса используется для идентификации протокола: это либо 9 мс для протокола NEC, 5 мс для протокола Samsung или 2,4 мс для протокола Sony. С протоколом RC-5 немного сложнее, потому что первый импульс может быть либо 0,889 мс, если первые два бита равны «11», либо 1,778 мс, если первые два бита равны «10». Переменная IRtype имеет значение «N», «M», «S» или «R» соответственно.

Компиляция программы

Выберите опцию ATtiny25/45/85 под заголовком ATtinyCore в меню Board. Затем выберите Timer 1 Clock: CPU, BOD Disabled, ATtiny85, 1 MHz (internal) из последующих меню.

Выберите «Записать загрузчик», чтобы правильно установить фьюзы. Затем загрузите программу с помощью ISP (внутрисистемное программирование).

Похожие публикации