Восстановление акустических систем на базе аудиопроцессора R2A15218FP

R2A15218FP — это специализированная интегральная схема (ИС), разработанная компанией Renesas Electronics Corporation (Renesas Electronics America Inc). Микросхема предназначена для обработки аудиосигналов и управления аудиопотоками в различных электронных устройствах. Относится к категории Audio Special Purpose ICs (специализированных ИС для аудиоприложений).

Основные характеристики:

  • 8-канальный высокопроизводительный независимый электронный регулятор громкости с шагом 0,5 дБ в диапазоне от +42 до –95 дБ.
  • Встроенный стереоселектор с 11 входами
  • Управление микшированием (MIX Control):
    • сигнал Cout микшируется с L/Rout;
    • сигнал Swout микшируется с L/Rout.
  • Двухполосный регулятор тембра:
    • Басы (Bass): регулировка от –14 дБ до +14 дБ с шагом 2 дБ;
    • Высокие частоты (Treble): регулировка от –14 дБ до +14 дБ с шагом 2 дБ.
  • Многоканальный вход (8 каналов, две системы).
  • Выход для записи (REC output)
  • Аттенюация входного сигнала (Input ATT) для A/D-преобразователя: 0 / –6 / –12 / –18 дБ.
  • Максимальное выходное напряжение (Vo max): 4,2 В (среднеквадратичное значение), при этом коэффициент общих гармонических искажений составляет 1 %.
  • Коэффициент общих гармонических искажений (Total harmonic distortion rate): 0,001 % в полосе пропускания от 400 Гц до 30 кГц при:
    • частоте (f) = 1 кГц;
    • выходном напряжении (Vo) = 0,5 В (среднеквадратичное значение);
    • сопротивлении нагрузки (RL) = 10 кОм.
  • Уровень выходного шума (Output noise): 1,1 мкВ (при уровне громкости 0 дБ, Rg = 0 Ом, по стандарту JIS-A).
  • Корпус (Package): QFP с 100 выводами.
  • Диапазон напряжения питания (Power-supply voltage range):
    • AVCC: от +6,5 В до +7,5 В;
    • AVEE: от –6,5 В до –7,5 В.
  • Управление цифровое 2-Wire

Структурная схема


Статья которую Вы читаете служит небольшой инструкцией по восстановлению работы  различных аудио систем в которых используется аудиопроцессор R2A15218FP, в том случае когда контроллер аудио системы вышел из строя. В качестве альтернативы вышедшему из строя контроллеру аудио системы служит плата Arduino Nano.

Про ИМС R2A15218FP достаточно мало информации, мне не удалось найти даташит на эту микросхему, но есть даташит на R2A15220FP — r2a15220fp , обе эти микросхемы очень похожи, разница только в кол-ве аудиовходов. Так же мне удалось найти рабочую библиотеку для платформы Arduino на R2A15218FP, которая поддерживает все основные функции аудиопроцессора.

R2A15218FP имеет 11 стерео входов, и так же 2 мульти-входа 7.1, но аудиосистемах как правило используют несколько аудиовходов и еще один мульти-вход.

Подключение в микроконтроллеру, происходит через два пина DATA и CLK, так же можно задействовать пин MUTE, для отключения звука.

Выводы

Пример восстановления работы аудио системы:

  • Основные компоненты:
    • Плата Arduino Nano
    • Дисплей LCD2004 с модулем I2C
    • Часы реального времени (модуль) DS3132
    • Энкодер KY-040
    • IR датчик (модуль)
    • 4-е кнопки
  • Параметры
    • Поддержка до 6 стерео-входов (ограничено программно)
    • Поддержка одного мульти-входа 7.1 (второй ограничен программно)
    • Режим STANDBY с выводом текущего времени
    • Режим MUTE — управляется через вывод 51(MUTE) R2A15218FP
    • Регулировка громкости от -95 до 0 дБ с шагом 1 дБ
    • Аттенюатор выходов от 0 до 42 дБ с шагом 1 дБ
    • Регулировка тембра ВЧ и НЧ от -14 до +14 дБ с шагом 2 дБ
    • Регулировка параметров через энкодер и кнопки управления, пульт ИК полностью дублирует работу энкодера и кнопок управления
    • ШИМ подсветка дисплея
  • Описание работы

Используется два основных меню, это меню регулировки громкости и тембра и меню аттенюаторов выхода

При помощи энкодера можно менять параметры, переключение между меню кнопка SET.

Входы можно менять при помощи кнопки SET_IN, при выборе стерео канала  используйте энкодер

Режим MUTE

Режим STANDBY — содержит выход STANDBY для управлением работы УМЗЧ. В этом режиме подсветка дисплея уменьшается (задается программно) и выводится текущее время. Для установки времени часов в режиме STANDBY нажмите кнопку SW энкодера и удерживайте ее, далее нажмите кнопку SET для коррекции часов, кнопку SET_IN для коррекции минут и сброс секунд кнопка MUTE.

Так как предусмотрена управляемая яркость подсветки дисплея, то можно установить яркость подсветки в основном  режиме и в режиме STANDBY (как правило с пониженной яркостью подсветки), регулировка яркости подсветки осуществляется через скетч:

#define BRIG_H 200 // Яркость 0…255 POWER ON
#define BRIG_L 50 // Яркость 0…255 POWER OFF

Подсветка — убрать перемычку с модуля I2C PCF8574 и подключить вывод модуля к цифровому выходу Arduino D6. Перед подключением замерить ток подсветки который не должен превышать 20 мА (у моего модуля ток не более 15 мА, замер производить между контактами перемычки).

 

Максимальный выходной ток одного выхода Arduino Nano не должен превышать 40 мА.

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

#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B850AF // Кнопка IN
#define IR_6 0x33B844BB // Кнопка SET
#define IR_7 0x33B8946B // Кнопка MUTE
#define IR_8 0x33B800FF // Кнопка STANDBY (POWER)

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

Фото проекта

Скетч

// R2A15218FP
#define DATA    2
#define CLK     3
// ENCODER
#define DT_EN   9
#define CLK_EN  8
#define SW_EN   10
// IR_PIN
#define IR_PIN  12
// LCD_LED - яркость подсветки LCD
#define BRIG_H  200      // Яркость 0...255 POWER ON - мерьте ток после 200, больше 20 мА нельзя.
#define BRIG_L  50       // Яркость 0...255 POWER OFF
// BUTTON - кнопки
#define SET     A0 
#define IN_SET  A1 
#define POWER   A2 
#define MUTE    A3 
// IR - коды кнопок
#define IR_SET    0x2FDAA55
#define IR_OK     0x2FDB24D
#define IR_UP     0x2FDD02F
#define IR_DW     0x2FD32CD
#define IR_IN     0x2FD6A95
#define IR_POWER  0x2FD00FF
#define IR_MUTE   0x2FDB04F
// OUTPUN PIN - пины управления
#define PIN_MUTE     4
#define PIN_STANDBY  5
#define PIN_SOUND    13
#define PIN_MULTI    11

#include "Arduino.h"
#include <Librarie_R2A15218FP_V1_1.h> // http://rcl-radio.ru/wp-content/uploads/2026/02/Librarie_R2A15218FP_V1_1.zip
#include <Wire.h>
#include <LiquidCrystal_I2C.h>  // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip       
#include <boarddefs.h>          // входит в состав библиотеки IRremote
#include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <DS3231.h>             // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip

 Librarie_R2A15218FP_V1_1 librarie_R2A15218FP_V1_1(DATA, CLK); 
 DS3231 clock;RTCDateTime DateTime;
 LiquidCrystal_I2C lcd(0x27,20,4);  // Устанавливаем дисплей
 IRrecv irrecv(IR_PIN); 
 Encoder myEnc(DT_EN, CLK_EN);
 decode_results ir; 

// Настройки громкости 
int cch_volume = 0;     // Центральный канал (Cch) // Диапазон регулировки: –95…+42 дБ (ослабление + усиление)      // int -95 ... 42 | step 1
int srch_volume = 0;    // Правый тыловой канал (SRch) // Диапазон регулировки: –95…+42 дБ (ослабление + усиление)  // int -95 ... 42 | step 1
int slch_volume = 0;    // Левый тыловой канал (SLch) // Диапазон регулировки: –95…+42 дБ (ослабление + усиление)   // int -95 ... 42 | step 1
int swch_volume = 0;    // Сабвуфер (SWch) // Диапазон регулировки: –95…+42 дБ (ослабление + усиление)              // int -95 ... 42 | step 1
int flch_volume = 0;    // Левый фронтальный канал (FLch) — базовое ослабление // Диапазон: –95…0 дБ                // int -95 ... 0  | step 1
int flch_volume_up = 0; // Левый фронтальный канал (FLch) - усиление // Диапазон усиления: 0…+42 дБ                // int  0 ... 42  | step 1
int frch_volume = 0;    // Правый фронтальный канал (FRch) — базовое ослабление // Диапазон: –95…0 дБ               // int -95 ... 0  | step 1
int frch_volume_up = 0; // Правый фронтальный канал (FRch) - усиление // Диапазон усиления: 0…+42 дБ                // int  0 ... 42  | step 1

// Настройки эквалайзера
int bass = 0;             // Регулировка басов (BASS) // Диапазон: –14…+14 дБ                                       // int -14 ... 14 | step 2                                    
int treble = 0;           // Регулировка высоких частот (TREBLE)  // Диапазон: –14…+14 дБ                           // int -14 ... 14 | step 2      

int sl_sr_vol_input = 0;  // SL/SR Vol INPUT
     // Multi IN1    int 0
     // Multi IN2    int 1
     // S(R/L)CIN    int 2
     // SB(R/L)CIN   int 3

int l_r_vol_input = 0;   // L/R Vol INPUT
     // Bypass MAIN  int 0
     // Multi IN1    int 1
     // Multi IN2    int 3

int rec_i_o = 0;  // Переключение REC I/O (воспроизведение/запись)
    // int 0 — REC OUTPUT
    // int 1 — REC INPUT
    
int input_sub = 0;       // Вспомогательный вход (INPUT SUB) | int 0... 15  
int input_main = 0;      // Основной вход (INPUT MAIN) | int 0 ... 15

int rec_m_s = 0;         // REC input Main or Sub
    // int 0 — MAIN
    // int 1 — SUB

// Каналы записи (многоканальная система)
int rec5 = 0;        // Канал REC 5  // 0 — неактивен (по умолчанию)
int rec4 = 0;        // Канал REC 4  // 0 — неактивен (по умолчанию)
int rec3 = 0;        // Канал REC 3  // 0 — неактивен (по умолчанию)
int rec2 = 0;        // Канал REC 2  // 0 — неактивен (по умолчанию)
int rec1 = 0;        // Канал REC 1  // 0 — неактивен (по умолчанию)

int att = 0;     // ATT ouy ADC
    //   int 0 — 0 дБ (без ослабления)
    //   int 1 — –6 дБ
    //   int 2 — –12 дБ
    //   int 3 — –18 дБ (максимальное ослабление)

int c_sw_v = 0;      // C/SW Vol INPUT 
    // int 0 — Multi IN1 
    // int 1 — Multi IN2 

int mix = 0;           // Mix/Tone
    // int 0 - Tone
    // int 1 - Tone + Mix

int bypass = 1;       // Bypass/Tone
    // int 1 - Bypass
    // int 0 - Tone

int volume;
int cch_att, srch_att, slch_att, swch_att, flch_att, frch_att;
long time0,oldPosition  = -999,newPosition;
bool power,w,www,mute,gr1,gr2;
int menu1,menu0,menu,temp0,vol_d,q,z1,z0,z,w2[4],bass_d,treb_d,par,z_old;
int in_x,in_time;
 byte mesto2[8]={0,10,0,10,0,10,0,10};
 byte mesto3[8]={0,0,1,1,2,2,3,3};
 int in_ch, in_set;
 int hour,minut,secon;
 bool stby=0;// поставитбь 1, если надо STANDBY при подачи питания

void setup() {
  irrecv.enableIRIn();lcd.init();clock.begin();lcd.backlight();Serial.begin(9600);
  pinMode(SW_EN,INPUT);  // МЕНЮ КНОПКА SW энкодера
  pinMode(6,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ - менять пин нельзя
  pinMode(PIN_STANDBY,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ STANDBY
  pinMode(PIN_SOUND,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ STANDBY
  pinMode(PIN_MUTE,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ MUTE
  pinMode(PIN_MULTI,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ MUTE
  pinMode(SET,INPUT_PULLUP);   // КНОПКА SET
  pinMode(IN_SET,INPUT_PULLUP);   // КНОПКА INPUT_SET
  pinMode(POWER,INPUT_PULLUP);   // КНОПКА POWER
  pinMode(MUTE,INPUT_PULLUP);   // КНОПКА MUTE
  analogWrite(6, BRIG_H);// больше 200 не делать
  digitalWrite(PIN_STANDBY,HIGH);
  lcd.setCursor(3,1);lcd.print("Sound Processor");lcd.setCursor(5,2);lcd.print("R2A15218FP"); delay(1000);lcd.clear();
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  delay(100);
  digitalWrite(PIN_SOUND,HIGH);
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
  volume = EEPROM.read(0)-95;bass = EEPROM.read(1)-7;treble = EEPROM.read(2)-7;
  cch_att=EEPROM.read(3);srch_att=EEPROM.read(4);slch_att=EEPROM.read(5);swch_att=EEPROM.read(6);
  flch_att=EEPROM.read(7); frch_att=EEPROM.read(8);
  in_set=EEPROM.read(9); in_ch=EEPROM.read(10);
  input_main = in_ch;
  switch(in_set){
      case 0: l_r_vol_input = 0;break;
      case 1: l_r_vol_input = 1;break;
      }
  w2_arr();audio();
}

void loop() {
   if(in_set==1){digitalWrite(PIN_MULTI,HIGH);}else{digitalWrite(PIN_MULTI,LOW);}
   DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;

   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time0=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  

   if(power==0){
   if((ir.value==IR_OK||digitalRead(SW_EN)==LOW)&&menu0==0){menu++;delay(200);time0=millis();cl1();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}// меню 0
   if((ir.value==IR_OK||digitalRead(SW_EN)==LOW)&&menu0==1){menu1++;delay(200);time0=millis();cl1();in_x=0;w=1;if(menu1>5){menu1=0;}}// меню 1
   if(ir.value==IR_IN||digitalRead(IN_SET)==LOW){if(in_x==1){in_set++;}cl();time0=millis();in_x=1;w=1;www=1;menu0=100;menu=100;if(in_set>1){in_set=0;}
    switch(in_set){
      case 0: l_r_vol_input = 0;break;
      case 1: l_r_vol_input = 1;break;
      }
   }// IN_SET  

   if(ir.value==IR_SET||digitalRead(SET)==LOW){menu0++;if(menu0>1){menu0=0;}cl();in_x=0;w2_arr();time0=millis();w=1;lcd.setCursor(4,1);delay(300);lcd.clear();} 
   
   if((ir.value==IR_MUTE||digitalRead(MUTE)==LOW)&&mute==0){mute=1;in_x=0;menu0=100;cl();lcd.setCursor(8,1);lcd.print("MUTE");digitalWrite(PIN_MUTE,HIGH);delay(500);}// mute on
   if((ir.value==IR_MUTE||digitalRead(MUTE)==LOW)&&mute==1){mute=0;cl();time0=millis();w=1;w2_arr();menu0=0;menu=0;myEnc.write(0);digitalWrite(PIN_MUTE,LOW);delay(500);}// mute off
  }// power 0
   
   if((ir.value==IR_POWER||digitalRead(POWER)==LOW||stby==1)&&power==0){stby=0;power=1;in_x=0;cl();lcd.setCursor(5,1);lcd.print("POWER  OFF");menu0=100;delay(3000);analogWrite(6,BRIG_L);digitalWrite(PIN_MUTE,HIGH);}// power off
   if((ir.value==IR_POWER||digitalRead(POWER)==LOW)&&power==1){power=0;analogWrite(6, BRIG_H);cl();lcd.setCursor(5,1);lcd.print("POWER   ON ");w=1;w2_arr();menu0=0;myEnc.write(0);mute=1;audio();delay(3000);digitalWrite(PIN_MUTE,LOW);cl();}// power on
 
 if(power==0){digitalWrite(PIN_STANDBY,HIGH);
   byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
   byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
   byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000}; 
   byte a4[8] = {0b10000,0b11000,0b11100,0b11110,0b11100,0b11000,0b10000,0b00000}; //>
   byte a5[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(3,a4);lcd.createChar(4,a5);
  }  
   if(power==1){digitalWrite(PIN_STANDBY,LOW);
      byte v1[8] = {7,7,7,7,7,7,7,7};
      byte v2[8] = {7,7,0, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 28, 28, 0, 0, 0, 0, 28, 28};
      byte v6[8] = {28,28,28,28,28,28,28,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 0,7,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
   byte a[6];
   byte i0,d1,d2,d3,d4,d5,d6,e1,e2,e3;
  lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
 
     a[0]=DateTime.hour/10;
     a[1]=DateTime.hour%10;
     a[2]=DateTime.minute/10;
     a[3]=DateTime.minute%10;
     a[4]=DateTime.second/10;
     a[5]=DateTime.second%10;
 
 for(int i=0;i<6;i++){
      switch(i){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
        case 4: e1=14,e2=15,e3=16;break;
        case 5: e1=17,e2=18,e3=19;break;
        }
      switch(a[i]){
        case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
 
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  if(digitalRead(SW_EN)==LOW&&digitalRead(SET)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2022, 9, 15, hour, minut, secon);delay(100);}    // SET
  if(digitalRead(SW_EN)==LOW&&digitalRead(IN_SET)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2022, 9, 15, hour, minut, secon);delay(100); }// IN
  if(digitalRead(SW_EN)==LOW&&digitalRead(MUTE)==LOW){secon=0; clock.setDateTime(2022, 9, 15, hour, minut, secon);delay(100); }                      // MUTE
  } 
/////////////////////////////// MENU0 = VOLUME TERBLE BASS ///////////////////////////////////////////////////////////////////////
  if(menu0==0){ 
    switch(menu){
      case 0: temp0 = volume;q=0;break;
      case 1: temp0 = bass;q=1;break;
      case 2: temp0 = treble;q=2;break;
      }
 
     if(ir.value==IR_UP){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_DW){temp0--;gr1=0;gr2=1;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка <<<<<<   
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;w2[q]=1;www=1;} 
 
     switch(menu){
      case 0: volume = temp0;vol_func();break;
      case 1: bass = temp0;bass_func();break;
      case 2: treble = temp0;treb_func();break;
      }
   
   au();
   for(int i=0;i<3;i++){if(menu==i){lcd.setCursor(0,i);lcd.write((uint8_t)3);}else{lcd.setCursor(0,i);lcd.print(" ");}}
   lcd.setCursor(1,0);lcd.print("VOLUME ");if(volume>=0){lcd.print(" ");}lcd.print(volume);lcd.print(" ");vol_d=map(volume,-95,0,1,24);
   lcd.setCursor(1,1);lcd.print("BASS   ");if(bass>=0){lcd.print(" ");}lcd.print(bass*2);lcd.print(" ");bass_d=map(bass,-7,7,1,24);
   lcd.setCursor(1,2);lcd.print("TREBLE ");if(treble>=0){lcd.print(" ");}lcd.print(treble*2);lcd.print(" ");treb_d=map(treble,-7,7,1,24);
   lcd.setCursor(0,3);lcd.print(">INPUT ");
     switch(in_set){
      case 0: lcd.print("MAIN CH_");lcd.print(in_ch+1);break;
      case 1: lcd.print("MULTI_1  7.1");in_ch;break;
    //  case 2: lcd.print("MULTI_2  7.1");in_ch;break;
      }
 
 
   for(int n=0;n<3;n++){if(w2[n]==1){
   switch(n){
    case 0: par = vol_d;break;
    case 1: par = bass_d;break;
    case 2: par = treb_d;break; 
    } 
 
   for(z=0,z0=0,z1=0;z<=par;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+12,n);lcd.write((uint8_t)0);lcd.setCursor(z0+1+12,n);z_old=7-par/3;while(z_old>0){z_old=z_old-1;lcd.write((uint8_t)4);}}}
   if(z1==3){lcd.setCursor(z0+12,n);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+12,n);lcd.write((uint8_t)2);}w2[n]=0;}
   }}// menu0 = 0
///////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////
 
 if(menu0==1){
     switch(menu1){
      case 0: temp0 = cch_att;break;
      case 1: temp0 = srch_att;break;
      case 2: temp0 = slch_att;break;
      case 3: temp0 = swch_att;break;
      case 4: temp0 = flch_att;break;
      case 5: temp0 = frch_att;break;
      }
 
     if(ir.value==IR_UP){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_DW){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;www=1;}// кнопка <<<<<<     
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;www=1;} 
 
     switch(menu1){
      case 0: cch_att = temp0;cch_att_func();break;
      case 1: srch_att = temp0;srch_att_func();break;
      case 2: slch_att = temp0;slch_att_func();break;
      case 3: swch_att = temp0;swch_att_func();break;      
      case 4: flch_att  = temp0;flch_att_func();break;
      case 5: frch_att  = temp0;frch_att_func();break;
      }
 
  au();
  for(int i=0;i<6;i++){if(menu1==i){lcd.setCursor(mesto2[i],mesto3[i]);lcd.write((uint8_t)3);}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
 
  lcd.setCursor(1,0);lcd.print("AT_C  ");lcd.print(cch_att);lcd.print(" ");lcd.setCursor(11,0);lcd.print("AT_SR ");lcd.print(srch_att);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("AT_SL ");lcd.print(slch_att);lcd.print(" ");lcd.setCursor(11,1);lcd.print("AT_SW ");lcd.print(swch_att);lcd.print(" ");
  lcd.setCursor(1,2);lcd.print("AT_FL ");lcd.print(flch_att);lcd.print(" ");lcd.setCursor(11,2);lcd.print("AT_FR ");lcd.print(frch_att);lcd.print(" ");
 // lcd.setCursor(1,3);lcd.print("LOUND ");lcd.print(abs(loun));lcd.print(" ");lcd.setCursor(11,3);

 
 } // menu0 = 1

////////////////////////// GAIN IN /////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){ menu0=100; 
 
    if (newPosition != oldPosition) {oldPosition = newPosition;
    in_ch=in_ch+newPosition;myEnc.write(0);newPosition=0;time0=millis();www=1;w=1;in_func();input_main = in_ch;
    } 

     if(ir.value==IR_UP){in_ch++;gr1=1;gr2=0;cl1();time0=millis();www=1;w=1;in_func();input_main = in_ch;}// кнопка > 
     if(ir.value==IR_DW){in_ch--;gr1=0;gr2=1;cl1();time0=millis();www=1;w=1;in_func();input_main = in_ch;}// кнопка <
 
  au();
  if(in_set==0){lcd.setCursor(5,1);lcd.print("MAIN CH_");lcd.print(in_ch+1);}
  if(in_set==1){lcd.setCursor(6,1);lcd.print("MULTI_1 ");}
 // if(in_set==2){lcd.setCursor(6,1);lcd.print("MULTI_2 ");}
  }
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){in_time=3000;}else{in_time=10000;}
if(millis()-time0>in_time&&w==1&&mute==0&&power==0){if(menu0==1){cl();}w=0;if(menu0!=0){cl();}menu0=0;menu=0;in_x=0;w2_arr();
   EEPROM.update(0,volume+95);EEPROM.update(1,bass+7);EEPROM.update(2,treble+7);
   EEPROM.update(3,cch_att);EEPROM.update(4,srch_att);EEPROM.update(5,slch_att);
   EEPROM.update(6,swch_att);EEPROM.update(7,flch_att);EEPROM.update(8,frch_att);
   EEPROM.update(9,in_set);EEPROM.update(10,in_ch);
   }
 
  }

void audio(){
   if(volume+flch_att>0){flch_volume=0;flch_volume_up=volume+flch_att;}else{flch_volume=volume+flch_att;flch_volume_up=0;}
   if(volume+flch_att>0){frch_volume=0;frch_volume_up=volume+flch_att;}else{frch_volume=volume+flch_att;frch_volume_up=0;}
   librarie_R2A15218FP_V1_1.R2A15218FP_V1_1(rec_i_o, bass*2, l_r_vol_input, input_sub, input_main, treble*2, flch_volume_up, flch_volume, rec_m_s, rec5, rec4, rec3, rec2, rec1, frch_volume_up, frch_volume, att, c_sw_v, swch_volume, cch_volume, sl_sr_vol_input, srch_volume, slch_volume, mix, bypass); 
  }

void to_Timer(){newPosition = myEnc.read()/4;}  
void vol_func(){if(volume<-95){volume=-95;}if(volume>0){volume=0;}}
void treb_func(){if(treble<-7){treble=-7;}if(treble>7){treble=7;}}
void bass_func(){if(bass<-7){bass=-7;}if(bass>7){bass=7;}}
void au(){if(www==1){audio();www=0;}}
void w2_arr(){w2[0]=1;w2[1]=1;w2[2]=1;w2[3]=1;}
void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(200);} 
void cch_att_func(){if(cch_att<0){cch_att=0;}if(cch_att>42){cch_att=42;}}
void srch_att_func(){if(srch_att<0){srch_att=0;}if(srch_att>42){srch_att=42;}}
void slch_att_func(){if(slch_att<0){slch_att=0;}if(slch_att>42){slch_att=42;}}
void swch_att_func(){if(swch_att<0){swch_att=0;}if(swch_att>42){swch_att=42;}}     
void flch_att_func(){if(flch_att<0){flch_att=0;}if(flch_att>42){flch_att=42;}}
void frch_att_func(){if(frch_att<0){frch_att=0;}if(frch_att>42){frch_att=42;}}
void in_func(){if(in_ch>5){in_ch=0;}if(in_ch<0){in_ch=0;}}

Пины подключения, коды пульта указаны в скетче. Кнопки подключаются напрямую к пинам Arduino, без резисторов, нажатие кнопки = замыкание на GND.

Обсуждение на форуме — http://forum.rcl-radio.ru/viewtopic.php?pid=12251#p12251

Добавить комментарий

Войти с помощью: