Конвертировать ИК сигнал HEX формата в RAW

ribafoso
Offline
Зарегистрирован: 29.05.2020

Всем привет. Как можно конвертировать HEX формат полученные ИК приемником (библиотекой IRremote) в RAW? 

Например ардуина получила сигнал от пульта SAMSUNG E0E040BF

Этот же самый сигнал, но в формате RAW выглядит так 4550,4400,600,1650,550,1650,600,1650,550,550,600,500,600,550,550,550,600,500,600,1650,600,1600,600,1650,550,550,600,500,600,550,600,500,600,500,650,450,650,1600,600,500,650,450,650,500,600,500,600,500,600,550,600,1600,600,500,650,1600,650,1550,650,1600,650,1550,650,1600,650,1600,600

Есть ли конвернет или можно ли в ручную это сделать?

 
b707
Offline
Зарегистрирован: 26.05.2017

Нет таких форматов Hex и Raw - это просто способы написания, как арабские и римские цифры, например 4 и IV. Поэтому никакой конвертер для них не нужен

Выложите код, который вам выдает HEX или RAW сигнал с приемника

nik182
Offline
Зарегистрирован: 04.05.2015

А HEX как выглядит?

ribafoso
Offline
Зарегистрирован: 29.05.2020

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

Этим кодом (это код примера из библиотеки IRremote) я получаю сигнал от пульта телевизора и он расшифровывается как E0E040BF

/*
 * 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 = 13;

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 == SAMSUNG) {
      Serial.print("Received SAMSUNG: ");
    }
    else if (codeType == PANASONIC) {
      Serial.print("Received PANASONIC: ");
    }
    else if (codeType == JVC) {
      Serial.print("Received JVC: ");
    }
    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 == PANASONIC) {
    irsend.sendPanasonic(codeValue, codeLen);
    Serial.print("Sent Panasonic");
    Serial.println(codeValue, HEX);
  }
  else if (codeType == JVC) {
    irsend.sendJVC(codeValue, codeLen, false);
    Serial.print("Sent JVC");
    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)

/*
 * IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
 * An IR LED must be connected to Arduino PWM pin 3.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */


#include <IRremote.h>

IRsend irsend;

void setup()
{
}

void loop() {
	for (int i = 0; i < 3; i++) {
		irsend.sendSAMSUNG(0xE0E040BF, 32);
		delay(40);
	}
	delay(5000); //5 second delay between each signal burst
}

Но на этот код телевизор ни как не реагирует.

И потом я совершенно случайно увидел в инете сигнал RAW этой кнопки он выглядит так:

4550,4400,600,1650,550,1650,600,1650,550,550,600,500,600,550,
550,550,600,500,600,1650,600,1600,600,1650,550,550,600,500,600,
550,600,500,600,500,650,450,650,1600,600,500,650,450,650,500,600,
500,600,500,600,550,600,1600,600,500,650,1600,650,1550,650,1600,
650,1550,650,1600,650,1600,600

Следовательно для отправки RAW нужно использовать другой скетч, я использовал вот этот (из примеров библиотеки IRremote), тут я уже вставил значения RAW своей кнопки включения:

/*
 * IRremote: IRsendRawDemo - demonstrates sending IR codes with sendRaw
 * An IR LED must be connected to Arduino PWM pin 3.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 *
 * IRsendRawDemo - added by AnalysIR (via www.AnalysIR.com), 24 August 2015
 *
 * This example shows how to send a RAW signal using the IRremote library.
 * The example signal is actually a 32 bit NEC signal.
 * Remote Control button: LGTV Power On/Off. 
 * Hex Value: 0x20DF10EF, 32 bits
 * 
 * It is more efficient to use the sendNEC function to send NEC signals. 
 * Use of sendRaw here, serves only as an example of using the function.
 * 
 */


#include <IRremote.h>

IRsend irsend;

void setup()
{

}

void loop() {
  int khz = 38; // 38kHz carrier frequency for the NEC protocol
  unsigned int irSignal[] = {4550,4400,600,1650,550,1650,600,1650,550,550,600,500,600,550,550,550,600,500,600,1650,600,1600,600,1650,550,550,600,500,600,550,600,500,600,500,650,450,650,1600,600,500,650,450,650,500,600,500,600,500,600,550,600,1600,600,500,650,1600,650,1550,650,1600,650,1550,650,1600,650,1600,600}; //AnalysIR Batch Export (IRremote) - RAW
  
  irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.

  delay(5000); //In this example, the signal will be repeated every 5 seconds, approximately.
}

И о боги телевизор откликается!

Теперь у меня только варианта

1. Сделать так чтобы самый первый код как я его назвал "HEX" работал с моим телеком.

2. Преобразовать все известные мне HEX в RAW

ribafoso
Offline
Зарегистрирован: 29.05.2020

Вот такой способ шифровки E0E040BF вроде как называется HEX, но это не точно))) 

ribafoso
Offline
Зарегистрирован: 29.05.2020

Ещё я нашёл вот это. https://www.techdesign.be/projects/011/011_waves.htm возможно это может помочь сделать обратное преобразование?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

b707
Offline
Зарегистрирован: 26.05.2017

rybafoso, коды

4550,4400,600,1650,550,1650,600,1650,550,550,600,500,600,550,
550,550,600,500,600,1650,600,1600,600,1650,550,550,600,500,600,
550,600,500,600,500,650,450,650,1600,600,500,650,450,650,500,600,
500,600,500,600,550,600,1600,600,500,650,1600,650,1550,650,1600,
650,1550,650,1600,650,1600,600

и 0xE0E040BF не имеют ничего общего.

Для справки 0xE0E040BF = 3772793023 в десятичном формате, а вовсе не эта длиннющая пачка цифр. что выше

ribafoso
Offline
Зарегистрирован: 29.05.2020

Я хочу зная код от пульта вот такого типа шифрования E0E040BF отправить его на телевизор SAMSUNG, вот этим скетчем:

/*
 * IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
 * An IR LED must be connected to Arduino PWM pin 3.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * <a href="http://arcfn.com" title="http://arcfn.com" rel="nofollow">http://arcfn.com</a>
 */


#include <IRremote.h>

IRsend irsend;

void setup()
{
}

void loop() {
	for (int i = 0; i < 3; i++) {
		irsend.sendSAMSUNG(0xE0E040BF, 32);
		delay(40);
	}
	delay(5000); //5 second delay between each signal burst
}

Но телевизор SAMSUNG на него не реагирует.

b707
Offline
Зарегистрирован: 26.05.2017

ribafoso пишет:

Я хочу зная код от пульта вот такого типа шифрования E0E040BF отправить его на телевизор SAMSUNG

Но он телевизор SAMSUNG на него не реагирует.

отправляете правильно. Видимо код не подходит

ribafoso
Offline
Зарегистрирован: 29.05.2020

Но этот код я снял с пульта телевизора ИК приемником и его же посылаю 0_о. p.s. в инете много раз встречал что код E0E040BF включения и выключения для телевизоров самсунг.

b707
Offline
Зарегистрирован: 26.05.2017

про RAW формат  вот что написано в библиотеке:

Normally you would obtain the contents of rawbuf and rawlen by using the receiver many times and averaging the results. Some adjustments may be necessary for best performance. The frequency is the expected bandpass filter frequency at the receiver, where 38 is the most commonly used.

То есть чтобы получить сигналы пульта не HEX, а в RAW - вам надо считать коды реального пульта при помощи метода results.rawbuf. Желательно сделать это несколько раз для каждого кода и потом усреднить

ribafoso
Offline
Зарегистрирован: 29.05.2020

Проблема в том что у меня нет пульта, но у меня есть набор команд HEX

b707
Offline
Зарегистрирован: 26.05.2017

ribafoso пишет:

Проблема в том что у меня нет пульта, но у меня есть набор команд HEX

Смотрите - библиотека в любом случае принимает коды в формате RAW, а потом переводит в HEX. Так что вам надо открыть функцию приема кода в библиотеке и разобраться. как коды конвертируются между форматами.

Или поискать в гугле, например:

https://stackoverflow.com/questions/25771333/ir-hex-to-raw-ir-code-conversion

а вот тут вроде даже полноценная программа для перевода, но "очень многа букв" - глубоко не вникал

http://www.harctoolbox.org/IrScrutinizer.html

ribafoso
Offline
Зарегистрирован: 29.05.2020

Я не знаю как это работает, но на англоязычном ресурсе нашел этот код:

#include <IRremote.h> 



void setup()
{
}

void loop() {
  IRsend irsend; // I know this should be defined globally,
                 // but I was just experimenting with different scenarios
  irsend.sendSAMSUNG(0xE0E040BF, 32);
  delay(1000);
}

Он работает!

Вопрос закрыт.

Открылся новый вопрос почему этот код работает, а предыдущий нет))

sadman41
Offline
Зарегистрирован: 19.10.2016

Патамушто 3 раза нужно не всем слать. Соньке, по-моему, и ещё кому-то.

ribafoso
Offline
Зарегистрирован: 29.05.2020

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

b707
Offline
Зарегистрирован: 26.05.2017

ribafoso пишет:

Я не знаю как это работает, но на англоязычном ресурсе нашел этот код:

какой вы код нашли? - IR код-то тот же

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

b707
Offline
Зарегистрирован: 26.05.2017

ribafoso пишет:

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

а зачем с практической точки зрения это надо? будете каждый раз, когда надо телик включить или громкость добавить - HEX коды в консоли набирать? :)))

ribafoso
Offline
Зарегистрирован: 29.05.2020

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

ribafoso
Offline
Зарегистрирован: 29.05.2020

У меня есть пульт он запоминает команды, ему нужно показать команды по ик. Что воспроизодить я нашел в инетрнете, другого пульта с которого можно скопировать команды нету.

ribafoso
Offline
Зарегистрирован: 29.05.2020

Это разовая акция))))

ribafoso
Offline
Зарегистрирован: 29.05.2020

Вопрос опять открыт. Работает вообще не стабильно. То работает, то нет. Работать не возможно. При этом через  RAW работает просто отлично...

b707
Offline
Зарегистрирован: 26.05.2017

ribafoso пишет:

Вопрос опять открыт. Работает вообще не стабильно. То работает, то нет. Работать не возможно. При этом через  RAW работает просто отлично...

тут столько вариантов - неправильный код. неверный монтаж, помехи. засветки...

тут вам вряд ли кто поможет, телевизор то у вас

ribafoso
Offline
Зарегистрирован: 29.05.2020

При отправке RAW отклик телевизора 100%. Это исключает -Плохой монтаж, -Помехи, -Засветки. 

Скорее всего проблема в библиотеке IRremote, а именно в работе с самсунг.

b707
Offline
Зарегистрирован: 26.05.2017

ribafoso пишет:

Скорее всего проблема в библиотеке IRremote, а именно в работе с самсунг.

это вряд ли. Библиотека настолько активно используется. что все существенные баги из нее наверняка давно выпилили.  Куда более вероятно, что ваши RAW и HEX просто разные коды.

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

ribafoso
Offline
Зарегистрирован: 29.05.2020

Уже пытаюсь разбираться. 

Сколько я искал в инете рус, англ  везде пишут что самсунг работает только с RAW, может я не там ищу.

b707
Offline
Зарегистрирован: 26.05.2017

ribafoso пишет:

 везде пишут что самсунг работает только с RAW

это бессмысленная фраза, примерно как сказать что "десять" и "10" - это разные числа

sadman41
Offline
Зарегистрирован: 19.10.2016

Если IR-светик засунут прямо в Ардуину, то всяких спецэффектов ожидать следует. Для нормальной работы его через транзистор раскачивают.

ribafoso
Offline
Зарегистрирован: 29.05.2020

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

ribafoso
Offline
Зарегистрирован: 29.05.2020

так и есть((

-NMi-
Offline
Зарегистрирован: 20.08.2018

b707 пишет:

4550,4400,600,1650,550,1650,600,1650,550,550,600,500,600,550,
550,550,600,500,600,1650,600,1600,600,1650,550,550,600,500,600,
550,600,500,600,500,650,450,650,1600,600,500,650,450,650,500,600,
500,600,500,600,550,600,1600,600,500,650,1600,650,1550,650,1600,
650,1550,650,1600,650,1600,600

и 0xE0E040BF не имеют ничего общего.

Для справки 0xE0E040BF = 3772793023 в десятичном формате, а вовсе не эта длиннющая пачка цифр. что выше

707-й, держал лы ты хоть раз в руках цифровую зеркалку?

ribafoso
Offline
Зарегистрирован: 29.05.2020

При чем тут десятичный формат?   E0E0F00F - это команда в шестнадцатеричной системе счисления, а вот эти цифры:

1 4550,4400,600,1650,550,1650,600,1650,550,550,600,500,600,550,
2 550,550,600,500,600,1650,600,1600,600,1650,550,550,600,500,600,
3 550,600,500,600,500,650,450,650,1600,600,500,650,450,650,500,600,
4 500,600,500,600,550,600,1600,600,500,650,1600,650,1550,650,1600,
5 650,1550,650,1600,650,1600,600

как я понял это интервалы времени

-NMi-
Offline
Зарегистрирован: 20.08.2018

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

А мессага моя 707-му она должна была этим описанием и окончицца, но вишь ты опередил его.

ribafoso
Offline
Зарегистрирован: 29.05.2020

Ты можешь мне подсказать, зная вот это https://www.techdesign.be/projects/011/011_waves.htm я могу преобразовать HEX в тайминги?

-NMi-
Offline
Зарегистрирован: 20.08.2018

это всё зависит от твоего уровня как программера.   яж низнаю какой ты программер...пральна?

b707
Offline
Зарегистрирован: 26.05.2017

ribafoso пишет:

Ты можешь мне подсказать, зная вот это https://www.techdesign.be/projects/011/011_waves.htm я могу преобразовать HEX в тайминги?

"зная это" - не уверен, но библиотека без проблем преобразует RAW в HEX, так что в ее исходниках есть метод перевода, как я тебе написал выше

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ribafoso пишет:

зная вот это https://www.techdesign.be/projects/011/011_waves.htm я могу преобразовать HEX в тайминги?

Нет, конечно. Если бы это мог, этого поста бы не было.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

b707 пишет:

rybafoso, коды

4550,4400,600,1650,550,1650,600,1650,550,550,600,500,600,550,
550,550,600,500,600,1650,600,1600,600,1650,550,550,600,500,600,
550,600,500,600,500,650,450,650,1600,600,500,650,450,650,500,600,
500,600,500,600,550,600,1600,600,500,650,1600,650,1550,650,1600,
650,1550,650,1600,650,1600,600

и 0xE0E040BF не имеют ничего общего.

Для справки 0xE0E040BF = 3772793023 в десятичном формате, а вовсе не эта длиннющая пачка цифр. что выше

Тайминги в списке и код 0xE0E040BF, равный 0b11100000111000000100000010111111  - одно и то же со стартовым импульсом по 4.5 мс в кодировке Самсунг. (600+600) =0, (600+1600) =1. Тайминги сняты (вероятно) Ардуинкой, поэтому они плавают от 550 до 650 и от 1550 до 1650 - соответственно.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ribafoso пишет:

Ты можешь мне подсказать, зная вот это https://www.techdesign.be/projects/011/011_waves.htm я могу преобразовать HEX в тайминги?

да. Преобразуешь 16ричный формат в двоичный и спокойно пишешь: первые два числа 4500, 4500. А потом 600, 1600 - пару чисел вместо 1 и 600,600 - вместо 0. Для каждого из 32 битов.

Это если Самсунг.

ribafoso
Offline
Зарегистрирован: 29.05.2020

Спасибо! Всё работает. Если кому надо, написал Конвертер NEC в RAW (только для Samsung). Поменяйте расширение с png на xlsx и пользуйтесь.

Скачать можно по ссылке - http://arduino.ru/sites/default/files/u55504/konverter_nec_v_raw_tolko_dlya_samsung.png

ВН
Offline
Зарегистрирован: 25.02.2016

Впереди уже замаячил образ светлого пост-техногенного будущего =)

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

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Фигня энто фсё. Дауным дауно есть в сельмагах т.н. универсальные пульты. А вспомните первые смартфоны с ИК-портом? То-же теликами могли управлять. Ну и счас с ведроида тож можно управлять. Так-що фигня энта ваша заливная рыба.