Нужна помощь по радиомодулю и ИК передатчику

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

Доброго времени суток! Нужна помощь реально разбирающихся людей в этой теме. Решил сделать умный дом на базе ардуино и готовых моделей.

Есть такая штучка http://www.aliexpress.com/item/Keyless-Entery-Door-Lock-Remote-Control-S... а так же есть несколько таких комплектов http://www.ebay.com/itm/261041100836?ssPageName=STRK:MEWNX:IT&_trksid=p3... Для программирования использовалась библиотека VirtualWare и её примеры. Пробовал принимать сигнал и от пульта и на одной плате ставить передатчик и приемник, но все без толку. Где-то что-то делаю не так, а что именно не могу разобраться. Так же есть проблема с посылкой полученного от пульта ИК сигнала. В этом все я новичок и пока все делаю по примерам.

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

Если кто-то сможет помочь в этом жду вас в личку.

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

Это не ИК. Потому с ик пульта ничего не получите. Про радиоканал расскажут те, кто знает.

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

kisoft пишет:
Это не ИК. Потому с ик пульта ничего не получите. Про радиоканал расскажут те, кто знает.

То что это не ИК знаю. Я, наверное, не так выразился. По ИК - это как бы отдельная задача. Есть ИК приемник, удалось получить код с пульта и включать/выключать светодиод по нажатию разных кнопок. А как послать этот же код телику (от него использовал пульт) пока не разобрался. Только не могу понять причина в неправильном подключении передатчика, его выборе (есть пару модулей) или программе.

P.S. только увидел, что тут нету личных сообщений. Поэтому просьба откликнуться просто в тему.

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

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

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

В форуме много тем по ИК, поищите. Если в двух словах, то у каждого бренда своя кодировка. Есть библиотека IRremote, можно использовать её для начала. Во всяком случае можно посмотреть исходники.

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

nehidd пишет:

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

А как вы посылаете этот же код телику можете описать? И что за передатчик? Там-же вроде одного инфракрасного диода достаточно.

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

Evgen пишет:

nehidd пишет:

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

А как вы посылаете этот же код телику можете описать? И что за передатчик? Там-же вроде одного инфракрасного диода достаточно.

C помощью указанной выше библиотке. Сначала получаю код кнопки с помощью одного скетча, потом посылаю его обратно. В IRremote есть примеры.

Но у меня возникла проблема с посылкой сигнала с помощью sendRaw. Например, телику четко посылается код через sendNec, а тот же код кнопки, но уже посланный sendRaw (посылаю уже, как массив полученных данныы) не хочет работать совсем. Может кто сталкивался с этим?

Дурачёк
Дурачёк аватар
Offline
Зарегистрирован: 25.11.2012

Сталкивался, разница в интервалах между посылками...

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

Дурачёк пишет:

Сталкивался, разница в интервалах между посылками...

Как решали, если не секрет? Я делаю это так:

unsigned int powerOn[68] = {4818,8900,......};
irsend.sendRaw(powerOn, 68, 32);

Пробовал много разных вариантов и никакого результата. Может поделитесь опытом? :)

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

nehidd, зачем Вам это нужно? (sendRaw), sendNEC же работает.

Могу сказать, что если теликом или подобной аппаратурой управлять, то проблем нет, все протоколы описаны. А если кондиционером, например, то протоколы не описаны, потому в таких случаях RAW может и поможет, только не с этой библиотекой, она не очень точно (а это не всегда и нужно) измеряет интервалы.

 

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

Мне как раз кондиционером и надо управлять, но я уже понял, что задача это не всегда решаемая.

"nehidd, зачем Вам это нужно? (sendRaw), sendNEC же работает." - я просто думал, что делаю что-то не так с посылкой через Raw и поэтому не получается управлять тюнером и кондишкой.

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

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

Еще, если у Вас реальные цифры:

unsigned int powerOn[68] = {4818,8900,......};
irsend.sendRaw(powerOn, 68, 32);

То это ни под какой протокол не подходит. http://www.sbprojects.com/knowledge/ir/xsat.php здесь есть про протоколы, если инетересно.

 

Дурачёк
Дурачёк аватар
Offline
Зарегистрирован: 25.11.2012

Если хотите универсальности, придётся свою библиотеку писать, с концептуально иным подходом.

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

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

kisoft пишет:

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

Еще, если у Вас реальные цифры:

unsigned int powerOn[68] = {4818,8900,......};
irsend.sendRaw(powerOn, 68, 32);

То это ни под какой протокол не подходит. http://www.sbprojects.com/knowledge/ir/xsat.php здесь есть про протоколы, если инетересно.

 

Цифры реальные, полученный через примр библиотеки DUMP. мне тоже кажется, что с ними что-то не так, иначе бы телик работал. т.к. через NEC все работает отлично. У меня есть еще ТВ тюнер с неопознанным протоколом, там тоже глухо.

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

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

Вот полный код

{4818, 8900, 4450, 550, 550, 550, 550, 550, 550, 600, 500, 600, 550, 550, 550, 550, 550, 600, 500, 550, 1650, 600, 550, 550, 1650, 600, 1650, 550, 1650, 550, 1700, 600, 500, 550, 1700, 550, 1650, 600, 500, 600, 1650, 550, 1650, 550, 600, 550, 500, 600, 550, 550, 600, 550, 500, 600, 1650, 550, 550, 600, 500, 550, 1700, 600, 1650, 550, 1650, 550, 1650, 600}

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

А по радио модулю можете что-то сказать? На вид там все просто и примеры есть, а работать никак не хочет. Готов 500р. заплатить за дельный совет.

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

У Вас явно первое число 4818 - это из 0 элемента массива, оно - лишнее для кода, а если взять остальное, то остается код NEC. В 0 элементе хранится длительность паузы, до начала кода. Её выводить не нужно.

sendRaw считает, что первое число - это MARK, уберите его и всё получится. У Вас сейчас выводится "инверсный" код, вместо MARK - SPACE и наоборот. Попробуйте.

 

 

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

kisoft пишет:

У Вас явно первое число 4818 - это из 0 элемента массива, оно - лишнее для кода, а если взять остальное, то остается код NEC. В 0 элементе хранится длительность паузы, до начала кода. Её выводить не нужно.

sendRaw считает, что первое число - это MARK, уберите его и всё получится. У Вас сейчас выводится "инверсный" код, вместо MARK - SPACE и наоборот. Попробуйте.

СПАСИБО ОГРОМНОЕ!!!! Да, действительно, убрал первую цифру и заработало. Тюнер конечно не четко, но там и с пульта не всегда получается, надо целиться. А посылаемый на него сигнал почему-то выключает на нем звук (пробовал 2 разных кода). Но и это круто!

P.S. Кондишка так и не заработала, но до этого, видимо, я еще не дорос.

Пока у меня осталась вообще не решена задача с радиомодулями(((

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

Кстати, в sendRaw можно задать частоту. Это может помочь для кондиционера, попробуйте ему скормить коды (без 0 элемента!) и третий параметр 56 (это частота 56 КГц). Возможно это сработает, кто знает. Отпишите результат, если попробуете.

 

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

УРААА! Все заработало! В общем проблема была в буфере, у меня длина в 228 получается. Я менял буфер на 200 и получал 200, но думал - это максимальная, как в в другой теме указано, а потом поставил 300 и получил уже все данные, которые отправились без проблем на частоте 36КГц. Еще раз большое спасибо за помощь!

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

nehidd, выложи код - тема уже встрачалась и может помочь другим. 

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

Еще, уточни частоту (36 или 56) и тип кондиционера, чтобы совсем было понятно.

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

Вот код. Там через монитор вводится 1 - включается кондиционер, 2 - телевизор. Кондиционер Arvin. Частоту подобрал перебором и она оказалась 36КГц. Кондиционер включается ровно на тех параметрах, на которых была записана кнопка включения.

#include <IRremote.h>
IRsend irsend;
unsigned int powerOn[228] = {3300, 1750, 450, 1250, 450, 1250, 450, 400, 450, 450, 450, 400, 450, 1250, 450, 400, 450, 450, 450, 1250, 450, 1250, 450, 400, 450, 1250, 450, 450, 400, 450, 450, 1250, 450, 1250, 450, 400, 450, 1250, 450, 1250, 450, 450, 450, 400, 450, 1250, 450, 400, 450, 450, 450, 1250, 450, 400, 450, 400, 450, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 450, 400, 400, 500, 1250, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 400, 450, 450, 400, 1300, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 400, 1300, 400, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 1250, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 400, 450};
void setup() {
  Serial.begin(9600);
}
void loop() {
 if(Serial.available() > 0)
   {
    int a = Serial.read();
     if(a == 49){
       irsend.sendRaw(powerOn, 228, 36);
       Serial.println("Cond on");
     } 
     if(a == 50){
      irsend.sendNEC(0xBD6897, 32);
       Serial.println("TV on");
     } 
    a = 0;
   }
}

 

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

Отлично, хороший пример для подражания. Вопрос, проблема решена, информацией поделился ;)

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

nehidd, насколько возможно разобрать код на составляющие чтобы не запоминать все комбиначии пульта, а составлять их самостоятельно и отправлять ?

Pavel_
Offline
Зарегистрирован: 19.03.2012

nehidd пишет:

unsigned int powerOn[228] = {3300, 1750, 450, 1250, 450, 1250, 450, 400, 450, 450, 450, 400, 450, 1250, 450, 400, 450, 450, 450, 1250, 450, 1250, 450, 400, 450, 1250, 450, 450, 400, 450, 450, 1250, 450, 1250, 450, 400, 450, 1250, 450, 1250, 450, 450, 450, 400, 450, 1250, 450, 400, 450, 450, 450, 1250, 450, 400, 450, 400, 450, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 450, 400, 400, 500, 1250, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 400, 450, 450, 400, 1300, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 400, 1300, 400, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 400, 450, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 1250, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 400, 450};

Объясните пожалуйста, почему длина = 228 ?

Pavel_
Offline
Зарегистрирован: 19.03.2012

Pavel_ пишет:
Объясните пожалуйста, почему длина = 228 ?

разобрался...по примеру

Цитата:

With that i got the RAW data from my Samsung remote control which was following

// power button
FFFF807F
Decoded SAMSUNG: FFFF807F (32 bits)
Raw (68): 6306, 4500, -4500, 600, -1600, 600, -1650, 600, -500, 650, -500, 550, -550, 600, -500, 600, -1650, 600, -500, 600, -1650, 600, -1650, 600, -500, 600, -500, 600, -1650, 600, -500, 600, -1650, 600, -500, 600, -1650, 600, -500, 600, -550, 550, -550, 600, -500, 600, -550, 600, -500, 600, -500, 600, -550, 600, -1600, 600, -1650, 550, -1650, 600, -1650, 600, -1650, 550, -1650, 650, -1600, 600,

That HEX code didnt work at all, so i moved on to raw code. The first thing to do with the raw code is to remove the first numeric-value AND convert all negatives to positive values as following code shows:

unsigned int powerOn[68] = {4500, 4500, 600, 1600, 600, 1650, 600, 500, 650, 500, 550, 550, 600, 500, 600, 1650, 600, 500, 600, 1650, 600, 1650, 600, 500, 600, 500, 600, 1650, 600, 500, 600, 1650, 600, 500, 600, 1650, 600, 500, 600, 550, 550, 550, 600, 500, 600, 550, 600, 500, 600, 500, 600, 550, 600, 1600, 600, 1650, 550, 1650, 600, 1650, 600, 1650, 550, 1650, 650, 1600, 600};

And then send that code as RAW to the device:

Pavel_
Offline
Зарегистрирован: 19.03.2012

Ну вот и я, наконец-то победил свой кондей!

Сперва как обычно, сграбил с пульта ИК-код с помощью примера IRrecvDump в библиотеке IRremote

и получил вот такой ИК-код

C6F15FF
Unknown encoding: C6F15FF (32 bits)
Raw (132): 21796 4600 -2500 350 -400 350 -900 350 -950 350 -400 350 -900 350 -400 350 -350 400 -350 350 -350 350 -950 350 -350 400 -350 350 -350 350 -950 400 -300 350 -400 350 -950 350 -350 350 -400 350 -350 350 -400 350 -900 350 -400 350 -350 400 -900 350 -400 350 -350 350 -350 400 -350 350 -950 350 -350 400 -300 400 -350 350 -400 350 -350 350 -350 400 -900 350 -400 350 -350 350 -350 400 -350 350 -400 350 -350 350 -350 400 -900 350 -400 350 -350 400 -300 400 -350 350 -400 350 -900 350 -400 350 -350 350 -950 350 -350 350 -400 350 -350 400 -350 350 -350 350 -950 350 -950 350 -350 350 -400 350 -350 400

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

Сграбил ИК-код с ардуинки, с помощью IRrecvDump и получил в общем-то такой-же кода как с оригинального пульта.

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

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

вот что получил 1-пульт 2-ардуинка

0000000000000000000000000000000000000000000000000000111111111111111111110100000101011101110101010101101010101010011110010111101111111111111111111100001111111111111111111111111111111111111111END
0000000000000000000000000000000000000000000000000000111111111111111111110100001100011101010111111010101000110101010101110001001111111111111111111111111111111111111111111111111111111111111111END

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

Тогда я предположил, что библиотека IRremote увидев в конце кода данную серию нулей решала, что ИК-код закончился и как бы обрезала его.... В общем я просто увеличил длинну ИК-кода и в место [132]-которую определила библиотека, я постаивл [133] и все сразу заработало - появилась серия недастающих нулей в ИК-коде и кондей стал бесприкословно выполнять ИК-команду Вкл-Выкл от ардуинки ))

Марка кондея McQuay.

 

arduino161080
Offline
Зарегистрирован: 13.01.2014
A32AB931
Unknown encoding: A32AB931 (32 bits)
Raw (24): 1644 1250 -400 1250 -400 450 -1200 1250 -400 1250 -400 450 -1200 450 -1200 450 -1200 450 -1200 450 -1200 450 -1200 1250 
A32AB931
Unknown encoding: A32AB931 (32 bits)
Raw (24): 3292 1250 -400 1250 -400 400 -1250 1250 -400 1250 -400 400 -1250 400 -1250 400 -1250 400 -1250 400 -1250 400 -1250 1250 
A32AB931
Unknown encoding: A32AB931 (32 bits)
Raw (24): -12120 1250 -400 1250 -400 450 -1200 1250 -400 1250 -400 450 -1200 450 -1200 450 -1200 450 -1200 450 -1200 450 -1200 1250 
A32AB931
Unknown encoding: A32AB931 (32 bits)
Raw (24): 10502 1250 -400 1250 -400 450 -1200 1250 -400 1250 -400 450 -1200 450 -1200 450 -1200 400 -1250 450 -1200 450 -1200 1250 
A32AB931
Unknown encoding: A32AB931 (32 bits)
Raw (24): 18476 1250 -400 1250 -400 450 -1200 1300 -350 1300 -350 450 -1200 450 -1200 450 -1200 450 -1200 450 -1200 450 -1200 1300 
A32AB931
Unknown encoding: A32AB931 (32 bits)
Raw (24): -7518 1250 -400 1250 -400 400 -1250 1250 -400 1250 -400 400 -1250 400 -1250 400 -1250 400 -1250 400 -1250 400 -1250 1250 
A32AB931
Unknown encoding: A32AB931 (32 bits)
Raw (24): 17176 1250 -400 1250 -400 450 -1200 1250 -400 1250 -400 450 -1200 450 -1200 450 -1200 450 -1200 450 -1200 450 -1200 1250 
A32AB931
Unknown encoding: A32AB931 (32 bits)
Raw (24): 6394 1250 -400 1250 -400 400 -1250 1250 -400 1250 -400 450 -1200 400 -1250 400 -1250 450 -1200 450 -1200 400 -1250 1250 
A32AB931
Unknown encoding: A32AB931 (32 bits)
Raw (24): -6950 1250 -400 1250 -400 400 -1250 1250 -400 1250 -400 400 -1250 400 -1250 400 -1250 400 -1250 400 -1250 400 -1250 1250 

Прошу помощи распознать что за пульт такой.В общем то сам пульт от вентилятора фирмы AEG,но вот его код ну никак через raw не хочет слаться.

Все рабочие, пробовал на ARDUINO принимать пульт от спутникового ресивера, распознал как NEC засунул RAW код в скетч с 21 сообщения с поправкой на срез первого числа.
Все работает и по протоколу NEC и прямой передачей Raw.
Но вот это чудо ну никак не поддается.Куда копать не могу уже придумать.
Код прилагается.