Работа со сплитом. ИТОГ

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

Коллеги! Друзья!
Перелопатил не один форум, посмотрел все возможные темы на форуме, но интересует один вопрос - кто-нибудь сделал управление сплитом по ИК?

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

Есть похожие темы, но суть не раскрывается:
http://arduino.ru/forum/programmirovanie/pult-du-dlya-split-sistemy-lessar
http://arduino.ru/forum/programmirovanie/nado-otpravit-ir-signal-s-arduino

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

AKa пишет:

Коллеги! Друзья!
Перелопатил не один форум, посмотрел все возможные темы на форуме, но интересует один вопрос - кто-нибудь сделал управление сплитом по ИК?

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

Есть похожие темы, но суть не раскрывается:
http://arduino.ru/forum/programmirovanie/pult-du-dlya-split-sistemy-lessar
http://arduino.ru/forum/programmirovanie/nado-otpravit-ir-signal-s-arduino

А в пульте случайно нету никаких устройств/датчиков?

Может часы, таймер или датчик температуры, нет?

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

Как на всех пультах новых сплитов есть часы, таймер. Про дачики не знаю, пойду искать манул)

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

Разные коды, возможно приёмник с другой частотой, потому и коды разные.
Как на счёт выложить несколько рав кодов, если длинные, хотя бы начало, байтов 40-50.
Только для одной и той же кнопки. И производителя сплита.

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

Производитель: LESSAR

Вот какие коды считались при нажатии пульта на включение (напомню, только включение, выключал пульт не в видимости приёмника):

     Включение 1
B24D9F60 (32 bits)
Raw (100): 4350 -4300 500 -1650 500 -550 500 -1600 500 -1600 500 -600 500 -550 500 -1600 500 -550 500 -550 500 -1650 500 -550 500 -550 550 -1550 500 -1650 550 -500 500 -1600 500 -1650 500 -550 550 -500 500 -1600 500 -1650 450 -1650 500 -1600 600 -1550 500 -550 500 -1600 500 -1600 600 -500 500 -550 500 -550 500 -550 500 -550 500 -1650 500 -1600 500 -1600 600 -500 550 -500 500 -1600 550 -500 500 -550 500 -550 500 -600 500 -550 500 -1600 500 -1650 500 -550 500 -1600 500 -1600 500

     Включение 2
B24D9F60 (32 bits)
Raw (100): 4300 -4350 500 -1650 550 -500 550 -1550 600 -1550 500 -550 550 -500 550 -1550 600 -450 600 -500 550 -1550 600 -450 600 -450 600 -1550 550 -1550 600 -450 600 -1550 550 -1550 500 -550 600 -450 600 -1550 550 -1550 550 -1550 600 -1550 550 -1550 550 -500 600 -1500 500 -1650 550 -500 600 -450 600 -450 600 -500 550 -500 550 -1550 600 -1500 600 -1550 550 -500 550 -500 600 -1500 600 -500 550 -500 550 -500 500 -550 500 -550 600 -1550 500 -1600 550 -500 600 -1500 600 -1550 550

     Включение 3
B24D9F60 (32 bits)
Raw (101): 4400 -4300 500 -1600 500 -550 600 -1550 550 -1550 600 -450 600 -450 500 -1650 550 -500 550 -500 600 -1500 600 -500 550 -500 550 -1550 600 -1500 600 -500 550 -1550 550 -1550 600 -450 500 -600 550 -1550 500 -1600 600 -1550 550 -1550 550 -1550 600 -500 550 -1550 550 -1550 600 -450 500 -600 550 -500 550 -500 550 -500 600 -1500 600 -1550 550 -1550 600 -450 600 -450 500 -1650 550 -500 550 -500 600 -450 500 -550 600 -500 550 -1550 600 -1500 600 -500 550 -1550 550 -1550 600 -5050
 

Код, которым отправлял код на сплит с Arduino (у меня есть ПК приемник, который на эту отправку срабатывает диодом):

//Отправка на сплит включение
#include <IRremote.h>
IRsend irsend;

unsigned int volUp[99] = {4400,500,1600,500,550,500,1650,500,1600,500,550,500,550,500,1650,500,550,500,550,500,1600,500,600,500,550,500,1600,500,1600,500,600,500,1600,500,1600,500,550,500,600,500,1600,500,1600,500,1650,500,1600,500,1600,500,550,500,1650,500,1600,500,550,500,600,500,550,500,550,500,550,500,550,500,1650,500,1600,500,550,500,550,500,550,500,600,500,550,500,1600,500,550,500,550,500,1650,500,1600,500,1600,500,1650,500,1600,500};

void setup()
{
 Serial.begin(9600);
}

void loop() {
       irsend.sendRaw(volUp,99,38);
       delay(5000);
}

 

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

Посмотрел мануал, на моей модели нет датчика температуры в пульте (у Лессара функция называется Follow me)

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

Протокол очень похож на NEC http://www.sbprojects.com/knowledge/ir/nec.php

В скетче в массиве Вы в начале убрали 4400, а это принципиально. Там должно быть два раза 4400

 

 

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Я тоже на этом подвис. Однако подключил юсб логический анализатор обнаружил...

что пульт ( митсубиши) отсылает не один пакет!!!

Все обследованные кнопки осылали по два пакета.

С довольно большим интервалом.

Не исключаю, что пакетов может быть и больше.

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

Т.е. повторить два раза первую цифру из массива? Пробовал несколько скетчей для считывания, NEC не определился((

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

Индикатором с диодом вижу только один отправленный массив. Конечно это все на глаз)

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

NEC это просто похоже, потому что адрес посылается прямой и инверсный, затем также команда, прямая и инверсная. Всего три адреса и три команды.
Сначала 4400 и скетч сюда, потом будем думать дальше, если не получится.

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

Считал код:
B24D9F60 (32 bits)
Raw (101): 4350 -4300 500 -1650 500 -550 550 -1550 600 -1500 500 -600 500 -550 550 -1550 600 -450 600 -450 500 -1650 550 -500 500 -550 600 -1500 500 -1650 550 -500 550 -1550 500 -1650 550 -500 550 -500 550 -1550 500 -1650 500 -1600 500 -1600 600 -1550 550 -500 500 -1600 600 -1500 500 -600 500 -550 500 -550 500 -550 500 -550 600 -1550 500 -1600 500 -1600 500 -550 600 -500 500 -1600 500 -550 550 -500 500 -550 500 -600 550 -500 500 -1600 550 -1550 500 -600 550 -1550 550 -1550 600 -5050
 

Добавлял в скетч и 4400 (не убирая 4350), добавлял 4350 (вместо первого 4400). Убирал первую цифру 4350 (добавляя 4400) и добавлял 4350. Результата 0 :(

Один из стекчей:

//Отправка на сплит включение
#include <IRremote.h>
IRsend irsend;

unsigned int volUp[101] = {4400,4350,4300,500,1650,500,550,550,1550,600,1500,500,600,500,550,550,1550,600,450,600,450,500,1650,550,500,500,550,600,1500,500,1650,550,500,550,1550,500,1650,550,500,550,500,550,1550,500,1650,500,1600,500,1600,600,1550,550,500,500,1600,600,1500,500,600,500,550,500,550,500,550,500,550,600,1550,500,1600,500,1600,500,550,600,500,500,1600,500,550,550,500,500,550,500,600,550,500,500,1600,550,1550,500,600,550,1550,550,1550,600,5050};

void setup()
{
 Serial.begin(9600);
}

void loop() {
       irsend.sendRaw(volUp,101,38);
       delay(2000);
}

 

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

Я писал, что 4400 должно быть 2 раза, а оба скетча содержат один или три раза.
Никакой разницы между 4350 и 4400 нет, можно использовать одно и тоже значение.

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

Так у меня в коде пришло 2 раза 4350 и 4300. В прошлом посте я к ним добавил в начало 4400.

Сейчас попробовал с другим кодом:
B24D9F60 (32 bits)
Raw (100): 15670 4300 -4350 600 -1550 500 -550 500 -1600 500 -1600 600 -500 550 -500 500 -1600 500 -550 500 -550 500 -1650 500 -550 550 -500 500 -1600 500 -1650 500 -550 500 -1600 500 -1650 500 -550 500 -550 550 -1550 500 -1650 500 -1600 500 -1600 500 -1650 550 -500 500 -1600 500 -1600 500 -600 500 -550 550 -500 500 -550 500 -550 500 -1650 500 -1600 500 -1600 500 -600 450 -600 550 -1550 500 -550 500 -550 500 -550 500 -600 500 -550 500 -1600 500 -1600 500 -600 500 -1600 500 -1600 500

Скетч в который взял исходный код, убрал минусы, заменил пробелы на зпт и добавил в начало 4400:

//Отправка на сплит включение
#include <IRremote.h>
IRsend irsend;

unsigned int volUp[101] = {4400,15670,4300,4350,600,1550,500,550,500,1600,500,1600,600,500,550,500,500,1600,500,550,500,550,500,1650,500,550,550,500,500,1600,500,1650,500,550,500,1600,500,1650,500,550,500,550,550,1550,500,1650,500,1600,500,1600,500,1650,550,500,500,1600,500,1600,500,600,500,550,550,500,500,550,500,550,500,1650,500,1600,500,1600,500,600,450,600,550,1550,500,550,500,550,500,550,500,600,500,550,500,1600,500,1600,500,600,500,1600,500,1600,500};

void setup()
{
 Serial.begin(9600);
}

void loop() {
       irsend.sendRaw(volUp,101,38);
       delay(2000);
}

 

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

Я повторю ещё раз, 4400 должно быть ДВА (2!) раза.
Не надо в каждом скетче использовать разные значения, последовательность для начала нужно использовать одну и ту же.

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

Спасибо за подсказки и терпение! :) Добавил 2 раза 4400. Результат тот же :(
 

//Отправка на сплит включение
#include <IRremote.h>
IRsend irsend;

unsigned int volUp[102] = {4400,4400,15670,4300,4350,600,1550,500,550,500,1600,500,1600,600,500,550,500,500,1600,500,550,500,550,500,1650,500,550,550,500,500,1600,500,1650,500,550,500,1600,500,1650,500,550,500,550,550,1550,500,1650,500,1600,500,1600,500,1650,550,500,500,1600,500,1600,500,600,500,550,550,500,500,550,500,550,500,1650,500,1600,500,1600,500,600,450,600,550,1550,500,550,500,550,500,550,500,600,500,550,500,1600,500,1600,500,600,500,1600,500,1600,500};

void setup()
{
 Serial.begin(9600);
}

void loop() {
       irsend.sendRaw(volUp,102,38);
       delay(2000);
}

 

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

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

"Протокол очень похож на NEC http://www.sbprojects.com/knowledge/ir/nec.php

В скетче в массиве Вы в начале убрали 4400, а это принципиально. Там должно быть два раза 4400"

Если Вам это непонятно, то я Вам не смогу помочь, увы.

 

pka_ua
Offline
Зарегистрирован: 03.11.2014

Делал подобное на сплит. Если у Вас при одинаковых командах с пульта получаются RAW разной длинны, то скорее всего сграбленная команда просто не помещается в массив (в моём случае длинна была 212).  Какое у Вас значение в библиотеке IRRemote присваивается RAWBUF ?

Alexey_A
Offline
Зарегистрирован: 01.05.2015

Добавлю свои 5 копеек. Я начинал изучение теммы протокола кондиционеров, но в результате мне хватилло функций самого устройства. Как я понял у большинства кондиционеров протокол оченнь похож. Посылки отличаются от "телевизонных", в том числе, принцириально большей длиной. Возможно Вам поможет ссылка н сайт програмы предназначенной для анализа протоколов инфракрасных пультов управления. На этой странице как раз разбирают протокол пульта кондиционера Panasonic, в нем длина посылки 216 в двух кадрах, что, видимо, подтверждает слова pka_ua.

http://www.analysir.com/blog/2014/12/27/reverse-engineering-panasonic-ac-infrared-protocol/

Возможно наверное, обрести и использовать саму програму.

Logik
Offline
Зарегистрирован: 05.08.2014

Alexey_A пишет:

 Как я понял у большинства кондиционеров протокол оченнь похож. 

Угу. И не только кондиционеров. Это и зовется "протокол NEC". Это стандарт, один из возможных стандартизированых "дэ факто" вариантов. И по стандарту отправка начинается импульсом порядка 9 мс, потом пауза типа 4.4мс. Без этого никак, что и продемонстрировал ТС.

ЗЫ. В очередной раз просто "убит" подходом в ардуиновской либе. Хороше что я в IRremote.h никогда не смотрел, теперь точно и не буду!  Массив длительностей... писец.... Выдрал из своего рабочего проекта.

#define IR_PULSE_Hz 32500
#define IR_PULSE_START 9
#define IR_PULSE 2

boolean PulseIR(byte n)
{
  static unsigned long Tout1;

  unsigned long Tn1 = micros();
    switch (n)
  {
      case 1:tone(PIN_IR_OUT, IR_PULSE_Hz, IR_PULSE); ;Tout1=Tn1+450;break;
      case 2:tone(PIN_IR_OUT, IR_PULSE_Hz, IR_PULSE_START); ;Tout1=Tn1+14000;break;
      case 3:Tout1=Tn1+460;break;
      case 4:Tout1=Tn1+1460;break;
      case 5:Tout1=Tn1+4400;break;
  }

  if(Tn1<Tout1)
    return false;

  noTone(PIN_IR_OUT);
  digitalWrite(PIN_IR_OUT, 0);
 
  return true;

}

 static byte IR_OutState=0;
 static byte OutBuf[4];
 static boolean IR_OutEnd=false;
 
boolean OutIR(byte adr, byte cmd)
{
 
  IR_OutState=0x40;
  PulseIR(2);
  OutBuf[0]=cmd;
  OutBuf[2]=adr;
  State=2;
  OutBuf[1]=~OutBuf[0];
  OutBuf[3]=~OutBuf[2];
}
boolean ProcessOutIR(void)
{
 
  if(PulseIR(0))
  {
    if(IR_OutState)
    {
       IR_OutState--;
       
        if(!IR_OutState)
         IR_OutEnd=true;
        if(IR_OutState&1)
        {
          PulseIR(1);
        }
        else
        {
          PulseIR((OutBuf[(IR_OutState>>4)]&_BV((IR_OutState>>1)&7))?3:4);
        }
        return false;
     }
     else if(IR_OutEnd)
     {
        PulseIR(1);
        IR_OutEnd=false;
        return false;
     }
     
   }
    else
        return false;
   return true;
}

В лупе для начала отправки B24D9F60 пишем типа OutIR(0xb2,0x9f);

В лупе вызовы ProcessOutIR() часто в процессе отправки, пока не вернет true,  например for(;!ProcessOutIR();)

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

pka_ua спасибо!

В IRremote.h RAWBUF стоял по-умолчанию 100. Поставил 216 (212 пробовал):

#define RAWBUF 216 // Length of raw duration buffer

При считывании не всегда попадался RAW длинной 200 (1 раз из 5), взял первый попавшийся и, О ЧУДО, сплит включился! Теперь нужно раскуривать составляющую кода:

Raw (200): 1854 4350 -4300 550 -1600 550 -500 550 -1550 600 -1500 600 -450 600 -500 550 -1550 600 -450 600 -450 600 -1550 550 -500 550 -500 600 -1500 600 -1550 550 -500 600 -1500 600 -1550 550 -500 550 -500 600 -1500 600 -1550 550 -1550 600 -1500 600 -1550 550 -500 550 -1550 600 -1500 600 -500 550 -500 550 -500 600 -450 600 -450 600 -1550 550 -1550 600 -1500 600 -450 600 -500 550 -1550 600 -450 600 -450 600 -450 600 -500 550 -500 500 -1600 600 -1500 600 -500 550 -1550 600 -1500 600 -5050 4350 -4350 550 -1550 600 -450 550 -1600 500 -1600 600 -450 600 -450 600 -1550 550 -500 550 -500 600 -1500 600 -500 550 -500 550 -1550 600 -1500 600 -500 550 -1550 550 -1550 600 -450 600 -500 500 -1600 500 -1600 600 -1550 550 -1550 500 -1600 600 -450 600 -1550 500 -1600 550 -500 550 -500 600 -500 500 -550 550 -500 500 -1600 550 -1600 500 -1600 500 -550 500 -550 500 -1650 500 -550 500 -550 500 -550 500 -550 500 -550 500 -1650 500 -1600 500 -550 500 -1650 500 -1600 500

 

Alexey_A
Offline
Зарегистрирован: 01.05.2015

Как я успел узнать, RAWBUF это не размер посылки, это размер буфера для приема команд. Чем он длинне тем более длинные посылки входят. Минимальный размер буфера необходим немного разный из за немного разной по времени длительности команд в силу разной длительности нулей и едениц в команде. И  немного разного состава разных команд.  Для команд одного кондиционера. 

Похоже у Вас, AKa, получилось значение "на грани". В него могут не помещаться некоторые команды. Стоит, наверно, еще немного увиличить буфер. Пишут, что для кондиционеров с длинной посылкой, а у вас такой, стоит использовать значения RAWBUF  230-255 . 255 максимально возможное значение.

pka_ua
Offline
Зарегистрирован: 03.11.2014

Я у себя ставил длину RAWBUF 300 "шоб не думать" :) , там памяти на Arduino Pro Mini хватает.

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

Удачи!

Alexey_A
Offline
Зарегистрирован: 01.05.2015

pka_ua пишет:

Я у себя ставил длину RAWBUF 300 "шоб не думать" :) , там памяти на Arduino Pro Mini хватает.

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

Удачи!

Пишут, что в результате RAWBUF хранится в одной 8 битной ячейке, максимум 255. Если так, наверно компилятор записывал туда максимальное значение 255. Но теперь мы знаем что если написать значение больше, по крайней мере беды не произойдет. А по умолчанию значение меньше, да, для сокращения использования памяти. Для большенства применений хватает значения по умолчанию.