Microlab FC550 — это компактная акустическая система формата 2.1. Вынесенный сабвуфер позволяет получить выраженные басы и обеспечивает высокое качество звука, воспроизводимого с любого устройства.
Простое и удобное управление системой обеспечивают регуляторы громкости и дисплей-индикатор, расположенные на передней панели усилителя. Кроме того, управление системой осуществляется с помощью небольшого пульта ДУ.
ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ
УСИЛИТЕЛЬ
- Выходная мощность 54 Вт RMS
- Распределение мощности 15х2+24 Вт
- Частотная характеристика 35-20 000 Гц
- Соотношение сигнал/шум75 дБ
- Разделение каналов 45 дБ
КОЛОНКИ
- Мембрана ВЧ динамика 2,5 дюйм
- Номинальная мощность ВЧ динамика 15 Вт
- Мембрана НЧ динамика 5,25 X-bass дюйм
- Номинальная мощность НЧ динамика 24 Вт
РАЗЪЕМЫ
- Выход 3RCA
- Вход 2 RCA
- Дополнительный вход 3,5 stereo
РАЗМЕРЫ
- Габариты (сателлиты) 100 x 85 x 165 мм
- Габариты (сабвуфер) 258 x 214 x 220 мм
- Габариты (усилитель) 210 x 77 x 200 мм
- Масса нетто изделия 5,80 кг
В этой статье будет рассмотрен вариант восстановления работоспособности акустической системы Microlab FC550, в частности замена нерабочего микроконтроллера в плате управления на Arduino Nano с микроконтроллером Atmega168.
Плата управления
Микроконтроллер расположенный на плате управления SG16C57D управляет работой 2-х разрядного семисегментного индикатора, энкодера, 6-и светодиодов и аудиопроцессора R2S15900. Основной задачей при восстановлении работоспособности акустической системы было полное восстановление всех заявленных производителем функций.
Замена контроллера SG16C57D на плату Arduino Nano (используется микроконтроллер Atmega168) достаточная проста, для этого в первую очередь необходимо выпаять неисправный микроконтроллер и при помощи нескольких проводков подключить плату Arduino Nano согласно следующий распиновке контактов:
Номер вывода SG16C57D | Вывод Arduino Nano | Номер вывода SG16C57D | Вывод Arduino Nano |
2 | +5V | 16 | D6 |
3,4,5 | GND | 17 | D7 |
6 | D12 | 18 | A3 |
7 | A2 | 19 | A1 |
10 | D2 | 20 | D13 |
11 | D3 | 21 | A0 |
12 | D4 | 22 | D10 |
13 | D5 | 23 | D11 |
14 | D8 | 24 | A4 |
15 | D9 | 25 | A5 |
Далее необходимо загрузить скетч в плату Arduino:
#define IR_1 0x2FDD02F // VOLUME UP #define IR_2 0x2FD32CD // VOLUME DOWN #define IR_3 0x2FDAA55 // BASS UP #define IR_4 0x2FDCA35 // BASS DOWN #define IR_5 0x2FDE817 // TREB UP #define IR_6 0x2FDA857 // TREB DOWN #define IR_7 0x2FD6A95 // 3D #define IR_8 0x2FD00FF // POWER #define IR_9 0x2FDB04F // INPUT #include <Wire.h> #include <R2S15900SP.h> // https://github.com/liman324/R2S15900SP.git #include <boarddefs.h> // входит в состав библиотеки IRremote #include <IRremote.h> // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip #include <EEPROM.h> R2S15900SP r2s; IRrecv irrecv(12); // указываем вывод модуля IR приемника decode_results ir; int an, segm,data,i; byte a[2]; bool w,sur_3d; unsigned long times,times0; volatile uint8_t _prevValueAB = 0; volatile uint8_t _currValueAB = 0; volatile int16_t _counter = 0; int position = -999; int old_vol,volume,in,bass,treb; int menu; bool power=1,bassf,trebf,in1,in2,ddd; bool gr1,gr2,q1,q2,q3,q4,q5,q6,mute,k=1; void setup(){ Wire.begin(); Serial.begin(9600); irrecv.enableIRIn(); cli(); TCCR2B |= (1<<CS20)|(1<<CS22); TIMSK2 |= (1<<TOIE2); //F_TIMER2 = 16 000 000 / 128 / 256 = 488 Hz sei(); sur_3d=1;audio();delay(500);sur_3d=0;audio();delay(500);pin1(); pinMode(10,INPUT); // enc clk pinMode(11,INPUT); // enc dt pinMode(A0,INPUT); // A0 button input volume = EEPROM.read(0);in = EEPROM.read(1);bass = EEPROM.read(2)-15;treb = EEPROM.read(3)-15;sur_3d = EEPROM.read(4); if(in>2 || in<1){in=1;} inn(); audio(); } void loop(){ if(irrecv.decode( &ir )) {Serial.print("0x");Serial.println(ir.value,HEX);irrecv.resume();} if(ir.value==0){gr1=0;gr2=0;q1=0;q2=0;q4=0;q5=0;q5=0;q6=0;}// запрет нажатий не активных кнопок пульта //// volume old_vol=volume; if(getPosition() != position){position = getPosition();volume = volume+getPosition(); setPosition(0);menu=0;vol_conf();audio();w=1;times=millis();k=1;} v_old(); if(power==0){ if(ir.value==IR_1){q1=1;q2=0;gr1=1;gr2=0;volume--;vol_conf();cl1();menu=0;} if(ir.value==IR_2){q1=0;q2=1;gr1=0;gr2=1;volume++;vol_conf();cl1();menu=0;} if(ir.value==0xFFFFFFFF && gr1==1 && q1==1){gr2=0;volume--;vol_conf();cl1();menu=0;} if(ir.value==0xFFFFFFFF && gr2==1 && q2==1){gr1=0;volume++;vol_conf();cl1();menu=0;} v_old(); //// bass if(ir.value==IR_4){q5=1;q6=0;gr1=1;gr2=0;bass--;if(bass<-15){bass=-15;}cl1();bassf=1;menu=1;} if(ir.value==IR_3){q5=0;q6=1;gr1=0;gr2=1;bass++;if(bass>15){bass=15;}cl1();bassf=1;menu=1;} if(ir.value==0xFFFFFFFF && gr1==1 && q5==1){gr2=0;bass--;if(bass<-15){bass=-15;}cl1();bassf=1;menu=1;} if(ir.value==0xFFFFFFFF && gr2==1 && q6==1){gr1=0;bass++;if(bass>15){bass=15;}cl1();bassf=1;menu=1;} //// treb if(ir.value==IR_6){q3=1;q4=0;gr1=1;gr2=0;treb--;if(treb<-15){treb=-15;}cl1();trebf=1;menu=2;} if(ir.value==IR_5){q3=0;q4=1;gr1=0;gr2=1;treb++;if(treb>15){treb=15;}cl1();trebf=1;menu=2;} if(ir.value==0xFFFFFFFF && gr1==1 && q3==1){gr2=0;treb--;if(treb<-15){treb=-15;}cl1();trebf=1;menu=2;} if(ir.value==0xFFFFFFFF && gr2==1 && q4==1){gr1=0;treb++;if(treb>15){treb=15;}cl1();trebf=1;menu=2;} //// input if((digitalRead(A0)==0 || ir.value==IR_9) && in==1){in=2;in1=1;in2=0;cl1();} if((digitalRead(A0)==0 || ir.value==IR_9) && in==2){in=1;in1=0;in2=1;cl1();} inn(); //// 3d if(ir.value==IR_7 && sur_3d==0){sur_3d=1;ddd=1;cl1();} if(ir.value==IR_7 && sur_3d==1){sur_3d=0;ddd=0;cl1();} if(sur_3d==1){ddd=1;}else{ddd=0;} } if(menu==0){data=84-volume;a[0]=data/10;a[1]=data%10;} if(menu==1){trebf=0; if(bass>=-9&&bass<=-1){data=abs(bass);a[0]=11;a[1]=data%10;} if(bass<=-10){data=abs(bass);a[0]=12;a[1]=data%10;} if(bass>=0){data=bass;a[0]=data/10;a[1]=data%10;} } if(menu==2){bassf=0; if(treb>=-9&&treb<=-1){data=abs(treb);a[0]=11;a[1]=data%10;} if(treb<=-10){data=abs(treb);a[0]=12;a[1]=data%10;} if(treb>=0){data=treb;a[0]=data/10;a[1]=data%10;} } if(menu==3){a[0]=10;a[1]=10;} if(ir.value==IR_8 && power==1){k=1;power=0;menu=0;cl1();} if(ir.value==IR_8 && power==0){k=1;power=1;cl1();} if(power==0&&k==1){k=0;mute=1;audio();} if(power==1&&k==1){k=0;mute=0;audio();menu=3;in1=0;in2=0;ddd=0;} if(millis()-times>5000&&power==0){w=0;bassf=0;trebf=0;menu=0; EEPROM.update(0,volume);EEPROM.update(1,in);EEPROM.update(2,bass+15);EEPROM.update(3,treb+15);EEPROM.update(4,sur_3d); } }// loop void vol_conf(){if(volume<0){volume=0;}if(volume>84){volume=84;}} void v_old(){if(old_vol!=volume){menu=0;bassf=0;trebf=0;power=0;}} void inn(){if(in==1){in1=1;in2=0;}if(in==2){in2=1;in1=0;}} void cl1(){ir.value=0;delay(200);w=1;times=millis();audio();} void pin0(){pinMode(A1,INPUT);pinMode(A2,INPUT);pinMode(A3,INPUT);pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);pinMode(5,INPUT); pinMode(6,INPUT);pinMode(7,INPUT);pinMode(8,INPUT);pinMode(9,INPUT);pinMode(13,INPUT);} void pin1(){ pinMode(A3,OUTPUT);pinMode(A2,OUTPUT);pinMode(2,OUTPUT);pinMode(3,OUTPUT);pinMode(4,OUTPUT);pinMode(5,OUTPUT);pinMode(6,OUTPUT); pinMode(7,OUTPUT);pinMode(8,OUTPUT);pinMode(9,OUTPUT);pinMode(13,INPUT); pinMode(A1,INPUT); } void audio(){ r2s.setVol_l(volume); // volume left >> int 84...0 === -84...0 dB r2s.setVol_r(volume); // volume_right >> int 84...0 === -84...0 dB r2s.setInput(in, 1, mute); // input >> int 0 === all off | int 1...5 === input 1...5 // gain >> int 0...1 === 0 dB...+4.5 dB // mute >> int 1...0 === mute off...mute on r2s.set_Bass(sur_3d, 3, bass); // surround mode >> int 0...1 === low level...high level // mode selector >> int 0...3 === bypass tone tone&Pseudo_stereo tone&Surround // tone control bass >> int -15...15 === -15dB...+15dB r2s.set_Treb(treb); // tone control treble >> int -15...15 === -15dB...+15dB } ISR(TIMER2_OVF_vect){ switch(i){ case 0: pin1();segm = 10;segment();segm=a[0]; an=0; anod(); segment();break; case 1: pin1();segm = 10;segment();segm=a[1]; an=1; anod(); segment();break; case 2: pin0();pinMode(A1,OUTPUT); if(power==1){pinMode(8,OUTPUT);ch(8,1);ch(A1,0);} if(bassf==1){pinMode(5,OUTPUT);ch(5,1);ch(A1,0);} if(trebf==1){pinMode(4,OUTPUT);ch(4,1);ch(A1,0);} if(in2==1){pinMode(13,OUTPUT);ch(13,1);ch(A1,0);} if(ddd==1){pinMode(2,OUTPUT);ch(2,1);ch(A1,0);} break; case 3: pin0();pinMode(A3,OUTPUT); if(in1==1){pinMode(13,OUTPUT);ch(13,1);ch(A3,0);} } i++;if(i>3){i=0;} bool pinA = digitalRead(10); bool pinB = digitalRead(11); _currValueAB = pinA << 1; _currValueAB |= pinB; switch ((_prevValueAB | _currValueAB)){ case 0b0001: _counter++;break; case 0b0100: _counter--;break; } _prevValueAB = _currValueAB << 2; } int16_t getPosition(){return _counter;} void setPosition(int16_t position){_counter = position;} void segment(){ switch(segm){ // A B C D E F G case 0: ch(4,1);ch(8,1);ch(9,1);ch(6,1);ch(7,1);ch(5,1);ch(2,0);break;// 0 case 1: ch(4,0);ch(8,1);ch(9,1);ch(6,0);ch(7,0);ch(5,0);ch(2,0);break;// 1 case 2: ch(4,1);ch(8,1);ch(9,0);ch(6,1);ch(7,1);ch(5,0);ch(2,1);break;// 2 case 3: ch(4,1);ch(8,1);ch(9,1);ch(6,1);ch(7,0);ch(5,0);ch(2,1);break;// 3 case 4: ch(4,0);ch(8,1);ch(9,1);ch(6,0);ch(7,0);ch(5,1);ch(2,1);break;// 4 case 5: ch(4,1);ch(8,0);ch(9,1);ch(6,1);ch(7,0);ch(5,1);ch(2,1);break;// 5 case 6: ch(4,1);ch(8,0);ch(9,1);ch(6,1);ch(7,1);ch(5,1);ch(2,1);break;// 6 case 7: ch(4,1);ch(8,1);ch(9,1);ch(6,0);ch(7,0);ch(5,0);ch(2,0);break;// 7 case 8: ch(4,1);ch(8,1);ch(9,1);ch(6,1);ch(7,1);ch(5,1);ch(2,1);break;// 8 case 9: ch(4,1);ch(8,1);ch(9,1);ch(6,1);ch(7,0);ch(5,1);ch(2,1);break;// 9 case 10: ch(4,0);ch(8,0);ch(9,0);ch(6,0);ch(7,0);ch(5,0);ch(2,0);break;// case 11: ch(4,0);ch(8,0);ch(9,0);ch(6,0);ch(7,0);ch(5,0);ch(2,1);break;// - case 12: ch(4,0);ch(8,1);ch(9,1);ch(6,0);ch(7,0);ch(5,0);ch(2,1);break;// -1 }} void anod(){ switch(an){ case 0:ch(A2,0);ch(A3,1); break; case 1:ch(A2,1);ch(A3,0); break; }} void ch(int pin, int logic){digitalWrite(pin,logic);}
Усилитель акустической системы мне достался без пульта, поэтому я использовал пульт от другого уст-ва и коды кнопок пульта не соответствуют кодам кнопок пульта от Microlab FC550.
Для поддержки Вашего пульта необходимо прописать коды кнопок в скетч:
#define IR_1 0x2FDD02F // VOLUME UP #define IR_2 0x2FD32CD // VOLUME DOWN #define IR_3 0x2FDAA55 // BASS UP #define IR_4 0x2FDCA35 // BASS DOWN #define IR_5 0x2FDE817 // TREB UP #define IR_6 0x2FDA857 // TREB DOWN #define IR_7 0x2FD6A95 // 3D #define IR_8 0x2FD00FF // POWER #define IR_9 0x2FDB04F // INPUT
Для получения кодов кнопок Вашего пульта загрузите скетч и откройте монитор порта, при нажатии кнопки пульта его код будет отображен в мониторе порта.