IR remote library: отрицательные значения
- Войдите на сайт для отправки комментариев
пользуясь http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html сварганил простейший механизм перехвата посылок пульта с целью дальнейшей отсылки.
Используя пульт муз. центра (не декодировался), получил вот что:
FEAC02E5
Unknown encoding: FEAC02E5 (32 bits)
Raw (6): -7300 400 -1350 10000 -350 500
FEAC02E5
Unknown encoding: FEAC02E5 (32 bits)
Raw (6): -7300 500 -600 10950 -100 550
FEAC02E5
Unknown encoding: FEAC02E5 (32 bits)
Raw (6): -7250 450 -600 10750 -350 550
Вопросы:
1. Я верно понимаю, что различия в значениях обусловлены естественными помехами, и техника расчитана на это (если все верно, то любая из этих посылок включит аппарат)
2. Я верно понимаю, что первое число - пауза перед коммандой и ее не нужно передавать?
3. Некторые числа отрицательные, а массив типа unsigned int такие обрабатывает неверно. Как быть, что делать? Прикладываю код отправки.
#include <IRremote.h> IRsend irsend; int LED_PIN = 3; unsigned int data[6]={-7300, 500, -600, 10950, -350, 550};; void setup() { Serial.begin(9600); } void loop() { { for (int i = 0; i < 3; i++) { irsend.sendRaw(data, 6, 32); for (int j=0;j<6;j++) { Serial.print(data[j]); Serial.print(" "); } Serial.println(); delay(40); } } }
4. Побочный вопрос: я нигде в коде не нашел, где ообзначается пин на котором висит передающий светодиод. Повесил его на третий, как советуют, но мне так неудобно.
Да, светодиод рабочий, моргает (проверял через камеру телефона, она ловит ИК). Передачу нарочно включил на постоянку, но муз.центр не реагирует.
Буду благодарен за любую помощь.
Сейчас не помню, а компа нет под рукой, но отрицательные значения получаются, если выводить так:
sprintf(buf,"%d",value);
нужно делать так:
sprintf(but,"%u",value);
Посмотрите исходники, возможно там ошибка.
Да, это возможно даже если value описана как unsigned.
1. Можно сказать и так.
2. Raw (6): -7300 500 -600 10950 -100 550 - это не команда, а интервалы времени и они нужны все. FEAC02E5 - это команда.
3. Просто уберите минусы.
4. * An IR LED must be connected to Arduino PWM pin 3. если подредактировать библиотеку, то можно перенести на другой PWM вывод.
Это сделано для того, что бы было видно какой интервал времени принадлежит логической единице, какой логичекому нулю.
Странно, но HEX значения - это похоже не команда, у меня ардуино такое выдает на любую кнопку любого пульта. Пульты разные: кондиционер, выключатель света, ТВ-тюнер, муз.центр.
Ну не ардуино же сбоит... Есть идеи?
Спасибо.
Не прав, бес попутал. Это я про свои грабли написал :) У меня так получилось с выводом отрицательных значений. Сори
Вопросы:
1. Я верно понимаю, что различия в значениях обусловлены естественными помехами, и техника расчитана на это (если все верно, то любая из этих посылок включит аппарат)
Почти, только скорее не "помехи", а просто "не точности". Пульт же не имеет атомных часов что-бы "ну совсем все точно слать". Поэтому обычно, скажем "логическая единица это XXXX миллисекунд плюс/минус допустимая пограшено YYYY милисекунд".
Если вы обратите внимание в "какой код" оно декодилось, то увидите что это не "разные команды", а одинаковые FEAC02E5
2. Я верно понимаю, что первое число - пауза перед коммандой и ее не нужно передавать?
Э.. трудно сразу сказать не вникая как там он захватывает. Но с большой долей вероятности это не "пауза", а "стартовый импульс". Что-то типа "внимание счас данные пойдут". В таком случае его нужно передавать.
3. Некторые числа отрицательные, а массив типа unsigned int такие обрабатывает неверно. Как быть, что делать? Прикладываю код отправки.
А вот это неверно. Нет там отрицательных. Если бы вы посмотрели на код скетча который выводит этот массив, то увидили бы такое:
То есть, в самом массиве и внутри библиотеки никаких отрицательных значений - нет. Этот минус добавляется при выводе в сериал. Просто что-бы глазами было легче отличать четные и нечетный импульсы. Если вы этот код замените на
То "отрицалово" у вас исчезнет.
4. Побочный вопрос: я нигде в коде не нашел, где ообзначается пин на котором висит передающий светодиод. Повесил его на третий, как советуют, но мне так неудобно.
Ну как же, вот он конфигурится на выход:
А вот, он "дергается посылаются импульсы":
Но, вот тут мы видим что его "дергание", происходит не digitalWrite, а через использвоание таймеров и pwm. Так что перенести "на произвольную ногу" - не выйдет никак. Таймеры жестко-аппаратно привязаны к конкретным ногам. Максимум - перенести на другой таймер. Но "гиморой еще тот". И если-бы это было "по зубам", то скорее всего и вопроса бы этого небыло :)
Если же "очень хочется", то чуть ниже по коду, в комментах автор дал ссылку на свою статью, где объясняется эта "таймеро-магия"
http://arcfn.com/2009/07/secrets-of-arduino-pwm.html
Спасибо, с этим все понятно. Колдую комманды, которые по традиции ни в дугу не работают)
Спасибо, с этим все понятно. Колдую комманды, которые по традиции ни в дугу не работают)
А зачем? Не проще начать с примера идущего с библиотекой? IRrecord.pde - запоминает команду, отсылает команду.
Вчера весь день пытался с dump - выдавало такую вот хрень. Не понимаю, то ли датчик не контачил, то ли еще чего - но посылки длиной в 6 меня напрягли. IRRecord чуть переписал (чтоб без кнопки) - и он сразу начал выдавать посылки длиной 50, 100, 200 (максимум у кондиционера - 242).
И все заработало. Попробую понять, как эта нечисть передает температуру, и будет мне счастье... летом). Для этого буду смотреть различия в посылках. Кстати, вопрос, я верно понимаю что пауза 300 и пауза 350 это по сути одно и то же (просто команды очень похожи, различаются во многих местах на +-50, а еще в 2-3 местах где-то на 1000 и я хочу понять, может ли кондиционер использовать столь малые различия (+-50) для кодирования. Или же мне (слава богу) достаточно отслеживать достаточно большие.
Еще раз спасибо всем за помощь, за кодом или чем - обращайтесь, если потребуется.
И все заработало. Попробую понять, как эта нечисть передает температуру, и будет мне счастье... летом). Для этого буду смотреть различия в посылках. Кстати, вопрос, я верно понимаю что пауза 300 и пауза 350 это по сути одно и то же (просто команды очень похожи, различаются во многих местах на +-50, а еще в 2-3 местах где-то на 1000 и я хочу понять, может ли кондиционер использовать столь малые различия (+-50) для кодирования. Или же мне (слава богу) достаточно отслеживать достаточно большие.
Смотрите. Там идет что-то типа 500ms это "ноль", 1500ms - это "единица". Но так как точности измерений/посылок у нас нет, то сравнивают не "точные цифры", а допускают "поправку на ветер".
То есть 500ms плюс/минус, скажем 150ms - будем считать нулем. А от 1200 до 2000 - единицей.
Так что и 300 и 350 - это одно и тоже. Просто "погрешность измерений".
Если вы посмотрите в библиотеку, то увидите подстроечный параметр
Это и есть какой процент отклонений все равно "засчитывать" как "совпало". То есть, если у нас для NEC протокола тайминги определены как
То "нулем" у нас декодируется и все от 420 до 700 (560+-25%)
Спасибо, расшифровал. Очень интересная система комманд))
И нашел-таки устройство, которое мне не поддалось: выключатель с удаленным управлением. Поэтому генерю вопрос: можно ли как-то понять его частоту без спец. оборудования? (осциллографа нет), если есть возможность разобрать пульт (на первый взгляд там обычный ИК диод стоит) и чуть меньше возможность разобрать сам выключатель.
То, что дело в частоте я понял из того, что иногда эта хрень срабатывает (я написал программу, которая работает "перебором" частот), но постоянно на разных частотах (обычно где-то около 70-80).
Спрашиваю на случай, вдруг кто-от сталкивался...
Привет, Всем. Пытаюсь получить dump для кондея samsung.
В библтотеке IRremote подкручивал RAWBUF, передает только 0 бит и FFFFFFF. Уже везде пересмотрел,перепробывал разные dumpы.
Подскажите, что надо поправить и где?