Проблема с ИК

ustas
Offline
Зарегистрирован: 12.03.2012

Для одного моего проекта нужно управлять кондиционером (midea mse-12sr) через ИК. Управление организуется с помощью ардуино.

Использую библиотеку отсюда: http://www.arcfn.com/2009/09/arduino-universal-remote-record-and.html

У библиотеки есть отличный пример - IRrecord: record and play back IR signals as a minimal

Пример делает все просто - сначала нажимаем кнопку на оригинальном пульте - ардуино захватывает этот сигнал, если может - дешифрует, если не может - записывает "как есть" (RAW). Далее нажатие на кнопку, подключенную к соответствующему выводу, приводит к тому, что ИК-диод начинает моргать соответствующей командой (дешифрованной или "как получилось").

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

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

Засада именно с кондеем (а ведь именно его надо заставить включаться). Команда захватывается ("RAW" - у кондеев сложная система команд - в одной команде передается сразу все - "включить", "температура", "положение заслонок", "режим работы" и т.п.). Но вот кондей не управляется командой с ардуино.

Сначала подумалось, что есть ограничение на длину "посылки" и я ее нашел в коде IRremote.h (она была установлена в 76):

#define RAWBUF 200 //76 // Length of raw duration buffer

 Поправил эту переменную (установил в 200) - и оказалось, что пульт кондея дает команду "длинной" ровно 100. 

Убедился, что 100 - именно "длинна" всей команды ПДУ кондея (убедился просто - стал обучать ардуино разным пультам и на одном из них ардуина сказала, что длинна команды 136).

 

Но легче не стало - кондей все равно не отзывается :(

Может, кто-то уже решал эту проблему и нашел решение? Любые идеи? Как заставить кондей включиться?

 

Evgen
Evgen аватар
Offline
Зарегистрирован: 10.06.2011

На вскидку, скорее всего, несущая частота не совпадает. Ардуина, при использовании IRRemote, передает сигнал на несущей 36-40 КГц, а у пульта ду кондея может быть другая частота (скорее всего выше). Если знания позволяют, надо покопаться в библиотеке IRRemote и попробовать выставить другую несущую частоту.

ustas
Offline
Зарегистрирован: 12.03.2012

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

Evgen
Evgen аватар
Offline
Зарегистрирован: 10.06.2011

Инфа с википедии:

Модуляция

Обычно в пультах используется одна частота модуляции несущей (то есть частоты излучения ИК-светодиода) — на неё настроен и пульт и приёмник. Частоты модуляции обычно стандартны — это 36 кГц, 38 кГц, 40 кГц (Panasonic, Sony). Редкими считаются частоты 56 кГц (Sharp). Фирма Bang & Olufsen использует 455 кГц, что является большой редкостью. Использование приёмника с частотой модуляции, не точно совпадающего с частотой передатчика, не означает что он не будет принимать — приём останется, но его чувствительность может очень сильно упасть.

Передача сигнала осуществляется излучением ИК-светодиода с соответствующей частотой модуляции. Для частот от 30 до 50 кГц обычно используются светодиоды с длиной волны 950 нм, а для 455 кГц — специальные светодиоды с длиной волны 870 нм (на эту длину волны и высокую частоту модуляции ориентированы специализированные приёмники TSOP5700 и TSOP7000).

ustas
Offline
Зарегистрирован: 12.03.2012

Частота модуляции приемника/передачика у кондея, скорее всего, стандартная (или близка) - внешне приемник выглядит как самый обычный - вот так:

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

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

Может, кто-то может повторить мой опыт со своим кодеем (думаю, там принцип почти везде одинаковый)?

Скетч могу выложить, если нужно... хотя это файл из примера IRrecord, который есть в библиотеке.

Никак у меня не "взлетает". И как проверить тоже пока не представляю.

Пульт от кондея могу разобрать... только вот что это может дать?

ustas
Offline
Зарегистрирован: 12.03.2012

Еще одну штуку проверил.. есть у меня универсальный пульт Logitech One - так вот я его учил командам пульта кондея (успешно). 

Попробовал скетчем IRrecord захватить команды не только от оригинального пульта, но и от универсального - вижу в Serial Monitor практически идентичные данные от обоих пультов.

и, имхо, еще один довод, что используется "стандартный" ИК - то, что logitech One нормально обучился командам пульта... но вот как на ардуине правильно записать и воспроизвести команду? :(

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

 в стандартной поставке IRRemote идет пример скетч IRReciveDump (Точно не помню, но Dump в названии  точно есть).

Он все что удалось "понять/расшифровать" кидает в сериал. В том числе и RAW данные (длины импульсов).

Вообщем смотрите что-же принимает ва IR. Одно и тоже или нет. На одноу и туже кнопку, ну а там чухать голову "в чем отличае" между нормальными пультами и кодеевским. Искать даташиты на этот пульт. Штудировать http://www.lirc.org/, искать конфигурации для этого пульта...

Можно еще попробовать "финт ушами" (с точки зрения логики смысла нет, но ...). Обучить Logitech кондеевским командам, и дать их ардуине... может она его поймет лучше чем оригинальный пульт.

ustas
Offline
Зарегистрирован: 12.03.2012

финт ушами пройден - одниково плохо ардуина берет (сканирует хорошо (по крайней мере изображает, что сканирует), но вот воспроизведение ни к чему не приводит).

видимо, надо финт ушами усложнить:

1. захватить команду ардуиной от оригинального пульта

2. отправить эту команду на универсальный пульт (чтобы он ее запомнил)

3. захватить только что обученную команду от универсального пульта

4. сравнить результаты п.1 и п.2

Сегодня попробую... но, сдается мне, что получу одинаковые вещи (в рамках погрешности), собака где-то в другом месте порылась.. но вот как понять где?

step962
Offline
Зарегистрирован: 23.05.2011

ustas пишет:

финт ушами пройден - одниково плохо ардуина берет (сканирует хорошо (по крайней мере изображает, что сканирует), но вот воспроизведение ни к чему не приводит).

Почему вы думаете, что "изображает, что сканирует"?

Ведь красиво изобразить можно, даже не сканируя.

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

Цитата:

Сегодня попробую... но, сдается мне, что получу одинаковые вещи (в рамках погрешности), собака где-то в другом месте порылась.. но вот как понять где?

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

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

Цитата:

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

ну или самый жесткий вариант: открыть кондиционер. Найти его IR датчик, подключится к нему. И снять какие импульсы от ловит когда вы шлете ему ардиуино, и какие логитехом (или родным пультом). И посмотреть "в чем отличаются". Заодно и маркировку датчика выяснить.

ustas
Offline
Зарегистрирован: 12.03.2012

 Попробовал вытащить блок с ИК-приемником из кондея для более детального изучения - не получилось (побоялся вырвать его с корнем, а где и как сзади него отключается кабель - не смог понять :(

Поэтому пока только фото:

При тестах все светофильтры, естественно, убраны. Пока результатов нет.

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

ustas
Offline
Зарегистрирован: 12.03.2012

Эксперимент провел. 

Результаты (данные из програмы IRrecord):

 Оригинал (работает)     m4350 s4400 m550 s1650 m500 s600 m500 s1650 m550 s1650 m500 s550 m550 s550 m550 s1650 m500 s600 m500 s550 m550 s1650 m550 s550 m500 s600 m500 s1650 m550 s1650 m500 s600 m500 s1650 m550 s550 m550 s550 m500 s600 m500 s1650 m550 s1650 m500 s1600 m600 s1650 m500 s1650 m550 s1650 m500 s1650 m550 s1650 m500 s600 m500 s600 m500 s550 m550 s550 m550 s550 m550 s550 m500 s1650 m550 s550 m550 s550 m550 s1650 m500 s600 m500 s550 m550 s550 m550 s1650 m500 s600 m500 s1650 m550 s1650 m500 s550 m550 s1650 m550 s1650 m600 s1550 m550
 Обучаемый (работает)    m4200 s4550 m500 s1650 m550 s550 m500 s1700 m450 s1700 m550 s550 m450 s650 m450 s1750 m400 s650 m450 s650 m450 s1750 m450 s650 m400 s650 m450 s1750 m450 s1750 m450 s650 m400 s1750 m450 s650 m450 s650 m400 s700 m400 s1750 m400 s1800 m450 s1700 m450 s1750 m450 s1700 m550 s1650 m450 s1750 m400 s1750 m400 s700 m400 s700 m450 s650 m450 s650 m500 s600 m500 s550 m450 s1750 m450 s650 m450 s650 m400 s1750 m450 s650 m400 s700 m500 s600 m450 s1750 m500 s550 m500 s1700 m450 s1700 m450 s650 m550 s1650 m400 s1750 m450 s1750 m450
 Обучаемый (не работает) m4400 s4600 m450 s1750 m450 s650 m500 s1750 m450 s1800 m450 s650 m500 s650 m450 s1700 m500 s650 m500 s650 m450 s1750 m450 s650 m450 s600 m450 s1750 m450 s1800 m450 s600 m450 s1750 m500 s650 m450 s700 m450 s600 m500 s1700 m450 s1700 m500 s1750 m450 s1700 m500 s1700 m450 s1750 m450 s1700 m500 s1750 m450 s650 m500 s600 m450 s650 m450 s700 m450 s650 m450 s700 m450 s1700 m450 s700 m450 s700 m400 s1800 m450 s600 m500 s600 m450 s700 m500 s1700 m400 s700 m450 s1700 m450 s1750 m450 s650 m500 s1700 m450 s1750 m450 s1700 m500

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

Может, кто-то увидит, в чем разница?

P.S. к адруине подключал разные ИК-светодиоды, подсовывал их к блоку кондея на расстояние 3 метра, 1 метр, 10 см, 5 см - результат везде один :(

ustas
Offline
Зарегистрирован: 12.03.2012

Рискнул и все-таки смог снять блок с ИК-приемником с кондея.

Маркировки на приемнике не оказалось. Решил пойти дальше - выпаял приемник из кондея, подключил к адруино и сканировал данные оригинального пульта. Получил то же самое:

m4300 s4450 m500 s1700 m450 s600 m500 s1700 m500 s1700 m450 s600 m500 s600 m500 s1700 m450 s650 m500 s550 m450 s1750 m450 s650 m450 s650 m450 s1700 m500 s1700 m450 s600 m500 s1700 m500 s600 m450 s1700 m450 s1750 m450 s1700 m500 s1700 m450 s650 m450 s1700 m500 s1700 m500 s1650 m500 s600 m450 s650 m450 s650 m450 s650 m450 s1700 m500 s600 m450 s650 m450 s1700 m500 s1700 m450 s1700 m500 s600 m450 s650 m450 s650 m450 s650 m450 s600 m500 s600 m450 s650 m500 s600 m450 s1750 m450 s1700 m500 s1650 m500 s1700 m450 s1700 m550

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

В случае с командами от Ардуино - посто полный игнор (никаких звуков и действий).

Есть еще какие-то идеи? в чем может быть проблема? где еще подкрутить? что крутить надо?

Evgen
Evgen аватар
Offline
Зарегистрирован: 10.06.2011

В замен выпаянного ИК-датчика впаять другой такой-же с частотой модуляции 36-38 Кгц. Например TSOP1736 или TSOP1738. Может прокатит.

ustas
Offline
Зарегистрирован: 12.03.2012

неа.. не прокатывает :( работают одинаково... где-то в другом месте собака зарыта

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

 

ustas пишет:

выпаял приемник из кондея, подключил к адруино и сканировал данные оригинального пульта.

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

Тут скорее интерестно "что этот приемник" принимает когда данные ему шлет ардуина (и принимает-ти что-то вообще). В идеале нужно "две дуины". Одна "шлет", другая принимает с помощью "кондишного датчика".  Возможно получится и одной ардуиной "сколхозить", когда она одновеременно и посылает и записывает, но "не уверен". В целях экономии вторую "ардуину" можно сколхозить из ATMEGA8 + кварц + два кондера.

ustas пишет:

В случае с командами от Ардуино - посто полный игнор (никаких звуков и действий).

не совсем понятно. "кто игнорирует-то"? куда вы слали команды от ардуино? на реальный кондишн или на датчик кондишина подключенный к ардуине? (тогде какие звуки и действия ожидались).

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

 

ustas пишет:

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

Ну что вы правили в скетче - неизвестно. Так как самого скетча нет.
В библиотеке за установку частоты отвечает функция enableIROut(ЧАСТОТА). Вызывается она с помощью функции sendRaw(..) - третий параметр - частота.

Но в комментах к enableIROut написанно, что она "заточена" под частоты  36-40KHz, другие значение "на собственный страх и риск".

Так что для других диапазонов, нужно будет разбиратся как она реализована, выкуривать даташиты по поводу тонкного тюнинга PWM, править ее и т.п.  Поищите, на прошлой неделе, ветку про перенос кода на Attiny, там step962 совместно с топик стартером раскуривали мануалы, режимом PWM и проч.

ustas
Offline
Зарегистрирован: 12.03.2012

 для начала исправлюсь (хотя про то, какой код, мне казалось, дал точное описание):

/*
 * IRrecord: record and play back IR signals as a minimal 
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * An IR LED must be connected to the output PWM pin 3.
 * A button must be connected to the input BUTTON_PIN; this is the
 * send button.
 * A visible LED can be connected to STATUS_PIN to provide status.
 *
 * The logic is:
 * If the button is pressed, send the IR code.
 * If an IR code is received, record it.
 *
 * Version 0.11 September, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;
int BUTTON_PIN = 12;
int STATUS_PIN = 10;

IRrecv irrecv(RECV_PIN);
IRsend irsend;

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(BUTTON_PIN, INPUT);
  pinMode(STATUS_PIN, OUTPUT);
}

// Storage for the recorded code
int codeType = -1; // The type of code
unsigned long codeValue; // The code value if not raw
unsigned int rawCodes[RAWBUF]; // The durations if raw
int codeLen; // The length of the code
int toggle = 0; // The RC5/6 toggle state

// Stores the code for later playback
// Most of this code is just logging
void storeCode(decode_results *results) {
  codeType = results->decode_type;
  int count = results->rawlen;
  if (codeType == UNKNOWN) {
    Serial.println("Received unknown code, saving as raw");
    codeLen = results->rawlen - 1;
    // To store raw codes:
    // Drop first value (gap)
    // Convert from ticks to microseconds
    // Tweak marks shorter, and spaces longer to cancel out IR receiver distortion
    for (int i = 1; i <= codeLen; i++) {
      if (i % 2) {
        // Mark
        rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;
        Serial.print(" m");
      } 
      else {
        // Space
        rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS;
        Serial.print(" s");
      }
      Serial.print(rawCodes[i - 1], DEC);
    }
    Serial.println("");
  }
  else {
    if (codeType == NEC) {
      Serial.print("Received NEC: ");
      if (results->value == REPEAT) {
        // Don't record a NEC repeat value as that's useless.
        Serial.println("repeat; ignoring.");
        return;
      }
    } 
    else if (codeType == SONY) {
      Serial.print("Received SONY: ");
    } 
    else if (codeType == RC5) {
      Serial.print("Received RC5: ");
    } 
    else if (codeType == RC6) {
      Serial.print("Received RC6: ");
    } 
    else {
      Serial.print("Unexpected codeType ");
      Serial.print(codeType, DEC);
      Serial.println("");
    }
    Serial.println(results->value, HEX);
    codeValue = results->value;
    codeLen = results->bits;
  }
}

void sendCode(int repeat) {
  if (codeType == NEC) {
    if (repeat) {
      irsend.sendNEC(REPEAT, codeLen);
      Serial.println("Sent NEC repeat");
    } 
    else {
      irsend.sendNEC(codeValue, codeLen);
      Serial.print("Sent NEC ");
      Serial.println(codeValue, HEX);
    }
  } 
  else if (codeType == SONY) {
    irsend.sendSony(codeValue, codeLen);
    Serial.print("Sent Sony ");
    Serial.println(codeValue, HEX);
  } 
  else if (codeType == RC5 || codeType == RC6) {
    if (!repeat) {
      // Flip the toggle bit for a new button press
      toggle = 1 - toggle;
    }
    // Put the toggle bit into the code to send
    codeValue = codeValue & ~(1 << (codeLen - 1));
    codeValue = codeValue | (toggle << (codeLen - 1));
    if (codeType == RC5) {
      Serial.print("Sent RC5 ");
      Serial.println(codeValue, HEX);
      irsend.sendRC5(codeValue, codeLen);
    } 
    else {
      irsend.sendRC6(codeValue, codeLen);
      Serial.print("Sent RC6 ");
      Serial.println(codeValue, HEX);
    }
  } 
  else if (codeType == UNKNOWN /* i.e. raw */) {
    // Assume 38 KHz
    irsend.sendRaw(rawCodes, codeLen, 38);
    Serial.println("Sent raw");
  }
}

int lastButtonState;

void loop() {
  // If button pressed, send the code.
  int buttonState = digitalRead(BUTTON_PIN);
  if (lastButtonState == HIGH && buttonState == LOW) {
    Serial.println("Released");
    irrecv.enableIRIn(); // Re-enable receiver
  }

  if (buttonState) {
    Serial.println("Pressed, sending");
    digitalWrite(STATUS_PIN, HIGH);
    sendCode(lastButtonState == buttonState);
    digitalWrite(STATUS_PIN, LOW);
    delay(50); // Wait a bit between retransmissions
  } 
  else if (irrecv.decode(&results)) {
    digitalWrite(STATUS_PIN, HIGH);
    storeCode(&results);
    irrecv.resume(); // resume receiver
    digitalWrite(STATUS_PIN, LOW);
  }
  lastButtonState = buttonState;
}

по поводу "подкручивания" - крутил файл IRremote.h из соответствующей библиотеки. Там в конце файла есть вот такие строчки:

// Some useful constants

#define USECPERTICK 50  // microseconds per clock interrupt tick
#define RAWBUF 200 //76 // Length of raw duration buffer

// Marks tend to be 100us too long, and spaces 100us too short
// when received due to sensor lag.
#define MARK_EXCESS 100 //100

Подкручивал второе определение, команда от пульта не влазила в предназначенную ей длину (длина команды пульта от моего кондея - ровно 100). Остальные параметры пытался менять (в небольших примерах, но не увидел разницы (или не знал, куда смотреть)).

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

 > для начала исправлюсь (хотя про то, какой код, мне казалось, дал точное описание):

Описание != Код.

Во первых описание это часто "вы думаете он это делает", а код может делать другое :) Во вторых во описании трудно сослатся на строчку.

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

Иначе это "кручение в слепую", не зная что принимает датчик.

То что вы подкрутили размер буффера - архиверно. Но это "кручение", которое предпологалось автором библиотеки как "возможное".

Второе место где он дал возможность "подстроится" это строчка 138 вашего кода "irsend.sendRaw(rawCodes, codeLen, 38);

Вот этот третий параметр "38" и есть частота. Его можно менять от 36-ти до 40-ка. По задумке автора. Если вы выходите за этот диапазон, то "автор ничего не гарантирует". Возможно(!) в этом случае потребуется исправлять реализацию функции enableIROut(...) из библиотеки. Плотно брать в руки даташит, разбиратся что она делает сейчас (осознать каждую строчку), и что тут можно поменять что-бы по другому несущая формировалась.

Естественно этот irsend.sendRaw(rawCodes, codeLen, 38) нужно крутить если используется именно он. Если "распознать протокол", библиотека не смогла и обзывает его Unknown. Если же она приняла его за Sony,Nec и т.п., но из скетча частотой рулить не получится. Для них частоты зашиты в библиотеке (впрочем там их не трудно найти/поменять). Или поменять скетч, что-бы он принудительно, в любом случае слал команды как RAW.

Но еще раз, это все имеет смысл только если вы подключили датчик к ардуине и видите, что "ОТ АРДУИНЫ" он не принимает правильно тики. "Не видит их" или "ловит мусор". Когда точно известно что проблема в связке "IR-диод ардуины <-> приемник кондишина".

ustas
Offline
Зарегистрирован: 12.03.2012

leshak пишет:

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

Иначе это "кручение в слепую", не зная что принимает датчик.

Да, это я сделал. Выпаял ИК-приемника с платы кондея. Данные, которые получает ардуино через него от оригинального пульта - такие же, как и с моего первого ИК-приемника (TSOP меньшего размера и с другой распиновкой).

leshak пишет:

То что вы подкрутили размер буффера - архиверно. Но это "кручение", которое предпологалось автором библиотеки как "возможное".


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

leshak пишет:

Второе место где он дал возможность "подстроится" это строчка 138 вашего кода "irsend.sendRaw(rawCodes, codeLen, 38);

Вот этот третий параметр "38" и есть частота. Его можно менять от 36-ти до 40-ка. По задумке автора. Если вы выходите за этот диапазон, то "автор ничего не гарантирует". Возможно(!) в этом случае потребуется исправлять реализацию функции enableIROut(...) из библиотеки. Плотно брать в руки даташит, разбиратся что она делает сейчас (осознать каждую строчку), и что тут можно поменять что-бы по другому несущая формировалась.

Естественно этот irsend.sendRaw(rawCodes, codeLen, 38) нужно крутить если используется именно он. Если "распознать протокол", библиотека не смогла и обзывает его Unknown. Если же она приняла его за Sony,Nec и т.п., но из скетча частотой рулить не получится. Для них частоты зашиты в библиотеке (впрочем там их не трудно найти/поменять). Или поменять скетч, что-бы он принудительно, в любом случае слал команды как RAW.


Параметр "38" крутил. Брал "крайние" значения (36 и 40) - измененй никаких :(

Протокол "распознать" скетчу не удается - обзывается именно Unknown (для кондея) и скетч для него посылает именно как RAW.

При этом скетч точно работает - захватывает команды от A/V-ресивера (ресивер Yamaha, протокол NEC) и управляет им, так же работает и вариант Unknown (RAW) - команды для медиаплеера Dune замечательно принимаются и управляют плеером. 

Команды захватывались как "тестовым" ИК-приемником, так и ИК-приемником из кондея (никакой разницы - все другие устройства замечательно реагируют на захваченные команды.).

leshak пишет:

Но еще раз, это все имеет смысл только если вы подключили датчик к ардуине и видите, что "ОТ АРДУИНЫ" он не принимает правильно тики. "Не видит их" или "ловит мусор". Когда точно известно что проблема в связке "IR-диод ардуины <-> приемник кондишина".

Проблема все-таки в чем-то другом. "Тики" от пульта кондея мы получаем, но то-ли не все, то-ли неверно. И это ТОЛЬКО для команд кондея (с остальным оборудованием все "пучком" - все работает). 

Куда все-таки копать-то?

 

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

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

>Брал "крайние" значения (36 и 40) - измененй никаких

А как вы это узнали? В чем вы ожидали изменения?

 >Команды захватывались как "тестовым" ИК-приемником, так и ИК-приемником из кондея

Так а кто шлет-то команды? Вариант "ардуина шлет", а мы СМОТРИМ что именно ловит пульт кондея был? Все ваши примеры были когда вы смотрели что ловит датчик кодея когда шлют пульты.

Третий раз: Есть возможность сделать АРДУИНА шлет -> датчик от кондея -> АРУДИНА записывает?

а не "ардуина->обучаемый пульт->датчик от кодея ->ардуина", как вы делали.

По крайней мерез из ваших слов я понял, что вы ниразу не проверили как же датчик кондея видит ардуину.

>"Тики" от пульта кондея мы получаем, но то-ли не все, то-ли неверно

А проверить "оригинальный пульт" -> записать в арудину -> обучаемый пульт -> настоящий кондей.

Если эта связка "проходит" - значит ардуина все видит нормально.

 

nwnw
Offline
Зарегистрирован: 14.04.2012

абсолютно с такой же проблемой (тот же кондер) вожусь уже третий день, автор отпиши что таки получилось ли что-нить сделать?

пробывал ардуино_1 посылать эти сигналы, а ардуино_2 их принимать - все шлется/принимается отлично, видимо либо ардуино не считывает весь пакет от пульта, обрезая часть, либо .......

ну не верю я, что приемник у кондера так уж критично относится к длиннам сигналов, или что там частота какая-то мега-редкая используется...

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

ustas
Offline
Зарегистрирован: 12.03.2012

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

Осциллограф что-нибудь показал интересное?

nwnw
Offline
Зарегистрирован: 14.04.2012

я записал сигнал от пульта звуковухой

немного не та картина, что показывает ардуина 

согласно звуковухе сигнал повторяется два раза через 4,500 мс

вот wav`ка - еще не ковырял ее

сейчас курю вот это вот там сказано как принять сигнал на звуковуху или КОМ порт

nwnw
Offline
Зарегистрирован: 14.04.2012

ура, товарищи! заработало!

полный сигнал состоит из 100 пиков/падений и повторяется два раза

вот такой массив я передал функции irsend.sendRaw(ppp,200,38);

это код кнопки включения кондера на максимум

unsigned int ppp[200] = {4400, 4400, 550, 1600, 550, 600, 500, 1600, 550, 1650, 500, 600, 550, 600, 500, 1600, 550, 550, 550, 550, 550, 1600, 550, 600, 500, 600, 500, 1650, 550, 1600, 550, 600, 500, 1600, 550, 600, 500, 600, 500, 1600, 550, 1600, 550, 1650, 500, 1650, 550, 1600, 550, 1600, 550, 1600, 550, 1600, 550, 550, 550, 600, 500, 600, 500, 600, 500, 600, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 1600, 550, 1600, 550, 1650, 500, 1650, 550, 1600, 550, 1600, 550, 1600, 550, 1600, 550, 4400, 4400, 4400, 550, 1600, 550, 600, 500, 1600, 550, 1650, 500, 600, 550, 600, 500, 1600, 550, 550, 550, 550, 550, 1600, 550, 600, 500, 600, 500, 1650, 550, 1600, 550, 600, 500, 1600, 550, 600, 500, 600, 500, 1600, 550, 1600, 550, 1650, 500, 1650, 550, 1600, 550, 1600, 550, 1600, 550, 1600, 550, 550, 550, 600, 500, 600, 500, 600, 500, 600, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 1600, 550, 1600, 550, 1650, 500, 1650, 550, 1600, 550, 1600, 550, 1600, 550, 1600, 550};

 

ustas пишет:

Убедился, что 100 - именно "длинна" всей команды ПДУ кондея (убедился просто - стал обучать ардуино разным пультам и на одном из них ардуина сказала, что длинна команды 136).


 

а вот почему-то длина сигнала 200, со 100 не работает....

ustas
Offline
Зарегистрирован: 12.03.2012

 А скетчик уже есть рабочий, который позволяет захватить команду с ПДУ кондея и по нажатию кнопки ее воспроизвести и чтобы сработало?

nwnw
Offline
Зарегистрирован: 14.04.2012

ustas пишет:

 А скетчик уже есть рабочий, который позволяет захватить команду с ПДУ кондея и по нажатию кнопки ее воспроизвести и чтобы сработало?

ну стандартным скетчом IRrecord захватить команду в 100 байт, и затем два раза продублировать ее, только так...

хз уж почему ардуино никаким скетчом не хочет все 200 байт принимать, мы ведь размер буфера увеличиваем define`ом до 250

 

ustas
Offline
Зарегистрирован: 12.03.2012

 догадка...

если там именно повторение (полное), может, стандартный скетч его как раз и отлавливает? И обрабатывает как "повторение", не догадываясь, что в нашем случае, две длинные команды друг за другом - норма?

nwnw
Offline
Зарегистрирован: 14.04.2012

ну это в любом случае нужно курить сырцы - только там все ответы

вот в irrecv.decode(&results) происходит интерпретация результатов, вот там собака и порылась имхо

вечером прокурю эту функцию

Casper
Offline
Зарегистрирован: 02.10.2012

Помогите решить траблу.

есть IR сернсор, есть библиотека IRremote.h

Все работает как часы.

Но стоит в программе упомянуть tone(), как получаем

core.a(Tone.cpp.o): In function `__vector_7':
D:\arduino-1.0.1\hardware\arduino\cores\arduino/Tone.cpp:523: multiple definition of `__vector_7'
IRremote\IRremote.cpp.o:D:\arduino-1.0.1\libraries\IRremote/IRremote.cpp:311: first defined here

На лицо конфликт с таймерами.

Пробовал менять - один черт конфликт. Что делать?

Ругань на эту функцию

ISR(TIMER2_COMPA_vect) в tone.cpp

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

IRRemote может работать только на прерывании 2. Tone по умолчанию тоже использует таймер 2, но это можно изменить в файле hardware\arduino\cores\arduino\Tone.cpp

Там в начале есть дефайны, допустимые значения заремарены. Можно переключить на таймер 1.

Casper
Offline
Зарегистрирован: 02.10.2012

Оно потом ни на чем не скажется? А то что-нить еще перестанет работать...

Casper
Offline
Зарегистрирован: 02.10.2012

Может подскажите на какой именно?

Просмотрел файл - не нашел заремареных таймеров. Они все расставлены в зависимости от используемого железа.

Пробовал ручками поменять - не работает. Подскажите на какой конкретно сажать? Их там первых как грязи

Casper
Offline
Зарегистрирован: 02.10.2012

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

Не понравился мне звук на первом и нулевом таймере. Хриплый какой-то.

Альтернативы родному "tone" есть?

Или еще вариант какой-нить с ИК. На стороннем чипе может быть, с передачей по i2w или как он там называется...

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Альтернатива... заюзать ШИМ, но  частоту не всякую выставишь... Заюзать таймер напрямую... тут глубоко в программирование можно уйти. Поискать другую либу для IR или попробовать пересадить ее на таймер 1.

Хотя для получения хорошего звука нужен конечно внешний синтезатор. Сразу припоминается музыкальный сопроцессор в Сенклере AY-8912

Вот, наткнулся на кучу синтезаторов от Ямахи

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

Вижу аналогию. Копаюсь с неизвестным ик датчиком и пультом от Sharp. Пульт посылает 3 ! Кода. Похоже с кондеем тоже самое, шлет два кода. Увеличением длины буфера это не лечится. Когда сделаю с Шарпом, могу поделиться информацией. Хотя, судя по датам, проблема уже решена.

ustas
Offline
Зарегистрирован: 12.03.2012

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

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

 

AlexFisher, AY-8912 - ага, ностальджи, баловался и этой микрухой ;)
 
ustas, ок, хочу попробовать выкинуть либу IRremote и сделать проще (light версию и только на прием). Скоро не обещаю, вечерами, выходными, но идея уже есть. Кстати, не важно, что только на чтение, если серию кодов считаем, выдать их не проблема. А я и нацелился считать именно серию кодов. Главное знать примерную длину одного кода. У меня для Шарпа - размер rawbuf получается 32 (это один код).
 
Я смотрю тут Юстас с Алексом переговариваются в открытом эфире :) Штирлиц - forever! :)
 
ustas
Offline
Зарегистрирован: 12.03.2012

Мне бы не только получение, но и воспроизведение команды ;) все не выкидывайте, если не затруднит

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

Нашел небольшое и очень краткое описание двух кондиционеров Daikin & Samsung. Во всяком случае понятно, что пульт шлет всю информацию при нажатии любой кнопки:

http://led-displays.ru/ir/daikin_irremote.html

Какую именно - это придется выяснять методом тыка, поскольку протоколов там нет.

 

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

Проанализировав ваш код из сообщения #12, можно увидеть, что это RCA http://www.sbprojects.com/knowledge/ir/rca.php.

Однако он не совсем RCA по данным, здесь нет пересылки инвертированных данных.

Например, коды из #12 сообщения декодируются в последовательность:

1011 00100100 ($B24)
1101 01111011 ($D7B)
1000 01001110 ($84E)
0000 00011111 ($01F)

Здесь первые 4 цифры - адрес, остальные 8 цифр - команда (в скобках - в HEX). Хотя, совершенно очевидно, что это совсем не RCA данные. Но нам это не очень важно.

Судя по описанию на RCA, несущая частота 56 КГц (в других протоколах обычно 38КГц и около того).

"1". Каждый MARK выдается как 28 циклов (для несущей частоты 56 КГц), что по длительности около 500 мкс, далее идет SPACE длительностью около 2 мс.

"0". Каждый MARK выдается как 28 циклов (для несущей частоты 56 КГц), что по длительности около 500 мкс, далее идет SPACE длительностью около 1 мс.

В отличии от протокола RCA, здесь одна посылка занимает 48 бит. Сколько посылок делает пульт за один раз - непонятно, нужно проверять. У меня пульта для кондера нет под рукой, потому проверить сложно.

С прогой пока не закончил, есть желание сделать максимально точное измерение, используя таймеры/счетчики. Мысль тупая, заряжаем таймер/счетчик (высокоскоростной), затем, когда данные начнутся (на первом MARK) фиксируем данные, пока не встретится пауза длительностью больше секунды (тут можно поиграть). Когда запись закончится, выплюнуть все эти данные в Serial. Тогда будет видно, сколько посылок при нажатии одной кнопки выдает пульт.

Мысли следующие:

- необходимо сканить изменения до тех пор, пока не будет большой паузы (больше секунды)

- при нажатии кнопки возможно будет несколько посылок (это можно определить по MARK в 4 мс + SPACE 4 мс)

- когда это получится, нужно сграбить все возможные варианты и проанализировать, возможно там простой протокол, либо не заморачиваться и записать коды в бинарном виде (в виде "0" и "1").

- при выводе использовать PWM на частоте 56 КГц для MARK (не знаю, возможно ли это).

ПС Кто не знает:

MARK - активный сигнал (высокий уровень), SPACE - неактивный сигнал (низкий уровень), однако поскольку в IR приемнике обычно инверсия, то на цифровом пине MARK - низкий уровень, а SPACE - высокий.  MARK - модулируется несущей частотой, здесь - 56 КГц.

 

nehidd
Offline
Зарегистрирован: 09.12.2012

Помогите, пожалуйста, разобраться с посылкой данных через sendRaw. Мне надо тоже послать сигнал кондишке, но проблема не только в этом. Все тестировал на пульте от телика, он отлично определяется как NEC и через sendNEC сигналы уходят четко и без проблем. А вот, если считать данные через пример DUMP и потом послать их уже как Raw, то реации вообще никакой. Может, кто сталкивался с этим и как-то решил проблему?

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

Для кондиционера попробуйте третий параметр, 56 (56 КГц), возможно поможет. Но 0 элемент массива не используйте.

 

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

Поскольку в соседней теме nehidd проблему решил, можно пойти по его пути, см. http://arduino.ru/forum/apparatnye-voprosy/nuzhna-pomoshch-po-radiomodulyu-i-ik-peredatchiku#comment-19266

Вчера, наконец то заработал пример из "Arduino Cookbook" - классная книга, всем рекомендую. На английском, но примеров море на всякие разные темы/датчики/драйверы и т.п. А потому я получил более точные значения MARK & SPACE путем захвата таймером, т.е. расчет длительности на аппаратном уровне. Т.о. можно сделать скетч для "исследовательских" целей, т.е. нажимая на разные кнопки пульта кондиционера, получить разницу в кодах/битах. Думаю в выходные будет готово, конечно же результатами поделюсь, может быть проще сделать библиотеку. Попробую взять с работы пульт для кондея и на нем всё это отработать.

С выводом кодов на IR светодиод пока сложнее, хотя я IR светодиод нашел (выпаял из ненужного китайского пультика, правда не знаю его данные, но это не важно, они примерно все одинаковые по параметрам), посмотрим, если получится, то и это сделаю, в общем как попрёт :)

ustas
Offline
Зарегистрирован: 12.03.2012

kisoft, добили свой скетч/библиотеку? поделитесь?

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

К сожалению нет, видимо дело затянется. У меня сейчас мой Леонардо перестал коннектиться к компу, я пока что пинбоард изучаю, ассемблер смотрю на атмеге16. Стм32 очень понравился, это как раз то, что мне нужно. Задачу не забросил, но пока другие дела.
Идея такая, захват таймером, в прерывании расчет разницы времени между прерываниями, без сброса таймера, это важно. А с распознавалкой протокола пока не определился. Попробовал свой вариант - не понравился. В общем это пока варится в голове.

Dima85
Offline
Зарегистрирован: 07.01.2013

Помогите пожалуйста и мне

Использую так же http://www.righto.com/2009/09/arduino-universal-remote-record-and.html

Задача включить и выключить музыкальный центр.

Без особых сложностей получил код включения, выключения:

C7F
Decoded RC5: C7F (12 bits)
Raw (26): -27468 900 -850 900 -850 900 -850 1750 -800 950 -850 900 -1700 950 -800 900 -850 900 -850 900 -850 900 -850 900 -850 900
44C
Decoded RC5: 44C (12 bits)
Raw (20): -21190 900 -850 1800 -1700 1800 -800 900 -850 900 -1750 1750 -850 900 -1700 950 -800 1800 -850 900

Далее загрузил вот такой код:

#include <IRremote.h>
IRsend irsend;
void setup(){
Serial.begin(9600);
}
void loop() {
if (Serial.read() != -1) {
for (int i = 0; i < 3; i++) {

irsend.sendRC5(0xC7F, 12);
delay(40);
}
}
}

Так же пробовал такой вариант:

#include <IRremote.h>
IRsend irsend;
void setup(){
}

void loop() {
irsend.sendRC5(0xC7F, 12);
delay(40);
}

 

К сожалению все безуспешно. Подключено все так:

Что я делаю не так? Arduino от музыкального центра в 30 сантиметрах.

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

Для начала прочитайте прикрепленную ветку

Вставка программного кода в тему/комментарий

Потом обратите внимание на сообщение #42, попробуйте с ним поигратся.

Убедитесь что у вас светик рабочий (некоторые мобилки, особенно старые, при фотографирировании вполне нормально видят инфакрасные диоды).

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

Dima85
Offline
Зарегистрирован: 07.01.2013

Да, я умею вставлять код, но к сожалению в Opera которой я пользуюсь ваш WYSIWYG себя безобразно ведет. Очень сложно редактировать текст я уже не говорю о вставление кода.

 

По поводу #42 сообщения, не совсем понял о чем речь.

Вы предлогаете в моем коде 0xC7F заменить на 56xC7F, или 12 заменить на 56?

я так же нашел и разобрал еще 1 пульт, пробовал подключить тот светик, безуспешно. Может я просто не так что-то подсоеденяю?

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

Вы получили код, значит у Вас есть чем получить, теперь попробуйте подать код "на себя". Как уже посоветовали.
Можно всё на одном Arduino, поскольку прием по прерываниям. В качестве примера в библиотеке IRRemote есть пример IRrecord, в нем есть как приём, так и передача кода.

Сейчас посмотрел, не знал. Если для приемника разрешить индикацию, светодиод на PIN13 будет моргать при приеме кода. Разрешить можно так: recv.blink13(TRUE); Хотя Вам это неинтересно, у Вас прием работает.

Удачи!

UPD: На счет подключения, полярность светика и сопротивление (сколько, кстати), вроде тут наковырять сложно. Тем более схема есть в приведенной Вами ссылке.

UPD2: если есть осцилл, я бы глянул сигнал на выходе. Или логический анализатор. Дабы понять, есть ли что то вообще на выходе.

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

Dima85 пишет:

Да, я умею вставлять код, но к сожалению в Opera которой я пользуюсь ваш WYSIWYG себя безобразно ведет. Очень сложно редактировать текст я уже не говорю о вставление кода.

Дабы не разводить флейм тут - ответил в отвлеченных темах ответил

Опера глючит

Dima85 пишет:

По поводу #42 сообщения, не совсем понял о чем речь.

Вы предлогаете в моем коде 0xC7F заменить на 56xC7F, или 12 заменить на 56?

нет. можно попытатся послыть через sendRaw. У нее есть третий параметр, "на какой частоте слать". Вот там можно поподбирать 36,38,40б42,54,56 и т.п. Если так заработает, то потом можно полезть в библиотеку и подхачить дефолтное значение для sendDEC  (по дефолту там 36 используется).

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

Dima85 пишет:

я так же нашел и разобрал еще 1 пульт, пробовал подключить тот светик, безуспешно. Может я просто не так что-то подсоеденяю?

Может. Но телепаты в отпуске.

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

Можете еще без декодирования поигратся. Попробуйте sendRaw