1

Тема: Genius SW-HF 5.1 5000 (восстановление микроконтроллерного блока)

http://forum.rcl-radio.ru/uploads/images/2020/02/6be0082dc89a4bf3fba8c760ed38e1e7.png
http://forum.rcl-radio.ru/uploads/images/2020/02/0c6e4e475344ba6ca92704dd412c053b.gif

Паспорт + схема
Данный контент доступен только зарегистрированным пользователям.

бибиотеки
Данный контент доступен только зарегистрированным пользователям.
Данный контент доступен только зарегистрированным пользователям.

тестовый запуск
вход 0
громк макс

#include <Wire.h>
#include <PT2323.h>
#include <PT2258.h>

 PT2323 pt0; 
 PT2258 pt;

void setup() { 
  Wire.begin();
  audio1();
  audio();
}

void loop() {

}

void audio1(){
  pt0.setInput(0); 
  pt0.setMute(0,0,0,0,0,0,0); 
  pt0.setFeature(1,1); 
}

void audio(){
        pt.setVolume(0); //  int 0...79     
      // pt.setVol1(0); //  int 0...79       
      // pt.setVol2(0); //  int 0...79 
      // pt.setVol3(0); //  int 0...79 
      // pt.setVol4(0); //  int 0...79 
      // pt.setVol5(0); //  int 0...79 
      // pt.setVol6(0); //  int 0...79 
        pt.setMute(0); // mute 0 - off / 1 - on
  }

328 hex - Данный контент доступен только зарегистрированным пользователям.
atmega 328
http://forum.rcl-radio.ru/uploads/images/2020/02/62cb37e889c7e91721e01e32dea8321e.png

2

Re: Genius SW-HF 5.1 5000 (восстановление микроконтроллерного блока)

регулировка громкости с регулятора и пульта
селектор входов с кнопок и индикация селектора входов + пульт
КНОПКА И ВЫХОД mute + пульт
КНОПКА И standby + пульт

#define IR_1 0x2FDD02F // Кнопка VOL+
#define IR_2 0x2FD32CD // Кнопка VOL-
#define IR_3 0x2FD5566 // Кнопка MUTE
#define IR_4 0x2FD8888 // Кнопка STANDBY

#define IR_5 0x2FDD02F // Кнопка DVD
#define IR_6 0x2FD32CD // Кнопка TV
#define IR_7 0x2FD5566 // Кнопка GAME
#define IR_8 0x2FD8888 // Кнопка CD/MP3

#include <Wire.h>
#include <PT2323.h>
#include <PT2258.h>
#include <EEPROM.h>
#include <boarddefs.h>
#include <IRremote.h>
 IRrecv irrecv(0); // указываем вывод модуля IR приемника (IR-IN)
 decode_results ir; 
 PT2323 pt0; 
 PT2258 pt;

 int vol,vol_old,in,mute,standby=1;
 byte w,gr1,gr2,moto;
 unsigned long time;

void setup() { 
  irrecv.enableIRIn();
  Serial.begin(9600);
  pinMode(A0,INPUT);// вход регулятора громкости 0...5 В
  pinMode(A1,INPUT);// кнопка MUTE
  pinMode(2,OUTPUT);// ВЫХОД УПР. MUTE
  pinMode(A2,INPUT);// кнопка STANDBY
  pinMode(3,OUTPUT);// ВЫХОД УПР. SRANDBY
  //////// IN ////////////////////////////////
  pinMode(4,INPUT); // in DVD
  pinMode(5,INPUT); // in TV
  pinMode(6,INPUT); // in GAME
  pinMode(7,INPUT); // in CD/MP3
  /////// LED OUTPUT /////////////////////////////
  pinMode(8,OUTPUT); // in DVD
  pinMode(9,OUTPUT); // in TV
  pinMode(10,OUTPUT);// in GAME
  pinMode(11,OUTPUT);// in CD/MP3

  pinMode(12,OUTPUT);// MOUT+
  pinMode(13,OUTPUT);// MOUT-
  
  Wire.begin();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
  vol = EEPROM.read(0)-79;in = EEPROM.read(1);
  audio1();
  audio();
}

void loop() {
  ///////////////////// IR ////////////////////////////////////////////////////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();delay(100);time=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
     if(ir.value==IR_1){vol++;gr1=1;gr2=0;vol_func();audio1();audio();moto=1;}// кнопка VOL+
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;vol_func();audio1();audio();moto=1;}// кнопка >>>>>>
     if(ir.value==IR_2){vol--;gr1=0;gr2=1;vol_func();audio1();audio();moto=1;}// кнопка VOL-
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;vol_func();audio1();audio();moto=1;}// кнопка <<<<<<

     if(ir.value==IR_3&&mute==0){mute=1;audio1();audio();digitalWrite(2,HIGH);delay(300);} 
     if(ir.value==IR_3&&mute==1){mute=0;audio1();audio();digitalWrite(2,LOW);delay(300);}

     if(ir.value==IR_4&&standby==1){standby=1;digitalWrite(3,HIGH);delay(300);}
     if(ir.value==IR_4&&standby==0){standby=0;digitalWrite(3,LOW);delay(300);}

     if(ir.value==IR_5){in=4;audio1();audio();delay(300);}
     if(ir.value==IR_6){in=0;audio1();audio();delay(300);}
     if(ir.value==IR_7){in=1;audio1();audio();delay(300);}
     if(ir.value==IR_8){in=2;audio1();audio();delay(300);}
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

 /////////////////// MUTE /////////////////////////////////////////////////////////////////////////////////////////
  if(analogRead(A1)>900&&mute==0){mute=1;digitalWrite(2,HIGH);audio1();audio();delay(300);}
  if(analogRead(A1)>900&&mute==1){mute=0;digitalWrite(2,LOW);audio1();audio();delay(300);}
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

 /////////////////// STANDBY /////////////////////////////////////////////////////////////////////////////////////////
  if(analogRead(A2)>900&&standby==1){standby=1;digitalWrite(3,HIGH);delay(300);} // усилитель вкл
  if(analogRead(A2)>900&&standby==0){standby=0;digitalWrite(3,LOW);delay(300);}  // усилитель выкл
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////  

 ////////////// INPUT /////////////////////////////////////////////////////////////////////////////////////////////
  if(digitalRead(4)==HIGH){in=4;audio1();audio();w=1;time=millis();delay(300);}  // in DVD
  if(digitalRead(5)==HIGH){in=0;audio1();audio();w=1;time=millis();delay(300);}  // in TV
  if(digitalRead(6)==HIGH){in=1;audio1();audio();w=1;time=millis();delay(300);}  // in GAME
  if(digitalRead(7)==HIGH){in=2;audio1();audio();w=1;time=millis();delay(300);}  // in CD/MP3
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  switch(in){
    case 4: digitalWrite(8,HIGH);digitalWrite(9,LOW);digitalWrite(10,LOW);digitalWrite(11,LOW);break;
    case 0: digitalWrite(8,LOW);digitalWrite(9,HIGH);digitalWrite(10,LOW);digitalWrite(11,LOW);break;
    case 1: digitalWrite(8,LOW);digitalWrite(9,LOW);digitalWrite(10,HIGH);digitalWrite(11,LOW);break;
    case 2: digitalWrite(8,LOW);digitalWrite(9,LOW);digitalWrite(10,LOW);digitalWrite(11,HIGH);break;
    }

  
  if(moto==1){
  if(vol>map(analogRead(A0),0,1023,0,79)){digitalWrite(12,HIGH);digitalWrite(13,LOW);}
  else if(vol<map(analogRead(A0),0,1023,0,79)){digitalWrite(12,LOW);digitalWrite(13,HIGH);}
  else{digitalWrite(12,LOW);digitalWrite(13,LOW);moto=0;}
  }

  if(moto==0){
  vol_old = vol;
  vol = map(analogRead(A0),0,1023,0,79);
  if(vol_old!=vol){audio1();audio();w=1;time=millis();}
  }
  ////// EEPROM /////////////////////////////////////////////// 
  if(millis()-time>10000 && w==1){EEPROM.update(0,vol+79);EEPROM.update(1,in);}
}

void vol_func(){if(vol>79){vol=79;}if(vol<0){vol=0;}}

void audio1(){
  pt0.setInput(in); 
  pt0.setMute(0,0,0,0,0,0,0); 
  pt0.setFeature(1,1); 
}

void audio(){
        pt.setVolume(vol); //  int 0...79     
      // pt.setVol1(0); //  int 0...79       
      // pt.setVol2(0); //  int 0...79 
      // pt.setVol3(0); //  int 0...79 
      // pt.setVol4(0); //  int 0...79 
      // pt.setVol5(0); //  int 0...79 
      // pt.setVol6(0); //  int 0...79 
        pt.setMute(mute); // mute 0 - off / 1 - on
  }

Данный контент доступен только зарегистрированным пользователям.

3

Re: Genius SW-HF 5.1 5000 (восстановление микроконтроллерного блока)

Здравствуйте. В программе темы "Genius SW-HF 5.1 5000 (восстановление микроконтроллерного блока)" непонятная библиотека "boarddefs.h". В стандартных библиотеках Arduino IDE её нет. Буду благодарен, если вышлете эту библиотеку на почту "sa45home@yandex.ru".

4

Re: Genius SW-HF 5.1 5000 (восстановление микроконтроллерного блока)

Она входит в состав IRremote, ее не надо устанавливать

5

Re: Genius SW-HF 5.1 5000 (восстановление микроконтроллерного блока)

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

6 (2024-09-20 02:50:22 отредактировано Reziztor)

Re: Genius SW-HF 5.1 5000 (восстановление микроконтроллерного блока)

Код от liman324 у меня не заработал, по этому мне пришлось переписать.

Протестирован на железе, полностью работоспособен, функционал почти полностью восстановлен, я решил не использовать еепром для сохранения последнего выбранного канала, и при нажатии кнопки выключения(кнопки stand-by) регулятор громкости не крутится в нижнее положениеи как это было в оригинале.

Считаю это несущественно, при желании этот функционал можно добавить.

Коды от пульта поставить на свои.(В этом коде поставлены коды от популярного пульта для ардуинок)

Если управление микросхемами не будет осуществляться, проверьте заданный адрес микросхем, мне пришлось в библиотеках редактировать, для pt2258 - 0x44 , для pt2323 - 0x4A

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

p.s: видео работы :


#include <IRremote.h>
#include <Wire.h>
#include <PT2323.h>
#include <PT2258.h>

#define IR_1 0xFF18E7 // Кнопка VOL+
#define IR_2 0xFF4AB5 // Кнопка VOL-

const unsigned long MOTOR_UP_CODE = 0xFF18E7;    // Код кнопки "вверх" на пульте
const unsigned long MOTOR_DOWN_CODE = 0xFF4AB5;  // Код кнопки "вниз" на пульте
const unsigned long REPEAT_CODE = 0xFFFFFFFF;  // Код повторного нажатия при удерживании

#define IR_5 0xFFA25D // Кнопка DVD
#define IR_6 0xFF629D // Кнопка TV
#define IR_7 0xFFE21D // Кнопка GAME
#define IR_8 0xFF22DD // Кнопка CD/MP3

 PT2323 pt0; 
 PT2258 pt;

// Пин моторчика регулятора громкости
const int motorPin1 = 12; 
const int motorPin2 = 13;

const int irPin = A3;     // Пин для ИК-приемника

const int standbyButton = 2;  // Пин для физической кнопки standby
const int inputButton1 = 4; // Кнопка DVD
const int inputButton2 = 5; // Кнопка TV
const int inputButton3 = 6; // Кнопка GAME
const int inputButton4 = 7; // Кнопка CD/MP3

const unsigned long STANDBY_CODE = 0xFF6897;      // Код кнопки standby на пульте
const unsigned long MUTE_CODE = 0xFFB04F;         // Код кнопки mute на пульте 

// Пин для управления mute
const int mutePin = 3;  // Пин для режима mute
const int standby = A0; //

// Таймер для остановки моторчика
unsigned long motorStopTimer = 0;
const unsigned long motorTimeout = 300;  // 300 мс

// Пины светодиодов для индикации каналов
const int led1 = 8;
const int led2 = 9;
const int led3 = 10;
const int led4 = 11;
const int flashled = A1;

IRrecv irrecv(irPin);
decode_results ir;

  int in,mute=0;
  byte w;
  unsigned long time;


// Пин потенциометра для управления громкостью
const int potPin = A6;

uint8_t ochistka = 0b11000000; // Очистка регистра PT2258

bool motorRunning = false;
bool motorDirection = true;  // true - вверх, false - вниз
unsigned long lastMotorCode = 0;  // Код последней нажатой кнопки для управления моторчиком

// Переменные для хранения состояний
bool standbyMode = true;  // Включаем режим standby при старте
bool muteMode = false;    // Режим mute изначально выключен
int currentChannel = 0;   // Текущий канал (используется в режиме standby)

void controlMotor(bool direction) {
  if (direction) {
    // Вращение в одном направлении
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
  } else {
    // Вращение в обратном направлении
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
  }
  
  motorRunning = true;
  motorDirection = direction;
  motorStopTimer = millis();  // Обновляем таймер при каждом управлении моторчиком
}

void stopMotor() {
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  motorRunning = false;
}

void audio1(){
  pt0.setInput(in); 
  pt0.setMute(0,0,0,0,0,0,0); 
  pt0.setFeature(1,1); 
}

void audio(){
        pt.setVolume(0); //  int 0...79     
      // pt.setVol1(0); //  int 0...79       
      // pt.setVol2(0); //  int 0...79 
      // pt.setVol3(0); //  int 0...79 
      // pt.setVol4(0); //  int 0...79 
      // pt.setVol5(0); //  int 0...79 
      // pt.setVol6(0); //  int 0...79 
        pt.setMute(0); // mute 0 - off / 1 - on
  }

  void start_pt2258(void)  // очистим все регистры PT2258     
{
  Wire.beginTransmission(PT2258_address);  // передаем адрес
  Wire.write(ochistka);                    // команда при старте очистка всех регистров
  Wire.endTransmission();                  // закончили передачу
}

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  Serial.begin(9600);
  Wire.begin();
  Wire.setClock(100000);
  audio();audio1();

    // Настраиваем кнопки как входы
  pinMode(inputButton1, INPUT_PULLUP);
  pinMode(inputButton2, INPUT_PULLUP);
  pinMode(inputButton3, INPUT_PULLUP);
  pinMode(inputButton4, INPUT_PULLUP);
  pinMode(standbyButton, INPUT_PULLUP);
  pinMode(flashled, OUTPUT);  
  // Настраиваем пины светодиодов как выходы
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);

    // Настраиваем пин для управления mute как выход
  pinMode(mutePin, OUTPUT);
  digitalWrite(mutePin, HIGH);  // Изначально mute выключен

  pinMode(standby, OUTPUT);

    // Устанавливаем все светодиоды и моторчик в начальное состояние (выключены)
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  digitalWrite(flashled, HIGH);
  stopMotor();

  start_pt2258();     // очистим все регистры PT2258 

    // Если режим standby включён, не восстанавливаем канал и не включаем светодиоды
  if (standbyMode) {
    // В режиме standby все светодиоды выключены
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    stopMotor();  // Останавливаем моторчик
    digitalWrite(standby, LOW);
    digitalWrite(flashled, HIGH);

    // Выключенный Mute по умолчанию в режиме standby
    digitalWrite(mutePin, HIGH);
  } else {
    digitalWrite(standby, HIGH);
    digitalWrite(flashled, LOW);
    // Восстанавливаем сохранённый канал
    // switchInput(savedChannel);
    // currentChannel = savedChannel;
  }
  irrecv.enableIRIn();  // Включаем прием ИК-сигналов
}

void loop() {
            // Останавливаем мотор, если кнопка не была нажата в течение определённого времени
  if (motorRunning && millis() - motorStopTimer > motorTimeout) {
    stopMotor();
  }

    int potValue = analogRead(A6); // Чтение значения потенциометра (0-1023)
  int volume = map(potValue, 0, 1023, 0, 79); // Преобразование значения потенциометра в диапазон 0-79
  pt.setVolume(volume); // Установка громкости
  delay(40); // Пауза для избежания слишком частого обновления

  // Проверка кнопки standby
  if (digitalRead(standbyButton) == LOW) {
    standbyMode = !standbyMode;  // Переключаем режим standby
    delay(200);  // Задержка для предотвращения дребезга кнопки
    if (standbyMode) {
      // В режиме standby все светодиоды выключены
      digitalWrite(led1, HIGH);
      digitalWrite(led2, HIGH);
      digitalWrite(led3, HIGH);
      digitalWrite(led4, HIGH);
      digitalWrite(flashled, HIGH);
      stopMotor();  // Останавливаем моторчик
    
      digitalWrite(mutePin, HIGH); // mute выключен (в режиме standby mute всегда выключен)
      digitalWrite(standby, LOW);
    } 
    
    else {
      // Восстанавливаем сохранённый канал
      // int savedChannel = EEPROM.read(eepromChannelAddr);
      // switchInput(savedChannel);
      digitalWrite(standby, HIGH);
      digitalWrite(flashled, LOW);
      delay(200);  // Задержка для предотвращения повторного срабатывания
    }
    return;  // Прекращаем выполнение остального кода в режиме standby
  }

         ////////////// INPUT /////////////////////////////////////////////////////////////////////////////////////////////
         if (!standbyMode) 
    {
  if(digitalRead(inputButton1) == LOW){in=4;audio1();audio();w=1;time=millis();delay(100);}  // in DVD
  if(digitalRead(inputButton2) == LOW){in=0;audio1();audio();w=1;time=millis();delay(100);}  // in TV
  if(digitalRead(inputButton3) == LOW){in=1;audio1();audio();w=1;time=millis();delay(100);}  // in GAME
  if(digitalRead(inputButton4) == LOW){in=2;audio1();audio();w=1;time=millis();delay(100);}  // in CD/MP3

  switch(in){
    case 4: digitalWrite(8,LOW);digitalWrite(9,HIGH);digitalWrite(10,HIGH);digitalWrite(11,HIGH);break;
    case 0: digitalWrite(8,HIGH);digitalWrite(9,LOW);digitalWrite(10,HIGH);digitalWrite(11,HIGH);break;
    case 1: digitalWrite(8,HIGH);digitalWrite(9,HIGH);digitalWrite(10,LOW);digitalWrite(11,HIGH);break;
    case 2: digitalWrite(8,HIGH);digitalWrite(9,HIGH);digitalWrite(10,HIGH);digitalWrite(11,LOW);break;
  }
    if(ir.value==IR_5){in=4;audio1();audio();delay(50);}
     if(ir.value==IR_6){in=0;audio1();audio();delay(50);}
     if(ir.value==IR_7){in=1;audio1();audio();delay(50);}
     if(ir.value==IR_8){in=2;audio1();audio();delay(50);}  
  }

  if (irrecv.decode( &ir )) {
    unsigned long code = ir.value;
    Serial.print("0x");Serial.println(ir.value,HEX);irrecv.resume();
      delay(100);
      time=millis(); w=1;

if(!standbyMode){
      if (code == MOTOR_UP_CODE) {
        controlMotor(true); 
        motorDirection = true; // Вращение моторчика в одном направлении (вверх)
        lastMotorCode = MOTOR_UP_CODE;
      } else if (code == MOTOR_DOWN_CODE) {
        controlMotor(false);  // Вращение моторчика в обратном направлении (вниз)
        motorDirection = false;
        lastMotorCode = MOTOR_DOWN_CODE;
      } else if (code == REPEAT_CODE && (lastMotorCode == MOTOR_UP_CODE || lastMotorCode == MOTOR_DOWN_CODE)) {
        // Продолжаем вращение моторчика в том же направлении
        controlMotor(lastMotorCode == MOTOR_UP_CODE);
      } else {
        // Останавливаем мотор, если код не связан с моторчиком
        stopMotor();
        lastMotorCode = 0;  // Сбрасываем код последней кнопки
      }
}

    // Включение/выключение режима standby с пульта
    if (code == STANDBY_CODE || digitalRead(standbyButton) == LOW) {
      standbyMode = !standbyMode;  // Переключаем режим standby
      if (standbyMode) {
        // В режиме standby все светодиоды выключены
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        digitalWrite(flashled, HIGH);
        stopMotor();  // Останавливаем моторчик

        // Устанавливаем пин D3 в LOW
        digitalWrite(mutePin, HIGH);
        digitalWrite(standby, LOW);
      } else {
        // Восстанавливаем сохранённый канал
        // int savedChannel = EEPROM.read(eepromChannelAddr);
        digitalWrite(standby, HIGH);
        digitalWrite(flashled, LOW);
        // digitalWrite(HIGH);
        // switchInput(savedChannel);
      }
      delay(50);  // Задержка для предотвращения повторного срабатывания
    }
    // Включение/выключение режима mute с пульта
    if (code == MUTE_CODE) {
      muteMode = !muteMode;  // Переключаем режим mute
      digitalWrite(mutePin, muteMode ? HIGH : LOW);  // Управляем пином mute
      delay(100);  // Задержка для предотвращения повторного срабатывания
      }
  }
}