Как отправить немодулированный ИК-сигнал по кабелю?

Мне нужно сгенерировать сигнал EN (расширенный) NEC. Я подключил Arduino к устройству отображения через ИК-кабель.

Arduino --> ИК-кабель --> ИК-вход устройства отображения

ИК-кабель: Техническое описание ИК-кабеля

Одна вилка отрезана и 3 провода подсоединены к ардуино.

Arduino должен генерировать сигналы NEC, а дисплей должен реагировать на них. По сути, Arduino действует как проводной пульт дистанционного управления.

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

Я обнаружил, что все мои предыдущие попытки не увенчались успехом, потому что я пытался сгенерировать модулированный NEC-сигнал на дисплей. Однако дисплей этого не понимает, поскольку нет устройства, демодулирующего сигнал. Обычно это делает ИК-датчик, которого в данном случае нет.

например Вот как выглядит модулированный сигнал NEC:

00 4e ff 61

Библиотека генерирует модульный сигнал (пачки импульсов), и именно так она работает для ИК-датчиков.

Но как мне послать ИК-команду, чтобы дисплей ее понял? Как отправить немодулированный ИК-сигнал?

Проблему демонстрирует следующий рисунок:

IR

У меня нет ИК-светодиодного передатчика, усилителя, ограничителя, полосового фильтра, демодулятора, интегратора, компаратора.... Я просто хочу создать зеленый выходной сигнал непосредственно с моего Arduino

, 👍3

Обсуждение

Есть ли у этого кабеля даташит?, @Majenko

Я обновил свой пост, @Michael B


2 ответа


Лучший ответ:

4

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

Второй компонент, и, похоже, именно он вас интересует, — это импульсное включение-выключение несущей волны в разных комбинациях и с разной частотой для обозначения двоичных 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


1

Мне нужно было то же самое, поэтому я создал для него библиотеку: https://github.com/dennisfrett /Arduino-Direct-NEC-передатчик.

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

,