IRSend Китайский ТВ не принимает RAW

GIKrepair
Offline
Зарегистрирован: 17.05.2017

Проблема в том что я считал коды с пульта через ИК и даже разбирал пульт подключался к диоду и через 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);    
  }
}

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GIKrepair пишет:

Это уже с убраными минусами. 

Что значит "с убранными минусами"? Можно с этого места поподробнее?

GIKrepair
Offline
Зарегистрирован: 17.05.2017

Библиотекой IRReomte когда считываешь дамп там числа с минусами и плюсами. и в комментах написано убрать знаки.

Скачал IRLib2. код считывается чуть дополненный но тоже ноль эмоций

 

GIKrepair
Offline
Зарегистрирован: 17.05.2017

Итак формат NEC6122. У кого ни будь есть описание?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GIKrepair пишет:

Библиотекой IRReomte когда считываешь дамп там числа с минусами и плюсами. и в комментах написано убрать знаки.

Я вот не знаю, о каких комментах Вы говорите, но что-то сильно подозреваю, что убирать знаки там нужно (если нужно) не тупо, а через дополнение. Вы не могли бы дать ссылку на библиотеку, я бы посмотрел что там за знаки и что за комменты.

GIKrepair
Offline
Зарегистрирован: 17.05.2017

библиотека: 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 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Хорошо, я завтра посмотрю.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GIKrepair пишет:

Библиотекой IRReomte когда считываешь дамп там числа с минусами и плюсами. и в комментах написано убрать знаки.

Так где написано что убрать знаки? В каком файле, а лучше со строкой.

GIKrepair
Offline
Зарегистрирован: 17.05.2017

Что то я тоже найти не могу. Но я пробовал по всякому. Просто убирать числа с минусами, и пробовал убирать знаки. Я не пойму что не так делаю. Протестировал считывание с самсунга. Данные RAW считал но передача их опять же кривая. Телек не включился. А если взять RAW коды из интернета то телек включается. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GIKrepair пишет:

Просто убирать числа с минусами, и пробовал убирать знаки. Я не пойму что не так делаю. 

Есть ощущение что их вообще убирать не надо. Передвайте как есть. Пробовали?

И ещё, покажите скетч, которым Вы эти числа читаете. Примером Dump или как-то меняли его. Если меняли ъоть запятую, выкладывайте.

GIKrepair
Offline
Зарегистрирован: 17.05.2017

Примером дам читал. Ещё считал цифровым осциллографом данные с пульта и данные после моего приемника. Только вот в начале пакета есть непрерывный сигнал с частотой 38 кГц длительностью 9000 мс а скетч его не учитывает. Привез осцмиллограф домой. буду сравнивать сигналы которые выдет пульт с сигналами которые выдает ардуино. И да.. Все пишут что первые пакеты длительностью более 4500 мс надо удалять. А вот в кодах которые работают на самсунге эти пакеты есть.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Взьмите пример и найдите там вот такие строки

  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();

Попробуйте то, что получилось загнать телевизору.

На первый взгляд это именно то, что Вы получили (без обработки). Попробуйте.

 

GIKrepair
Offline
Зарегистрирован: 17.05.2017

Спасибо! Попробую уже завтра. Осциллограммы выложить?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мне бы лучше полную выдачу дампа и Ваш скетч с которым пробовать будете

GIKrepair
Offline
Зарегистрирован: 17.05.2017

Так не прокатит.. сильно маленькие числа получаются

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

именно их Вы и получаете с пульта. Уж какие есть.

GIKrepair
Offline
Зарегистрирован: 17.05.2017

Вот что я получаю с пульта. Как раз таки большие числа. Я нашел косяк в алгоритме. В цикле идет перебор данных умноженных на микросекунды. Так вот перебор идет не с нуля. А для 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/

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, как хотите. Моя идея была - аккуратно выписать в точности то, что реально пришло из эфира безо всякой обработки. И именно это передать телевизору. Вы же упорно пытаетесь передать ему уже предварительно обработанные данные.

GIKrepair
Offline
Зарегистрирован: 17.05.2017

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

GIKrepair
Offline
Зарегистрирован: 17.05.2017

Проблема решена. Телек принял код. Беда была в том что в скетче - примере "...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};

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

С Победой!

GIKrepair
Offline
Зарегистрирован: 17.05.2017

Спасибо