STM32 - ИК-пульт
Описание библиотеки для считывания, декодирования и последующей отправки инфракрасных сигналов от различных бытовых пультов, с помощью микроконтроллера
Библиотека использует один таймер, и для приёма, и для отправки сигнала. Приёмник подключается к любому пину (GPIO_Input), а передатчик к одному из каналов таймера работающего в режиме PWM Generation (ШИМ). В примере используется первый канал таймера №4 — PB6 (передатчик) и пин PB5 (приёмник).
Для приёма IR-сигнала таймер работает в режиме прерывания — каждые 50 мкс проверяет состояние входного пина, то есть работает по принципу сэмплирования входящего сигнала.
При передаче, таймер переключается в режим PWM Generation, посылает сигнал, и снова переходит в режим прерывания.
Настройки находятся в файле IRremote.h
extern TIM_HandleTypeDef htim4;
// настройка таймера для приема - переполнение каждые 50 мкс (в данном случае системная частота 72Мгц)
#define MYPRESCALER 71 // получаем частоту 1МГц
#define MYPERIOD 49 // 50 мкс
// настройка таймера для отправки - указать системную частоту таймера
#define MYSYSCLOCK 72000000
// настройка пина для приёма recive_IR
#define RECIV_PIN (HAL_GPIO_ReadPin(recive_IR_GPIO_Port, recive_IR_Pin))
Если будете настраивать другой таймер, то нужно указать соответствующее имя структуры —
Всё остальное программа настроит сама. Если выбрать другой номер канала, то его тоже нужно переименовать в файле irSend.с.
С остальными настройками думаю всё ясно — исходя из системной частоты (в примере 72МГц) подставляются значения предделителя и переполнения для прерывания каждые 50 мкс. Далее указывается частота и чтение пина.
Ниже есть дефайны, которые определяют задействованные протоколы…
//////////////////////////////////// активированные протоколы ////////////////////////////////////////
#define DECODE_RC5 1 // чтоб отключить декодирование протокола RC5 нужно указать 0
#define SEND_RC5 1 // чтоб отключить отправку сигнала по протоколу RC5 нужно указать 0
#define DECODE_RC6 1
#define SEND_RC6 1
...
Отключение ненужных протоколов уменьшает размер программы. В принципе можно вообще выпилить функции неиспользуемых протоколов и соответствующие файлы (файлы имеют характерные имена).
Программа предельно простая, функция
Других пультов у меня нет.
Для отправки раскодированного сигнала используется функция с соответствующим названием…
sendSAMSUNG(0x707048b7, 32);
my_enableIRIn();
Функция
Если не удаётся определить тип протокола…
… то в этом нет ничего страшного, код кнопки в любом случае получен.
Если нужно не только принимать неизвестный сигнал, но и отправлять его, тогда нужно раскомментировать строчки для «вывода данных в сыром виде»…
… и отправлять прочитанные данные с помощью функции
uint8_t khz = 38; // частоту указать экспериментальным путём, основные используемые от 36 до 40 кГц
unsigned int raw_signal[] = {1300, 400, 1300, 400, 450, 1200, 1300, 400, 1300, 400, 450, 1200, 500, 1200, 450, 1250, 450, 1200, 500, 1200, 450, 1250, 1300};
sendRaw(raw_signal, sizeof(raw_signal) / sizeof(raw_signal[0]), khz);
my_enableIRIn(); // переинициализирование приёма (нужна обязательно)
У меня отправка в «сыром виде» работает плохо. Вернее отправка то работает нормально, но вот телик эти команды принимает через раз.
Библиотека
И ещё одна библиотека, из которой выпилено всё (для уменьшения размера) кроме приёма кода кнопки.
На этом всё.
Всем спасибо
Телеграм-чат istarik
Телеграм-чат STM32
- 0
- stD
14827
Поддержать автора
Комментарии (0)