Библиотека приема ИК ДУ

Работает методом программного опроса (не нужны отдельный таймер и прерывание по перепаду на выводе для измерения длительности импульсов).


.h: codetidy.com/3996/
.c: codetidy.com/3997/

Макрос INC_LIMIT:
#define INC_LIMIT(a, max) { if ((a) < (max)) (a)++; }


Пока реализованы протоколы Sony/SIRC, NEC/Samsung, RC5. Другие протоколы добавляются очень просто. Все пульты которые попадались (ТВ, тюнеры, разные комп.примочки) использовали эти протоколы, RC5/6 пока не видел.

Минимально необходимые настройки:
#define REMOTE_F             20000 //частота опроса, Гц
#define REMOTE_MODEL         REMOTE_MODEL_KWORLD_TV878RF //модель пульта
#define REMOTE_CNT_MAX       65535 //макс.значение счетчика состояния
#define REMOTE_CNT_TOLERANCE 30  //допуск измерения длительности импульса, %
#define REMOTE_RELEASE_DELAY 200 //задержка отпускания кнопки, мс

//функция чтения выхода приемника (пример для STM32)
U8 remote_scan(void) {
        return *BITP(&GPIOA->IDR, 14);
}


Для приема нужно вызывать функцию remote_update() с заданной частотой REMOTE_F, и периодически проверять флаг remote.ready. Если установлен в 1 — прочитать код функцией remote_code().

Использование в программе:
//прерывание таймера (частота REMOTE_F)
void timer_interrupt(void) {
        //сканирование выхода ИК приемника
        remote_update();
        ...............................
}

//обработка кода где-то в программе
void main(void) {
    while(1) {
      .....................
      if (remote.ready) {
          //обработка кода кнопки вместе с Custom code
          switch (remote_co(remote_code())) {
              case REMOTE_CO_MENU_UP: ....; break;
              case REMOTE_CO_MENU_DOWN: ....; break;
              ........................
          }
      }
    }
}


Пример определения параметров пульта (Samsung):
#if REMOTE_MODEL == REMOTE_MODEL_SAMSUNG_AA59_00382A
	#define REMOTE_PROTOCOL         REMOTE_PROTOCOL_NEC //протокол
	#define REMOTE_BITS             32                  //количество бит в посылке
	#define REMOTE_CUSTOM_CODE      0xE0E00000UL //Custom code для протокола NEC
	#define	REMOTE_PULSE_LEADER_ON  4500 //длительность стартового импульса, мкс
	#define	REMOTE_PULSE_LEADER_OFF 4500 //длительность паузы после старт.импульса, мкс
	//определения кодов кнопок (без Custom code) - код + его инверсия
	enum remote_code {
		REMOTE_CO_0=0x8877,      REMOTE_CO_1=0x20DF,
//...........................................................................
		REMOTE_CO_NONE = 0
	};
#endif


Параметры протокола (для NEC):
#if REMOTE_PROTOCOL == REMOTE_PROTOCOL_NEC
	#define REMOTE_BITS             32 //бит в посылке
	#define	REMOTE_PULSE_LEADER_ON  9000 //старт.импульс, мкс
	#define	REMOTE_PULSE_LEADER_OFF 4500 //пауза после старт.импульса, мкс
	#define REMOTE_PULSE_BIT_ON     562 //длит.импульса в бите данных, мкс
	#define REMOTE_PULSE_BIT_0      562 //длит.паузы 0го бита, мкс
	#define REMOTE_PULSE_BIT_1      1688 //длит.паузы 1го бита, мкс
#endif


P.S. Добавлен протокол RC5 и несколько новых пультов.
  • +8
  • 17 ноября 2012, 23:03
  • reptile
  • 1
Файлы в топике: ul_remotex.zip

Комментарии (14)

RSS свернуть / развернуть
еще один uni
НУ КТО МЕШАЕТ НАПИСАТЬ ЕЩЕ ЧУТЬ ПОДРОБНЕЕ??!!!

ты еще видушку мычательную сними…

и да. линк на себя забыл.
-1
У этого хотя бы библиотечка вполне понятного (из поста) назначения, а не сэмпл неясно чего.
0
ты еще видушку мычательную сними…и да. линк на себя забыл.
вы меня с кем то путаете. И на ты вроде не переходили…
0
А этим ебанатам это не важно.
-1
хто-бы мычал…
+1
(после эмоций)
вы меня с кем то путаете
ну, uni-стайл прослеживается.
И на ты вроде не переходили…
в этих ваших интернетах — только на ты.
0
Всё, что надо, он написал. Что ещё?
0
Ну, например, описание того, как это реботает. Саму «справку» можно было бы оформить строже.
Ну и неплохо бы библиотечку заархивировать и приаттачить к посту.
Также не помешал бы пример использования. Не совсем ясно насчет частоты REMOTE_F — какие на нее ограничения, например. Вызывать какую-то функцию каждые 50мкс, как в примере — довольно накладно. Нельзя ли пореже? Скажем, килогерц.
Не помешает и справка о том, как обучить библиотеку новому пульту. Сейчас там всего 4 пульта.

Ну и по коду — я бы предложил вынести определения пультов в отдельный хедер. Возможно даже по хедеру на пульт. Весьма пользительна была бы также генерилка пультоинклюда из описаний пультов проекта LIRC.
0
Не совсем ясно насчет частоты REMOTE_F — какие на нее ограничения, например
исходя из мин.длительности импульса 500..600мкс. Минимум примерно 8..10кГц. На AVR работало на 10 и 20кГц без проблем. Сейчас на STM32F100/24МГц на 24кГц тоже работает параллельно с 3-канальным DDS-генератором.
Не помешает и справка о том, как обучить библиотеку новому пульту
см.определение макросов #if REMOTE_MODEL == REMOTE_MODEL_SONY_RM887 и т.д. Вообще протокол NEC наверно перекрывает 80% всех ДУ пультов.
0
см.определение макросов #if REMOTE_MODEL == REMOTE_MODEL_SONY_RM887 и т.д. Вообще протокол NEC наверно перекрывает 80% всех ДУ пультов.
Это слишком кратко. В таком объеме я информацию и из сорца получить могу. Это желательно в пост в виде туториала.
0
И да — в жопу имагехостинги, есть же кнопка «загрузить картинку».
+2
  • avatar
  • Vga
  • 18 ноября 2012, 14:46
RC5/6 пока не видел
может, как оно и логично, техника philips? (ну даже не може, а точно знаю что у них рц5)
0
  • avatar
  • xar
  • 18 ноября 2012, 15:50
логично. На днях возьму какой-нибудь пультик с RC5, добавлю.
0
добавил RC5
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.