Ардуино как пульт от телевизора. Подводные камни, методы решения.
- Войдите на сайт для отправки комментариев
Добрый день.
Каждый кто когда либо встречался с программированием ардуино в качаестве пульта для телевизора должен был уткнуться в непреодолимую стену препятствий. Например я в неё уже тыкаюсь вторую неделю и никак не могу перепрыгнуть, а другие, кто тоже тыкался бросили эту затею и не пытаются. Думаю тут можно выкладывать разные хитрости.
Расскажу о текущей проблеме.
Есть на руках:
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 эммоций.
Вопрос: И что теперь делать?