IR remote library: отрицательные значения

jakob291
Offline
Зарегистрирован: 06.01.2013

пользуясь 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. Побочный вопрос: я нигде в коде не нашел, где ообзначается пин на котором висит передающий светодиод. Повесил его на третий, как советуют, но мне так неудобно.

Да, светодиод рабочий, моргает (проверял через камеру телефона, она ловит ИК). Передачу нарочно включил на постоянку, но муз.центр не реагирует.

Буду благодарен за любую помощь.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Сейчас не помню, а компа нет под рукой, но отрицательные значения получаются, если выводить так:
sprintf(buf,"%d",value);
нужно делать так:
sprintf(but,"%u",value);
Посмотрите исходники, возможно там ошибка.
Да, это возможно даже если value описана как unsigned.

maksim
Offline
Зарегистрирован: 12.02.2012

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 вывод.

maksim
Offline
Зарегистрирован: 12.02.2012

kisoft пишет:
Сейчас не помню, а компа нет под рукой, но отрицательные значения получаются, если выводить так: sprintf(buf,"%d",value); нужно делать так: sprintf(but,"%u",value); Посмотрите исходники, возможно там ошибка. Да, это возможно даже если value описана как unsigned.
Отрывок кода из скейтча, которым ТС получил эти значения:

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }

Это сделано для того, что бы было видно какой интервал времени принадлежит логической единице, какой логичекому нулю.

jakob291
Offline
Зарегистрирован: 06.01.2013

Странно, но HEX значения - это похоже не команда, у меня ардуино такое выдает на любую кнопку любого пульта. Пульты разные: кондиционер, выключатель света, ТВ-тюнер, муз.центр.

Ну не ардуино же сбоит... Есть идеи?

Спасибо.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Не прав, бес попутал. Это я про свои грабли написал :) У меня так получилось с выводом отрицательных значений. Сори

leshak
Offline
Зарегистрирован: 29.09.2011

jakob291 пишет:

Вопросы:

1. Я верно понимаю, что различия в значениях обусловлены естественными помехами, и техника расчитана на это (если все верно, то любая из этих посылок включит аппарат)

Почти, только скорее не "помехи", а просто "не точности". Пульт же не имеет атомных часов что-бы "ну совсем все точно слать". Поэтому обычно, скажем "логическая единица это XXXX миллисекунд плюс/минус допустимая пограшено YYYY милисекунд".

Если вы обратите внимание в "какой код" оно декодилось, то увидите что это не "разные команды", а одинаковые FEAC02E5 

jakob291 пишет:

2. Я верно понимаю, что первое число - пауза перед коммандой и ее не нужно передавать?

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

jakob291 пишет:

3. Некторые числа отрицательные, а массив типа unsigned int такие обрабатывает неверно. Как быть, что делать? Прикладываю код отправки.

А вот это неверно. Нет там отрицательных. Если бы вы посмотрели на код скетча который выводит этот массив, то увидили бы такое:

 for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println(""); 

То есть, в самом массиве и внутри библиотеки никаких отрицательных значений - нет. Этот минус добавляется при выводе в сериал. Просто что-бы глазами было легче отличать четные и нечетный импульсы. Если вы этот код замените на

 for (int i = 0; i < count; i++) {
  Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
  }
  Serial.println(""); 

То "отрицалово" у вас исчезнет.

jakob291 пишет:

4. Побочный вопрос: я нигде в коде не нашел, где ообзначается пин на котором висит передающий светодиод. Повесил его на третий, как советуют, но мне так неудобно.

Ну как же, вот он конфигурится на выход:

  pinMode(3, OUTPUT);
  digitalWrite(3, LOW); // When not sending PWM, we want it low

А вот, он "дергается посылаются импульсы":

void IRsend::mark(int time) {
  // Sends an IR mark for the specified number of microseconds.
  // The mark output is modulated at the PWM frequency.
  TCCR2A |= _BV(COM2B1); // Enable pin 3 PWM output
  delayMicroseconds(time);
}

/* Leave pin off for time (given in microseconds) */
void IRsend::space(int time) {
  // Sends an IR space for the specified number of microseconds.
  // A space is no output, so the PWM output is disabled.
  TCCR2A &= ~(_BV(COM2B1)); // Disable pin 3 PWM output
  delayMicroseconds(time);
}

Но, вот тут мы видим что его "дергание", происходит не digitalWrite, а через использвоание таймеров и pwm. Так что перенести "на произвольную ногу" - не выйдет никак. Таймеры жестко-аппаратно привязаны к конкретным ногам. Максимум - перенести на другой таймер. Но "гиморой еще тот". И если-бы это было "по зубам", то скорее всего и вопроса бы этого небыло :)

Если же "очень хочется", то чуть ниже по коду, в комментах автор дал ссылку на свою статью, где объясняется эта "таймеро-магия"

http://arcfn.com/2009/07/secrets-of-arduino-pwm.html

jakob291
Offline
Зарегистрирован: 06.01.2013

Спасибо, с этим все понятно. Колдую комманды, которые по традиции ни в дугу не работают)

leshak
Offline
Зарегистрирован: 29.09.2011

jakob291 пишет:

Спасибо, с этим все понятно. Колдую комманды, которые по традиции ни в дугу не работают)

А зачем? Не проще начать с примера идущего с библиотекой? IRrecord.pde - запоминает команду, отсылает команду.

jakob291
Offline
Зарегистрирован: 06.01.2013

Вчера весь день пытался с dump - выдавало такую вот хрень. Не понимаю, то ли датчик не контачил, то ли еще чего - но посылки длиной в 6 меня напрягли. IRRecord чуть переписал (чтоб без кнопки) - и он сразу начал выдавать посылки длиной 50, 100, 200 (максимум у кондиционера - 242).

И все заработало. Попробую понять, как эта нечисть передает температуру, и будет мне счастье... летом). Для этого буду смотреть различия в посылках. Кстати, вопрос, я верно понимаю что пауза 300 и пауза 350 это по сути одно и то же (просто команды очень похожи, различаются во многих местах на +-50, а еще в 2-3 местах где-то на 1000 и я хочу понять, может ли кондиционер использовать столь малые различия (+-50) для кодирования. Или же мне (слава богу) достаточно отслеживать достаточно большие.

Еще раз спасибо всем за помощь, за кодом или чем - обращайтесь, если потребуется.

leshak
Offline
Зарегистрирован: 29.09.2011

jakob291 пишет:

И все заработало. Попробую понять, как эта нечисть передает температуру, и будет мне счастье... летом). Для этого буду смотреть различия в посылках. Кстати, вопрос, я верно понимаю что пауза 300 и пауза 350 это по сути одно и то же (просто команды очень похожи, различаются во многих местах на +-50, а еще в 2-3 местах где-то на 1000 и я хочу понять, может ли кондиционер использовать столь малые различия (+-50) для кодирования. Или же мне (слава богу) достаточно отслеживать достаточно большие.

Смотрите. Там идет что-то типа 500ms это "ноль", 1500ms - это "единица". Но так как точности измерений/посылок у нас нет, то сравнивают не "точные цифры", а допускают "поправку на ветер".

То есть 500ms плюс/минус, скажем 150ms - будем считать нулем. А от 1200 до 2000 - единицей.

Так что и 300 и 350 - это одно и тоже. Просто "погрешность измерений".

Если вы посмотрите в библиотеку, то увидите подстроечный параметр

#define TOLERANCE 25  // percent tolerance in measurements

Это и есть какой процент отклонений все равно "засчитывать" как "совпало". То есть, если у нас для NEC протокола тайминги определены как

#define NEC_ONE_SPACE	1600
#define NEC_ZERO_SPACE	560

То "нулем" у нас декодируется и все от 420 до 700 (560+-25%)

jakob291
Offline
Зарегистрирован: 06.01.2013

Спасибо, расшифровал. Очень интересная система комманд))

И нашел-таки устройство, которое мне не поддалось: выключатель с удаленным управлением. Поэтому генерю вопрос: можно ли как-то понять его частоту без спец. оборудования? (осциллографа нет), если есть возможность разобрать пульт (на первый взгляд там обычный ИК диод стоит) и чуть меньше возможность разобрать сам выключатель.

То, что дело в частоте я понял из того, что иногда эта хрень срабатывает (я написал программу, которая работает "перебором" частот), но постоянно на разных частотах (обычно где-то около 70-80).

Спрашиваю на случай, вдруг кто-от сталкивался...

 

Shir
Offline
Зарегистрирован: 21.02.2014

Привет, Всем. Пытаюсь получить dump для кондея samsung.

 В библтотеке IRremote подкручивал RAWBUF, передает только 0 бит и FFFFFFF. Уже везде пересмотрел,перепробывал разные dumpы.

Подскажите, что надо поправить и где?