ИК Пульт ДУ для колонок JetBalance JB-491

crossovsky
Offline
Зарегистрирован: 22.12.2015

Стоят дома колонки JetBalance JB-491 с проводным пультом. Схема простейшая - коробка 6 кнопок 2 светодиода. В колонках на управление микросхема PT2353H. Разъём 9 проводов, все заняты. Тут была небольшая засада, но об этом ниже.

Захотелось управлять с ИК пульта.

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

Первым делом.. Пульт!

Взял какой-то первый попавшийся, вроде от регистратора, и жестоко его кастрировал. А зачем мне большой, и кнопок черезчур... Особо переделывать не пришлось - только ИК свеодиод перепаял и пару дорожек перекинул перемычками, потому что с кнопок петля была через отрезавшийся верх на чип снизу. Но это, конечно, совсем необязательно, просто мне захотелось так. Уот так уот.

Ставлю клон arduino mini внутрь проводного пульта колонок. Пульт достаточно тонкий, надо все штырьки дуины отпаять. Торцовый для программирования только укоротил - вдруг потребуется для изменения программы.

Взял ИК приёмник, смотрю как разместить.

В углу дуины пропил - пришлось делать, чтобы всё втиснулось аккуратно.

Паяю.

Не работает. Упс. Когда пилил, видел какое-то металлизированное отверстие. Это был переход с дырки GND. Не беда, кинул перемычку.

Проверка - работает!

Теперь нужно отверстие в корпусе.

Примерка.

Паяю. Да, люблю я МГТФ!

И тут выясняется, что постоянного питания в пульте нет.

Пришлось пожертвовать индикацией включения - внутри колонок перекинуть провод +LedPower на Vdd, теперь он включён всегда. Ну, тойсть всегда когда провод колонок в розетку воткнут.

Жаль, не хотел внутрь колонки лезть.

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

Упихиваю.

 

Ну, вот как-то так...

 

А. Код то.

#include <IRremote.h> // это скачанная библиотека

int RECV_PIN = 17; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;

//eventTime, для паузы,  вместо delay,будем использовать функцию millis.
unsigned long eventTime = 0;
//индикация таймера
int timer = 12;


int L2 = 2;  //пины параллельно кнопкам
int L3 = 3;
int L4 = 4;
int L5 = 5;
int L6 = 6;
int L7 = 7;
int L8 = 8;
int L9 = 9;
int L13 = 13; // пин индикация сигнала

void setup() {
  irrecv.enableIRIn(); // включить приемник
  
  pinMode(L2, INPUT); // назначаем пины как входы чтобы нажатием на кнопку их не закоротить на землю, если на них окажется HIGH
  pinMode(L3, INPUT); // А на них окажется HIGH - OUTPUT не может находиться в Z.
  pinMode(L4, INPUT);
  pinMode(L5, INPUT);
  pinMode(L6, INPUT);
  pinMode(L7, INPUT);
  pinMode(L8, INPUT);
  pinMode(L9, INPUT);
  pinMode(L13, OUTPUT); //на нём кнопки нет, только светодиод
  pinMode(timer, OUTPUT);
}
void loop() {




  // Эта конструкция нужна чтобы конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.
  //После появление и пропадания сигнала, состояние сразу не меняется! а ждет  100 миллисекунд.
  //Если 100 миллисекунд не прошло, и поступил еще один сигнал с пульта, тогда таймер заново запускается на 100 миллисекунд.

  //Проще говоря, пока кнопка на пульте нажата таймерПИН остается вКлюченным, если кнопка на пульте отпущена таймерПИН вЫключен.

  // Читаем данные с (ИК) преемника. В момент приема данных у (ИК) приемника на выходе появляется пульсирующий (-)отрицательный сигнал
  if (digitalRead(RECV_PIN) == LOW)
    //  Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, LOW);
    eventTime = millis(), digitalWrite(timer, HIGH);
  //  Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, HIGH)
  if (millis() - eventTime > 100) digitalWrite(timer, LOW)
    //  И переводим все выходы в Z, кроме 13го.
    , pinMode(L2, INPUT), pinMode(L3, INPUT), pinMode(L4, INPUT), pinMode(L5, INPUT)
    , pinMode(L6, INPUT), pinMode(L7, INPUT), pinMode(L8, INPUT), pinMode(L9, INPUT), digitalWrite(L13, LOW);

  if (irrecv.decode(&results)) {
    //ВАЖНО !!! ( 1000809 ) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -
    //-у вашего пульта будет другой код, замените на свой!
    // У моего пульта при нажатии на одну и ту же кнопку, могут отсылаться два разных (КОДА) сигнала,  чтобы обойти эту проблему
    //я использовал Логический оператор "или" (||) if (results.value == 0x1000809 || results.value == 0xF7283C77
    // Теперь неважно какой код отправлен  с кнопки пульта, первый или второй
    // Если ваша кнопка пульта не страдает раздвоением личности, можете написать так if (results.value == 0x1000809

    //Только при условии если, (Одновременно),Обнаружен поступивший код кнопки
    // и выключен ТаймерПИН,"и" "&&" (digitalRead(timer) == HIGH)
    // включаем нужный нам pin, digitalWrite(L13, HIGH);

    if (results.value == 0x10EFF807 || results.value == 0x10EFF807 && (digitalRead(timer) == HIGH) )pinMode(L2, OUTPUT), digitalWrite(L2, LOW), digitalWrite(13, HIGH); // пусть код будет 2 раза - мой пульт по одной кнопке
    if (results.value == 0x10EFD827 || results.value == 0x10EFD827 && (digitalRead(timer) == HIGH) )pinMode(L3, OUTPUT), digitalWrite(L3, LOW), digitalWrite(13, HIGH); // шлёт один код, о если потребуется
    if (results.value == 0x10EF3AC5 || results.value == 0x10EF3AC5 && (digitalRead(timer) == HIGH) )pinMode(L4, OUTPUT), digitalWrite(L4, LOW), digitalWrite(13, HIGH); // другой пульт или второй параллельно...
    if (results.value == 0x10EF1AE5 || results.value == 0x10EF1AE5 && (digitalRead(timer) == HIGH) )pinMode(L5, OUTPUT), digitalWrite(L5, LOW), digitalWrite(13, HIGH);

    if (results.value == 0x10EFBA45 || results.value == 0x10EFBA45 && (digitalRead(timer) == HIGH) )pinMode(L6, OUTPUT), digitalWrite(L6, LOW), digitalWrite(13, HIGH);
    if (results.value == 0x10EF9A65 || results.value == 0x10EF9A65 && (digitalRead(timer) == HIGH) )pinMode(L7, OUTPUT), digitalWrite(L7, LOW), digitalWrite(13, HIGH);
    if (results.value == 0x10EFE817 || results.value == 0x10EFE817 && (digitalRead(timer) == HIGH) )pinMode(L8, OUTPUT), digitalWrite(L8, LOW), digitalWrite(13, HIGH);
    if (results.value == 0x10EFC837 || results.value == 0x10EFC837 && (digitalRead(timer) == HIGH) )pinMode(L9, OUTPUT), digitalWrite(L9, LOW), digitalWrite(13, HIGH);

    irrecv.resume();
  }
}


 

crossovsky
Offline
Зарегистрирован: 22.12.2015

С нуля программу я ещё не в состоянии написать, использовал готовую,
с изменениями под свою задачу.
Брал тут: https://www.youtube.com/watch?v=AjIASUNiWkY - Дмитрий Осипов
 Дмитрий, Спасибо!

Главные изменения - перевод pin2-9 в "INPUT", потому что если "OUTPUT" как в исходнике - то на них будет либо "LOW" (прижаты к земле - нажата кнопка) либо "HIGH" (прижаты к VСС ардуины +5 Вольт) - что чревато выходом порта из строя, когда нажмём кнопку на проводном пульте. А так пин "висит" в воздухе и переводится в OUTPUT LOW по приходу прописанного кода.

На кнопках пульта около 9ти Вольт, но проверка показала - ничего криминального в моём случае не произойдёт - лишняя напруга просядет, уйдя через защитные диоды портов на VCC ардуины, ток кнопки всего 0.5mA, вообще ни о чём, а для того, чтобы колонка "увидела" нажатие на кнопку, напряжение должнно просесть ниже.

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

Не, тут пробовать надо. Я вообще прав? Или ну его, сгорит ещё...

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

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

crossovsky
Offline
Зарегистрирован: 22.12.2015

karl2233, согласен. Но я ЛУТ ещё не освоил ((

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

там осваивать нечего! нарисовал плату, нулёвкой по фольге прошелся, протёр ацетоном(или растворителем), потом А4 сложил в 4 раза, в серединку фольгой вверх, платку и утюгом прогреть секунд 10, потом аккуратно приложить распечатанную на любой(спасибо рекламщикам кидающим в ящики своё непотребство) глянцеовй бумаге и утюгом на максимальной Т, тщательно секунд 35(Т и время опытным путём да и от бумаги зависит) прогревать и разглажывать. потом под горячую воду, хорошо намочить и скатать пальцем бумажку.

усё :) да и видево в сети полно. зато пультик будет как конфетка.

crossovsky
Offline
Зарегистрирован: 22.12.2015

Добавил индикацию включения

/*
   С нуля программу я не cмогу еще написать, использовал готовую,
   с изменениями под свою задачу.
   Брал тут:
   https://www.youtube.com/watch?v=AjIASUNiWkY - Дмитрий Осипов
   Дмитрий, Спасибо!
*/
#include <IRremote.h>
#include <Bounce2.h>

int ledState = HIGH;
Bounce debouncer = Bounce();

int RECV_PIN = 17; //вход ИК приемника - A3
IRrecv irrecv(RECV_PIN);
decode_results results;

//eventTime, для паузы,  вместо delay,будем использовать функцию millis.
unsigned long eventTime = 0;
//индикация таймера
int timer = 12;

int L2 = 2;  //пины параллельно кнопкам
int L3 = 3;
int L4 = 4;
int L5 = 5;
int L6 = 6;
int L7 = 7;
int L8 = 8;
int L9 = 9;
int L13 = 13; // пин индикации приёма

void setup() {
  irrecv.enableIRIn(); // включить приемник
  pinMode(L2, INPUT); // назначаем пины как входы чтобы нажатием на кнопку их не спалить, если окажется HIGH
  pinMode(L3, INPUT); // А на них окажется HIGH - OUTPUT не может находиться в Z.
  pinMode(L4, INPUT);
  pinMode(L5, INPUT);
  pinMode(L6, INPUT);
  pinMode(L7, INPUT);
  pinMode(L8, INPUT);
  pinMode(L9, INPUT);
  pinMode(timer, OUTPUT);

  debouncer.attach(2); // защита от дребезга через библиотеку - пин2
  debouncer.interval(50); // время нажатия для переключения - 50 миллисекунд
  pinMode(L13, OUTPUT);
  digitalWrite(13, ledState);
}

void loop() {

  debouncer.update();
  if ( debouncer.fell() ) {
    ledState = !ledState;
    digitalWrite(13, ledState); // PowerOn Led
  }

  // Эта конструкция нужна чтобы конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.
  //После появление и пропадания сигнала, состояние сразу не меняется! а ждет  100 миллисекунд.
  //Если 100 миллисекунд не прошло, и поступил еще один сигнал с пульта, тогда таймер заново запускается на 100 миллисекунд.

  //Проще говоря, пока кнопка на пульте нажата таймерПИН остается вКлюченным, если кнопка на пульте отпущена таймерПИН вЫключен.

  // Читаем данные с (ИК) преемника. В момент приема данных у (ИК) приемника на выходе появляется пульсирующий (-)отрицательный сигнал
  if (digitalRead(RECV_PIN) == LOW)
    //  Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, LOW);
    eventTime = millis(), digitalWrite(timer, HIGH);
  //  Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, HIGH)
  if (millis() - eventTime > 100) digitalWrite(timer, LOW)
    //  И переводим все выходы в Z
    , pinMode(L2, INPUT), pinMode(L3, INPUT), pinMode(L4, INPUT), pinMode(L5, INPUT)
    , pinMode(L6, INPUT), pinMode(L7, INPUT), pinMode(L8, INPUT), pinMode(L9, INPUT);

  if (irrecv.decode(&results)) {
    //ВАЖНО !!! ( 1000809 ) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -
    //-у вашего пульта будет другой код, замените на свой!
    // У моего пульта при нажатии на одну и ту же кнопку, могут отсылаться два разных (КОДА) сигнала,  чтобы обойти эту проблему
    //я использовал Логический оператор "или" (||) if (results.value == 0x1000809 || results.value == 0xF7283C77
    // Теперь неважно какой код отправлен  с кнопки пульта, первый или второй
    // Если ваша кнопка пульта не страдает раздвоением личности, можете написать так if (results.value == 0x1000809
    //Только при условии если, (Одновременно),Обнаружен поступивший код кнопки
    // и выключен ТаймерПИН,"и" "&&" (digitalRead(timer) == HIGH)
    // включаем нужный нам pin, и pin13 для индикации

    if (results.value == 0x10EFF807 || results.value == 0x10EFF807 && (digitalRead(timer) == HIGH) )pinMode(L2, OUTPUT), digitalWrite(L2, LOW);
    if (results.value == 0x10EFD827 || results.value == 0x10EFD827 && (digitalRead(timer) == HIGH) )pinMode(L3, OUTPUT), digitalWrite(L3, LOW);
    if (results.value == 0x10EF3AC5 || results.value == 0x10EF3AC5 && (digitalRead(timer) == HIGH) )pinMode(L4, OUTPUT), digitalWrite(L4, LOW);
    if (results.value == 0x10EF1AE5 || results.value == 0x10EF1AE5 && (digitalRead(timer) == HIGH) )pinMode(L5, OUTPUT), digitalWrite(L5, LOW);
    if (results.value == 0x10EFBA45 || results.value == 0x10EFBA45 && (digitalRead(timer) == HIGH) )pinMode(L6, OUTPUT), digitalWrite(L6, LOW);
    if (results.value == 0x10EF9A65 || results.value == 0x10EF9A65 && (digitalRead(timer) == HIGH) )pinMode(L7, OUTPUT), digitalWrite(L7, LOW);
    if (results.value == 0x10EFE817 || results.value == 0x10EFE817 && (digitalRead(timer) == HIGH) )pinMode(L8, OUTPUT), digitalWrite(L8, LOW);
    if (results.value == 0x10EFC837 || results.value == 0x10EFC837 && (digitalRead(timer) == HIGH) )pinMode(L9, OUTPUT), digitalWrite(L9, LOW);

    irrecv.resume();

  }

}


 

crossovsky
Offline
Зарегистрирован: 22.12.2015

Ребят, подскажите, всю голову сломал. Можно ли миганием светодиода pin13 подтвердить получение команды по ИК, при этом чтобы индикация включения/выключения не сбилась? Или придётся второй светодиод ставить на свободный порт?

nik_xarik@bk.ru
Offline
Зарегистрирован: 14.10.2021

Здравствуйте у меня такая же акустика можно ли ее запитать в обход блока питания, то есть цель такая запитать его от 12v через АКБ мотоцикла, я заметил что от блок питания идут три провода на плату два синих и один черный,получается к синим надо подать плюс а к черному минус?