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 мс надо удалять. А вот в кодах которые работают на самсунге эти пакеты есть.
Взьмите пример и найдите там вот такие строки
Ваши минусы просто печатаются в строке 81. Выбросьте это, а заодно и умножение на количество мсек в тике и вместо пробела, печатайте запятую. Т.е. примерно так
Попробуйте то, что получилось загнать телевизору.
На первый взгляд это именно то, что Вы получили (без обработки). Попробуйте.
Спасибо! Попробую уже завтра. Осциллограммы выложить?
Мне бы лучше полную выдачу дампа и Ваш скетч с которым пробовать будете
Так не прокатит.. сильно маленькие числа получаются
именно их Вы и получаете с пульта. Уж какие есть.
Вот что я получаю с пульта. Как раз таки большие числа. Я нашел косяк в алгоритме. В цикле идет перебор данных умноженных на микросекунды. Так вот перебор идет не с нуля. А для NEC формата надо! передавать несущую часоту, которая лежит в 0 индексе массива результатов, а последний индекс читать не надо, так как они идет для повтора команды в случае удержания кнопки пульта.
Таким образом правильный код будет выглядеть вот так:
http://www.picshare.ru/view/8098410/
http://www.picshare.ru/view/8098411/
Ну, как хотите. Моя идея была - аккуратно выписать в точности то, что реально пришло из эфира безо всякой обработки. И именно это передать телевизору. Вы же упорно пытаетесь передать ему уже предварительно обработанные данные.
Дело в том что предварительно обработанные данные в точности повторяют те временные интервалы, которые передает пульт. Проверенно на осциллографе. Фото приводил. А если отправлять без обработки то сигнал уменьшается во много раз, примерно в тысячу. И даже с моим самсунгом не работает. А вот списанные с осциллографа данные с пульта от самсунга совпали с теми, что в сети и удачно приняты телеком (самсунг) к слову если не передавть пакет с несущей частотой то весь пакет инвертируется.
Проблема решена. Телек принял код. Беда была в том что в скетче - примере "...Dump" ошибка. Цикл переберает результат дампа с первого элемента массива и по длинну массива. А нужно с нулевого и по -1 от длинны массива. В нулевом элементе хранится пакет для синхронизации несущей частоты. Он обязателен для формата NEC и если он будет короче или длинне то ничего не выйдет. А его отсутствие делает инверсию всей посылки. За пакетом синхронизации идет пакет установки логического нуля. И того мой код выглядит так:
С Победой!
Спасибо