Опять про ИК-приёмник

LCF_R
Offline
Зарегистрирован: 09.08.2016

Приветствую участников!

Имеется Arduino Nano, ИК-приемник RPM6936-V4 и исходный ИК-сигнал в HEX:

0000 0071 0000 0024 0020 0020 0020 0020 0020 0020 0040 0020 0020 0020 0020 0020 0020 00A1 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0040 0040 0020 0020 0020 0020 0020 0020 0AAB 0020 0020 0020 0020 0020 0020 0040 0020 0020 0020 0020 0020 0020 00A1 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0040 0040 0020 0020 0020 0020 0020 0020 04B0 

Arduino встраивается в усилитель Marantz PM7003, имеющий вышеуказанный датчик. ИК-код взят из документации к усилителю (от более новой его версии, мой усилитель на эту команду штатно не реагирует). Задача Arduino - при получении данного кода произвести некое действие (замкнуть реле).

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

LCF_R
Offline
Зарегистрирован: 09.08.2016

Скетч использовал такой:


#include <IRremote.h>
int RECV_PIN = 6;
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 == 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;
}

Вот его вывод:


Received unknown code, saving as raw

 m65486 s600 m200 s1800 m200 s1900 m250 s1700 m400 s1000 m0 s550 m450 s650 m50 s900 m250 s200 m1050 s850 m1700 s1900 m1650 s1000 m750 s1000 m850 s900 m850 s950 m800 s1000 m750 s1900 m750 s950 m1750 s1800 m850
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вот такая портянка не структурированная (ну нажми Ctrl-T перед копированием) затрудняет получение ответа. Но это дело хозяйское. Если бы мне не было скушно, прошел бы мимо. Это к тому, что если хочешь получить ответ, уважай собеседников. Не принуждаю, дело твоё.

Со скетчем примерно всё понятно, сначала Ардуина ловит код, потом, по нажатию кнопки выдает последний сохраненный. Одно не понял, если приемник на 36КГц, то почему Ардуина выдает сигнал с частотой 38КГц (строка 114). Осталось от исходного скетча? Забыл? Не знал?

Далее аппаратное подключение. Чтобы понять, лучше иметь хрустальный шар, а мой в ремонте. Ну есть в усилке такой ИК датчик, ты к нему параллельно подключился? Т.е. сигнал идет на усилок И на Ардуину? Или у тебя есть другой такой же датчик? Или ты отключил от усилка датчик и подключил к нему Ардуино? В последнем варианте, обвес нужен, т.е. недостаточно питания подать на датчик.

Как правило, если код, полученный Ардуиной не повторяется, точнее часто меняется при нажатии одной и той же кнопки на пульте, это значит, что частоты передатчика и приемника не совпадают. В этом случае уменьшается дальнобойность и появляется больше помех. А уж если протокол неизвестный, тогда совсем беда. Придется вручную ковырять протокол, если нужны коды. В общем, в любом случае RAW коды не будут совпадать на 100%, потому что длительность импульсов плавает от нажатия к нажатию.

Описание ИК протокола на Маранц не видел. У меня ресивер Ямаха с NEC протоколом, насколько помню.

Вообще такие вещи лучше логическим анализатором смотреть..

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

 

LCF_R
Offline
Зарегистрирован: 09.08.2016

Спасибо, что откликнулись! Исправил сообщение, спрятал код. 

Я скопировал исходный скетч, в нем было 38Khz, пробовал менять на 36KHz (т.к. по даташиту приемник работает на частоте 36KHz, как верно подмечено) - ничего существенного не поменялось кроме того, что периодически выскакивали сообщения-предупреждения о том, что там что-то не распознано (пишу с работы, вечером сброшу точный вывод). 

По аппаратному подключению: датчик установлен на плате усилителя, к его контактам я и подпаялся (Data на D6 (9й pin), 5V на +5V (27й pin), землю на GND (29й pin) соответственно вот этой схеме: http://www.prorobot.ru/arduino/nano-v3/nano-shema.png ). Сам усилитель отключен от питания, питание Arduino от USB ПК.

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

Судя по тому, что описано в доках на Marantz: Remote Code: RC-5/ RC-5 Ex. Format

Код моей команды:

System: 16, Command: 00, Extension: 16

LCF_R
Offline
Зарегистрирован: 09.08.2016

Сейчас всё подключено так:

http://storage1.static.itmages.ru/i/16/0809/h_1470771795_1194152_af57690...

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

Теперь стало понятней, что в данный момент всё, что подключено со стороны усилка в какой то степени мешает сигналу с датчика. Плюс кто знает, куда подключен выход датчика (он уходит на разъем, на другую плату, насколько я вижу). И еще, не сильно хорошо, фактически, питать усилитель (фактически питание подключено к усилителю со стороны датчика) от Ардуины, возможно всё, что угодно, от просадки напряжения до выхода и строя каких то элементов в усилителе. Во всяком случае, теоретически, это вполне возможно.

Если известен протокол, то несколько "странно", что он не распознается Ардуиной. Правда это легко может быть из-за усилка, пассивно подключенного к датчику. Лучшим способом было бы подключить "чистый" датчик, т.е. отпаять его от усилителя, сделать правильный обвес (схемы есть в интернете) и проверить. Либо сразу питать Арудину от усилителя, как будет потом. Хорошо бы подсмотреть форму сигнала с датчика осциллографом (не логическим анализатором, а именно осциллографом), чтобы понять, нормальная ли форма сигнала с датчика и не подсаживается ли сигнал. Т.е. смотреть форму и амплитуду. Кстати, если есть осциллограф, то можно сравнить форму сигнала с подключенной Ардуиной и без неё.

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

 

LCF_R
Offline
Зарегистрирован: 09.08.2016

Да, я уже думал, что питание от ардуины - плохо. Я же могу запитать усилитель и при этом держать ардуину подключенной к ПК по USB, чтобы снимать с нее показания? Или не стоит так делать?

Попробовал применть другую библиотеку, вот эту: https://github.com/guyc/RC5 . Она распознавала некоторые команды и выводила в формате (я так понимаю), соответствующему протоколу RC5. Судя по листу кодов Marantz - выдавала значения близкие к этому листу, но при этом был некий % ошибок.

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

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

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

Для пинания датчиков типа TSOP в пдфе где-то там было прописано требование фильтрации их питания. 

Это требование, судя по плате, исполнено, благодаря резистору R251 и С251, С252, но

сие разумное действо было похерено подключение ардуины на пин питания фотоприемника. 

LCF_R
Offline
Зарегистрирован: 09.08.2016

В рабочем варианте питание будет подаваться от датчика на ардуину (а не наоборот, как сейчас сделано), соответственно, питание будет фильтрованное. Не поплохеет ли ардуине\усилителю от питания и по USB, и от датчика, если я включу усилитель?

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

LCF_R пишет:

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

Фотоприемник по питанию должен стоять  ЗА фильтром. Один-одинешенек. 

Никакой ардуины на том же пине не допускается.

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

LCF_R пишет:
Не поплохеет ли ардуине\усилителю от питания и по USB, и от датчика, если я включу усилитель?

За свои деньги можете позволить себе любой каприз =)

LCF_R
Offline
Зарегистрирован: 09.08.2016

ВН пишет:

Фотоприемник по питанию должен стоять  ЗА фильтром. Один-одинешенек. 

Никакой ардуины на том же пине не допускается.

А если подпаяться перед фильтром?

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

LCF_R пишет:
А если подпаяться перед фильтром? 

Подпаяться -то можно, ...... 

но вот откуда мне знать, сколько потребляет схема усилка по 5В и как долго стаб ардуины, или что там выдает +5В, сможет это выдержать? 

т.е. прежде чем паяться, требуется разобраться, ... а можно ли.

Еще возможны всякие накладки со стабилизаторами при обратном включении, правда, +5в обычно мало что может выжечь ..... В общем, тут или копать полную схему усилка или надеяться на авось ...

 

 

 

 

LCF_R
Offline
Зарегистрирован: 09.08.2016

ВН пишет:

Подпаяться -то можно, ...... 

но вот откуда мне знать, сколько потребляет схема усилка по 5В и как долго стаб ардуины, или что там выдает +5В, сможет это выдержать? 

Выдавать +5В будет усилитеь.

ВН пишет:
т.е. прежде чем паяться, требуется разобраться, ... а можно ли.

Не поможете разобраться? Сервисмануал на усилитель: http://dropmefiles.com/9y1ic

 

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

Питать от усилителя это более реальный вариант, 20мА ардуины вряд ли сделают погоду его бп.

 БП это схема Р851 с основным и вспомогательным трансом, выдает 2 питания +5VD и +5VL

ИК-сенсор, схема Р201, питается от +5VL через 100 Ом.

LCF_R
Offline
Зарегистрирован: 09.08.2016

ВН пишет:

 БП это схема Р851 с основным и вспомогательным трансом, выдает 2 питания +5VD и +5VL

Я, честно говоря, слабо представляю чем отличается +5VD от +5VL (и вообще от +5V). Не подскажете откуда мне лучше запитать ардуину?

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

Не подскажу, слишком много неизвестных.

 

 

 

LCF_R
Offline
Зарегистрирован: 09.08.2016

kisoft пишет:

Есть еще вариант, подключить любой другой ИК датчик (TSOP1836 или типа того) 

Скажите, TSOP1736 подойдет?

TSOP1736: http://www.voti.nl/docs/TSOP17.pdf

TSOP1836: http://pdf1.alldatasheet.com/datasheet-pdf/view/26603/VISHAY/TSOP1836.html

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

Насколько я знаю, скорее всего должно подойти. Если кто знает точно, поправят.

У меня есть только TSOP173x, пашет нормально. Судя по ДШ, отличия, прежде всего в форме корпуса и в расположении выводов (цоколевка разная), глубже не копал. Главное, чтобы частота была правильная (последние две цифры TSOP..36). Еще бывают миниатюрные типа TSOP4836 (судя по информации из гугла, сам не использовал).

 

LCF_R
Offline
Зарегистрирован: 09.08.2016

kisoft пишет:

У меня есть только TSOP173x, пашет нормально. 

Так у Вас поучается как раз то, что я собрался покупать. Последние 2 цифры - частота, на которой он работает.

Из даташита TSOP18xx и TSOP17xx разница у них в таблице Basic Characteristics, в верхней строчке. Я не спец в электронике, но на скольтко я понимаю, TSOP17xx потребляют меньше.

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

Если разница только в этом, то для отладки это по-барабану, можно использовать TSOP1736.

Я про TSOP1836 говорил потому что это первое, что вспомнилось :)