Как отправить немодулированный ИК-сигнал по кабелю?
Мне нужно сгенерировать сигнал EN (расширенный) NEC. Я подключил Arduino к устройству отображения через ИК-кабель.
Arduino --> ИК-кабель --> ИК-вход устройства отображения
ИК-кабель:
Одна вилка отрезана и 3 провода подсоединены к ардуино.
Arduino должен генерировать сигналы NEC, а дисплей должен реагировать на них. По сути, Arduino действует как проводной пульт дистанционного управления.
Проблема в том, что существует множество руководств, показывающих, как это сделать с помощью датчика (например, с помощью этой библиотеки). Но ни в одном уроке не сказано, как это сделать с помощью кабеля.
Я обнаружил, что все мои предыдущие попытки не увенчались успехом, потому что я пытался сгенерировать модулированный NEC-сигнал на дисплей. Однако дисплей этого не понимает, поскольку нет устройства, демодулирующего сигнал. Обычно это делает ИК-датчик, которого в данном случае нет.
например Вот как выглядит модулированный сигнал NEC:
00 4e ff 61
Библиотека генерирует модульный сигнал (пачки импульсов), и именно так она работает для ИК-датчиков.
Но как мне послать ИК-команду, чтобы дисплей ее понял? Как отправить немодулированный ИК-сигнал?
Проблему демонстрирует следующий рисунок:
У меня нет ИК-светодиодного передатчика, усилителя, ограничителя, полосового фильтра, демодулятора, интегратора, компаратора.... Я просто хочу создать зеленый выходной сигнал непосредственно с моего Arduino
@Michael B, 👍3
Обсуждение2 ответа
Лучший ответ:
В инфракрасном сигнале есть два основных компонента. Один из них — это высокочастотный сигнал несущей волны, который включает и выключает светодиод. Эта частота должна соответствовать частоте приемника и используется либо с высокочастотным, либо с полосовым фильтром для фильтрации окружающего ИК-света и позволяет ему реагировать только на реальный сигнал.
Второй компонент, и, похоже, именно он вас интересует, — это импульсное включение-выключение несущей волны в разных комбинациях и с разной частотой для обозначения двоичных 0 и 1.
Не зная, что на самом деле представляет собой ваш кабель, а для получения всей необходимой информации нам понадобится таблица данных, все это лишь предположения.
Я бы предположил, что вы обеспечиваете питание и заземление на кабеле эмиттера, а третий контакт — это логический сигнал «вкл/выкл», который включает и выключает несущую частоту светодиода. Это позволило бы вам отправлять любые коды, которые вам нравятся, пока вы знаете синхронизацию сигнала.
В библиотеке, на которую вы ссылаетесь, есть все необходимые вам тайминги в файле ir_NEC.cpp. Времена определяются следующим образом:
#define NEC_BITS 32
#define NEC_HDR_MARK 9000
#define NEC_HDR_SPACE 4500
#define NEC_BIT_MARK 560
#define NEC_ONE_SPACE 1690
#define NEC_ZERO_SPACE 560
#define NEC_RPT_SPACE 2250
Фактический формат данных определяется в функции sendNEC
:
void IRsend::sendNEC (unsigned long data, int nbits)
{
// Установить несущую частоту ИК-сигнала
enableIROut(38);
// Заголовок
mark(NEC_HDR_MARK);
space(NEC_HDR_SPACE);
// Данные
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
if (data & mask) {
mark(NEC_BIT_MARK);
space(NEC_ONE_SPACE);
} else {
mark(NEC_BIT_MARK);
space(NEC_ZERO_SPACE);
}
}
// Нижний колонтитул
mark(NEC_BIT_MARK);
space(0); // Всегда заканчивать выключением светодиода
}
Функции mark
и space
требуют несколько микросекунд для выполнения ВКЛ или ВЫКЛ сигнала ШИМ. Это несколько проще для вас, так как это просто ВКЛ или ВЫКЛ цифрового контакта ввода-вывода для управления выходом кабеля эмиттера. Так что там, где у вас есть MARK, вы включаете выход, затем делаете задержку на указанное время. Для пробела вы выключаете выход и снова делаете задержку на указанное время.
Таким образом, вы можете просто повторить работу этой функции sendNEC, но с собственным управлением выводом и синхронизацией вместо использования функций в этой библиотеке.
Редактировать: Похоже, что кабелю не нужно питание — просто обеспечьте заземление и сигнальное соединение. Конечно, это предполагает, что это не просто светодиод на проводе. Если это просто светодиод на проводе, то вам нужно будет просто использовать библиотеку, на которую вы ссылаетесь, как она есть.
Вероятно, вы захотите убедиться, что уровень напряжения провода питания такой же, как у Arduino. В противном случае вам следует буферизировать сигнал., @Gerben
@Gerben Все должно быть ясно из таблицы данных, которая, похоже, не появится., @Majenko
"Так что вы можете просто повторить работу этой функции sendNEC, но с вашим собственным управлением выходом и синхронизацией в ней вместо использования функций в этой библиотеке". Это как раз то, что нужно. Я не знаю, как должен выглядеть мой собственный выход. Я не совсем понимаю разницу между "модулированными" и "немодулированными" сигналами. Так как, например, мой код 004eff61
должен быть отправлен?, @Michael B
Уровень напряжения кабеля и Arduino составляет 5 В., @Michael B
Разница между модулированным и немодулированным сигналом заключается в том, что модулированный сигнал представляет собой серию импульсов широтно-импульсной модуляции, а немодулированный — это серия импульсов постоянного напряжения 5 В., @Majenko
Мне нужно было то же самое, поэтому я создал для него библиотеку: https://github.com/dennisfrett /Arduino-Direct-NEC-передатчик.
По сути, он просто перемещает вывод вверх и вниз с правильными таймингами для протокола NEC.
- Использование VS1838B с Arduino
- Arduino Micro против Pro Micro
- Как выбрать вывод передачи в библиотеке IRremote для Arduino Uno?
- Arduino Pro Micro не распознается компьютером и не отображается в портах
- Как увеличить расстояние обнаружения на датчике обхода препятствий Arduino KY-032?
- Ошибка "collect2.exe: error: ld returned 1 exit status"
- Как подключить ИК-передатчик и модуль приемника?
- Tone() конфликтует с библиотекой IRremote (множественное определение `__vector_7')
Есть ли у этого кабеля даташит?, @Majenko
Я обновил свой пост, @Michael B