Ардуино как пульт от телевизора. Подводные камни, методы решения.

Нет ответов
mulder
Offline
Зарегистрирован: 30.01.2017

Добрый день.

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

Расскажу о текущей проблеме.

Есть на руках:

Arduino Nano

Инфракрасный приёмник

Инфракрасный светодиод.

Видеодвойка DAEWO с затёртой маркировкой.

Пульт от триколора

Пульт от DAEWO с тремя работающими кнопками.

Все пульты работают на 455 Кгц если верить их кварцам.

Наша задача. Считать код с любой кнопки

Запомнить её и послать на телевизор.

============================

Родной пульт от телевизора работает.

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

Приступаем к практике.

Решил сильно не в даваться в сторонние разработки, а придумать свой протокол.

В итоге, после долгих мучений, понял что всё это долго. И решил ограничится записью и трансляцией сигнала «как есть».

Подключили приёмник. Считали значения

Получился массив

byte z1[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

Далее, решил отправить сигнал на светодиод.

Подключил светодиод. В крутил код отправки.

void digit_blink() { //ситает массив и передаёт его на выход.

i=0;

while(i < 230){

digitalWrite(13,z1[i]);

i=i+1;

}

Уверенность такого метода (как думалось) заключена в том, что не нужно мучится с частотой отправки, так как запись данных происходит с частотой ардуино, следовательно, последовательность отправки будет на той же частоте. И телевизору будет абсолютно всё равно. Он поймёт сигнал, как будто это его родной пульт.

Опробовал. Телевизор никак не замигал.

Решил воспользоваться готовым решением.

Скачал библиотеку Irremote. И залил файл Irecord.

Нажал кнопку, записал RAW значения кнопки пульта. Отпустил кнопку. Пошёл процесс отправки. Телевизор не мигает.

Подумал. А что если телевизор требует эти килогерцы?

Посмотрел на код. Понял, что отправка была на 38 Кгц.

Пришёл к выводу что телевизор имеет какую-то свою частоту.

И сделал цикл с перебором частоты.

void loop() {

int khz = 38; // 38kHz carrier frequency for the NEC protocol

// unsigned int irSignal[] = {9000, 4500, 560, 560, 560, 560, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 39416, 9000, 2210, 560}; //AnalysIR Batch Export (IRremote) - RAW

int irSignal[] = {8000,3900, 550,450, 550,1400, 600,1400, 600,1400, 550,450, 550,1400, 600,1400, 600,1400, 550,3900, 550,450, 550,400, 600,400, 600,400, 600,400, 550,450, 550,1400, 600,1400, 600}; // UNKNOWN DFE63E22


//irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.

for (i = 0; i < 500; i = i + 1) {

int khz = i; // 38kHz carrier frequency for the NEC protocol

irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.

Serial.print(i);

Serial.println();

delay(100);

}

}

Прогнал все мыслимые частоты, не реагирует.

У меня светодиод был подключен на прямую к ардуино. Подумал. А что если светодиоду не хватает миллиамперов? И напряжения?

Подключил через оптопару. (тот-же транзистор, но без гальванической развязки). Почитал деятелей советующих повышенные питания. Дал питание 7 вольт 350 миллиампер. Светодиод замигал в камеру телефона так, как будто хотел прожечь матрицу насквозь.

Направил на телевизор — 0 эммоций.

Вопрос: И что теперь делать?