IRSend Китайский ТВ не принимает RAW
- Войдите на сайт для отправки комментариев
Ср, 17/05/2017 - 20:43
Проблема в том что я считал коды с пульта через ИК и даже разбирал пульт подключался к диоду и через PNP транзистор в режиме ключа считывал то что на него приходит. Коды совпадают. Для кнопки Power:
4400,600,500,600,550,550,550,550,550,550,550,600,500,600,1650,550,550,550,550,600,500,600,550,550,550,550,550,550,550,600, 1650,550,550,550,550,600,1600,600,550,550,1650,550,550,600,500,600,550,550,550,550,1650,600,500,600,1650,550,550,600,1600, 600,1650,550,1650,600,1650,550,46050
Это уже с убраными минусами. Этот код ни в какую не хочет считывать телек.
Свою схему я уже проверял на телекие самсунг. там всё работает. Выручайте пожалуйста уже голова пухнет.
Телевизор CENTEK.
Код программы:
#include <IRremote.h>
//Gray TV Remote LAST INDEX DELETED
unsigned int power[] = {4400,600,500,600,550,550,550,550,550,550,550,600,500,600,1650,550,550,550,550,
600,500,600,550,550,550,550,550,550,550,600,1650,550,550,550,550,600,1600,600,550,550,1650,550,550,600,
500,600,550,550,550,550,1650,600,500,600,1650,550,550,600,1600,600,1650,550,1650,600,1650,550,46050};
unsigned int menu[] = {4450,550,550,550,550,550,550,600,550,550,550,550,550,550,1650,550,550,600,550,
550,550,550,550,550,550,550,550,550,550,550,1700,550,550,550,550,550,550,550,550,550,550,600,550,
550,550,550,1650,550,550,550,1700,550,1650,550,1650,550,1650,600,1650,550,1650,550,550,550,1700,550};
unsigned int up[] = {4350,650,450,650,500,600,500,600,500,600,500,600,500,600,1650,600,500,600,500,600,500,
600,500,600,500,650,450,650,500,600,1600,600,500,600,1600,650,1600,600,500,600,1600,600,500,650,500,600,
500,600,500,600,500,600,500,600,1600,650,500,600,1600,600,1600,600,1650,600,1600,600};
unsigned int down[] = {4400,600,500,600,500,600,500,650,450,650,500,600,500,600,1600,600,500,600,500,650,500,
600,500,600,500,600,500,600,500,600,1600,650,500,600,500,600,1600,600,1600,650,1600,600,500,600,500,600,
500,600,500,650,1600,600,500,600,500,600,500,600,1600,650,1600,600,1600,600,1600,650};
unsigned int left[] = {4450,550,550,550,550,550,550,600,500,600,500,600,550,550,1650,550,550,550,550,600,500,
600,550,550,550,550,550,550,550,550,1650,600,500,600,550,550,550,550,550,550,550,550,1650,600,550,550,550,
550,550,550,1650,600,1600,600,1650,550,1650,600,500,600,1650,550,1650,550,1650,600};
unsigned int right[] = {4500,450,650,500,600,500,650,450,600,500,650,450,650,450,1750,500,650,450,650,450,
600,500,650,450,650,450,650,500,600,500,1750,450,650,450,1750,500,600,500,650,450,600,500,1750,450,650,
450,650,500,600,500,650,450,1750,450,1750,500,1750,450,600,500,1750,450,1750,500,1750,450};
unsigned int ok[] = {4350,650,450,650,500,600,500,600,500,600,500,600,500,650,1600,600,500,600,500,600,500,
600,500,600,500,650,500,600,500,600,1600,600,500,600,1600,650,500,600,1600,600,1600,650,450,650,500,600,
500,600,500,600,500,600,1600,650,500,600,500,600,1600,600,1600,650,1600,600,1600,600};
unsigned int src[] = {4400,550,550,600,500,600,500,600,500,600,550,550,550,550,1650,600,500,600,500,600,550,
550,550,550,550,550,550,600,500,600,1600,600,550,550,1650,600,500,600,500,600,500,600,550,550,550,550,
1650,600,500,600,500,600,1650,550,1650,600,1600,600,1650,550,1650,600,500,600,1600,600};
unsigned int play[] = {4350,650,450,650,500,600,500,650,450,650,450,650,450,650,1600,600,500,650,450,650,450,
650,450,650,450,650,500,600,500,600,1600,650,450,650,1550,650,1600,600,1600,650,450,650,450,650,500,600,
1600,650,450,650,450,650,450,650,450,650,1600,600,1600,650,1550,650,500,600,1600,650};
IRsend irsend;
boolean FirstRUN = 0;
void setup() {
// put your setup code here, to run once:
pinMode(3,OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(115200);
Serial.print("Hi!\n");
}
void loop() {
// put your main code here, to run repeatedly:
if (!FirstRUN) {
FirstRUN = 1;
delay(10000);
digitalWrite(13, HIGH);
Serial.print("TurnON TV\n");
irsend.sendRaw(power,68, 36);
delay(1000);
irsend.sendRaw(power,68, 32);
delay(1000);
irsend.sendRaw(power,68, 38);
delay(1000);
irsend.sendRaw(power,67, 36);
delay(1000);
irsend.sendRaw(power,67, 32);
delay(1000);
irsend.sendRaw(power,67, 38);
digitalWrite(13, LOW);
delay(10000);
digitalWrite(13, HIGH);
Serial.print("Going right\n");
irsend.sendRaw(right,67, 36);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(13, HIGH);
Serial.print("Going right\n");
irsend.sendRaw(right,67, 36);
digitalWrite(13, LOW);
delay(1000);
Serial.print("Choising\n");
irsend.sendRaw(ok,67, 36);
delay(3000);
Serial.print("Choising\n");
irsend.sendRaw(ok,67, 36);
delay(3000);
Serial.print("Start playing\n");
irsend.sendRaw(ok,67, 36);
delay(10000);
Serial.print("Programm done");
digitalWrite(13, LOW);
}
}
Это уже с убраными минусами.
Что значит "с убранными минусами"? Можно с этого места поподробнее?
Библиотекой IRReomte когда считываешь дамп там числа с минусами и плюсами. и в комментах написано убрать знаки.
Скачал IRLib2. код считывается чуть дополненный но тоже ноль эмоций
Итак формат NEC6122. У кого ни будь есть описание?
Библиотекой IRReomte когда считываешь дамп там числа с минусами и плюсами. и в комментах написано убрать знаки.
Я вот не знаю, о каких комментах Вы говорите, но что-то сильно подозреваю, что убирать знаки там нужно (если нужно) не тупо, а через дополнение. Вы не могли бы дать ссылку на библиотеку, я бы посмотрел что там за знаки и что за комменты.
библиотека: https://github.com/z3t0/Arduino-IRremote
Получается что то вроде этого:
Unknown encoding: FFFFFFFFFF (32 bits)
Raw (100): -31814 3550 -1600 550 -350 500 -1200 500 -350 550 -350 500 -350 500 -350 500 -350 500 -350 550 -350 500 -350 500 -350 500 -350 550 -300 550 -1200 500 -350 500 -350 550 -350 500 -350 500 -350 500 -350 500 -350 550 -350 500 -350 500 -1200 550 -350 500 -350 500 -350 500 -350 500 -350 550 -350 500 -350 500 -350 500 -350 550 -300 550 -350 500 -350 500 -1200 550 -350 500 -350 500 -350 500 -350 500 -350 550 -350 500 -350 500 -1200 550 -350 500 -350 500 -1200 500
Хорошо, я завтра посмотрю.
Библиотекой IRReomte когда считываешь дамп там числа с минусами и плюсами. и в комментах написано убрать знаки.
Так где написано что убрать знаки? В каком файле, а лучше со строкой.
Что то я тоже найти не могу. Но я пробовал по всякому. Просто убирать числа с минусами, и пробовал убирать знаки. Я не пойму что не так делаю. Протестировал считывание с самсунга. Данные RAW считал но передача их опять же кривая. Телек не включился. А если взять RAW коды из интернета то телек включается.
Просто убирать числа с минусами, и пробовал убирать знаки. Я не пойму что не так делаю.
Есть ощущение что их вообще убирать не надо. Передвайте как есть. Пробовали?
И ещё, покажите скетч, которым Вы эти числа читаете. Примером Dump или как-то меняли его. Если меняли ъоть запятую, выкладывайте.
Примером дам читал. Ещё считал цифровым осциллографом данные с пульта и данные после моего приемника. Только вот в начале пакета есть непрерывный сигнал с частотой 38 кГц длительностью 9000 мс а скетч его не учитывает. Привез осцмиллограф домой. буду сравнивать сигналы которые выдет пульт с сигналами которые выдает ардуино. И да.. Все пишут что первые пакеты длительностью более 4500 мс надо удалять. А вот в кодах которые работают на самсунге эти пакеты есть.
Взьмите пример и найдите там вот такие строки
for (int i = 1; i < count; i++) { if (i & 1) { Serial.print(results->rawbuf[i]*USECPERTICK, DEC); } else { Serial.write('-'); Serial.print((unsigned long) results->rawbuf[i]*USECPERTICK, DEC); } Serial.print(" "); } Serial.println();Ваши минусы просто печатаются в строке 81. Выбросьте это, а заодно и умножение на количество мсек в тике и вместо пробела, печатайте запятую. Т.е. примерно так
for (int i = 1; i < count; i++) { Serial.print(results->rawbuf[i], DEC); Serial.print(","); } Serial.println();Попробуйте то, что получилось загнать телевизору.
На первый взгляд это именно то, что Вы получили (без обработки). Попробуйте.
Спасибо! Попробую уже завтра. Осциллограммы выложить?
Мне бы лучше полную выдачу дампа и Ваш скетч с которым пробовать будете
Так не прокатит.. сильно маленькие числа получаются
именно их Вы и получаете с пульта. Уж какие есть.
Вот что я получаю с пульта. Как раз таки большие числа. Я нашел косяк в алгоритме. В цикле идет перебор данных умноженных на микросекунды. Так вот перебор идет не с нуля. А для NEC формата надо! передавать несущую часоту, которая лежит в 0 индексе массива результатов, а последний индекс читать не надо, так как они идет для повтора команды в случае удержания кнопки пульта.
Таким образом правильный код будет выглядеть вот так:
for (int i = 0; i < count-1; i++) { Serial.print(results->rawbuf[i]*USECPERTICK, DEC); Serial.print(","); } Serial.println();http://www.picshare.ru/view/8098410/
http://www.picshare.ru/view/8098411/
Ну, как хотите. Моя идея была - аккуратно выписать в точности то, что реально пришло из эфира безо всякой обработки. И именно это передать телевизору. Вы же упорно пытаетесь передать ему уже предварительно обработанные данные.
Дело в том что предварительно обработанные данные в точности повторяют те временные интервалы, которые передает пульт. Проверенно на осциллографе. Фото приводил. А если отправлять без обработки то сигнал уменьшается во много раз, примерно в тысячу. И даже с моим самсунгом не работает. А вот списанные с осциллографа данные с пульта от самсунга совпали с теми, что в сети и удачно приняты телеком (самсунг) к слову если не передавть пакет с несущей частотой то весь пакет инвертируется.
Проблема решена. Телек принял код. Беда была в том что в скетче - примере "...Dump" ошибка. Цикл переберает результат дампа с первого элемента массива и по длинну массива. А нужно с нулевого и по -1 от длинны массива. В нулевом элементе хранится пакет для синхронизации несущей частоты. Он обязателен для формата NEC и если он будет короче или длинне то ничего не выйдет. А его отсутствие делает инверсию всей посылки. За пакетом синхронизации идет пакет установки логического нуля. И того мой код выглядит так:
unsigned int power[] = {9000,4400,600,500,600,550,550,550,550,550,550,550,600,500,600,1650,550,550,550,550, 600,500,600,550,550,550,550,550,550,550,600,1650,550,550,550,550,600,1600,600,550,550,1650,550,550,600, 500,600,550,550,550,550,1650,600,500,600,1650,550,550,600,1600,600,1650,550,1650,600,1650,550};С Победой!
Спасибо