На аудиопроцессоре TDA7313 с использованием Arduino, можно сделать простой но функциональный регулятор тембра и громкости. Микросхема TDA7313 имеет три стерео входа, регуляторы тембра НЧ и ВЧ, тонкомпенсация и четыре выхода (псевдоквадро). Управление осуществляется с помощью I2C. Обвязка минимальная — несколько конденсаторов и два резистора. Номинальное напряжение питания 9В.
Основные характеристики TDA7313
- Напряжение питания 6…10 В (9 В рекомендуемое)
- КНИ не более 0,01 %
- Отношение сигнал / шум 106 дБ
- Разделение каналов на частоте 1 кГц 103 дБ
- Регулировка громкости от -78.75 до 0 дБ (0…63 уровня)
- Регулировка тембра НЧ и ВЧ ±14 дБ (-7…+7)
- Регулировка аттенюаторов независимое для каждого выхода от -38.75 до 0 дБ (шаг 1,25 дБ)
- Регулировка предусилителя от 0 до 11.25 дБ (шаг 3,75 дБ)
Для упрощения регулировки параметрами аудиопроцессора при помощи Arduino можно воспользоваться библиотекой — https://github.com/liman324/TDA7313.git , TDA7313.zip
Тестовый скетч
#include <Wire.h> #include <TDA7313.h> TDA7313 tda; void setup(){ Serial.begin(9600);Wire.begin(); audio(); } void loop(){} void audio(){ tda.setVolume(55); // громкость 0...63 tda.setAttLR(0); // аттенюатор LR 0...31 tda.setAttRR(0); // аттенюатор RR 0...31 tda.setAttLF(0); // аттенюатор LF 0...31 tda.setAttRF(0); // аттенюатор RF 0...31 tda.setSwitch(0,0,0); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3 tda.setBass(0); // тембр НЧ -7...+7 tda.setTreble(0); // тембр ВЧ -7...+7 }
Далее показан пример скетча в котором в качестве регулировки всех основных параметров используется энкодер KY-040 и одна кнопка. При помощи энкодера осуществляется регулировка громкости и тембра в основном меню, и регулировка предусиления (для каждого входа отдельно), включение режима тонкомпенсации, аттенюатор выходов в дополнительном меню, которое активируется при удержании кнопки энкодера. Кнопка которая подключена к цифровому входу Arduino используется для переключения входа.
Информация о состоянии основных параметров выводится на LCD дисплея LCD1602 на базе контроллера HD44780.
Плата Arduino Nano аудиопроцессор TDA7313 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).
Плата | Пин SDA | Пин SCL |
---|---|---|
Arduino Uno, Nano, Pro и Pro Mini | A4 | A5 |
Все параметры заносятся в энергонезависимую память.
TDA7313.zip
#include <Wire.h> #include <MsTimer2.h> #include <LiquidCrystal.h> #include <Encoder.h> #include <EEPROM.h> #include <TDA7313.h> TDA7313 tda; Encoder myEnc(9, 8);//CLK, DT подключение энкодера LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 подключение LCD byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000}; byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000}; unsigned long newPosition,time,oldPosition = -999; int vol,vol_d,menu,w,z,bass_d,bass,treb_d,treb,i,menu1,in,gain,gain1,gain2,gain3,loud,lr,rr,lf,rf; void setup(){ Serial.begin(9600);Wire.begin(); lcd.begin(16, 2);lcd.createChar(0,a1); lcd.createChar(1,a2); pinMode(A0,INPUT);// КНОПКА ЭНКОДЕРA pinMode(12,INPUT);// КНОПКА IN MsTimer2::set(1, to_Timer);MsTimer2::start(); vol = EEPROM.read(0);bass = EEPROM.read(1)-7;treb = EEPROM.read(2)-7;in = EEPROM.read(3); gain1 = EEPROM.read(4);gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);loud = EEPROM.read(7); lr = EEPROM.read(8);rr = EEPROM.read(9);lf = EEPROM.read(10);rf = EEPROM.read(11); if(in==0){gain=gain1;} if(in==1){gain=gain2;} if(in==2){gain=gain3;} audio(); } void to_Timer(){ //функция таймера newPosition = myEnc.read()/4;} void loop(){ if((analogRead(A0)<900)&&menu1==0){menu++;cl();myEnc.write(0);i++;time=millis();w=1;if(menu>2){menu=0;}}// меню if((analogRead(A0)>900)){i=0;}if(i>3){cl();lcd.print(" MENU 2 ");delay(500);cl();menu1=1;menu=100;} if((analogRead(A0)<900)&&menu1>0){menu1++;cl();myEnc.write(0);time=millis();w=1;if(menu1>6){cl();menu1=0;menu=0;}}// меню 1 //////////////////////////////////////// Volume 0...63 дБ ////////////////////////////////////// if(menu==0){ if (newPosition != oldPosition) { oldPosition = newPosition; vol=vol+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(vol>63){vol=63;}if(vol<0){vol=0;}audio();} lcd.setCursor(0,0);lcd.print("Volume "); lcd.print(-63+vol);lcd.setCursor(13,0);lcd.print("dB");vol_d=vol/3; if(vol_d>=0){for(z=0;z<=vol_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((vol_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} lcd.setCursor(13,1);lcd.print(vol);} ////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////// индикация тембр НЧ -14...14 дБ /////////////////// if(menu==1){ if (newPosition != oldPosition) { oldPosition = newPosition; bass=bass+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();} lcd.setCursor(0,0);lcd.print("Bass "); lcd.print(bass*2);lcd.setCursor(13,0);lcd.print("dB");bass_d=bass+7; if(bass_d>=0){for(z=0;z<=bass_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}} } ///////////////////////////////////////////////////////////////////////////////////// /////////////////////// индикация тембр ВЧ -14...14 дБ /////////////////// if(menu==2){ if (newPosition != oldPosition) { oldPosition = newPosition; treb=treb+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();} lcd.setCursor(0,0);lcd.print("Treble "); lcd.print(treb*2);lcd.setCursor(13,0);lcd.print("dB");treb_d=treb+7; if(treb_d>=0){for(z=0;z<=treb_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}} } ///////////////////////////////////////////////////////////////////////////////////// if(digitalRead(12)==HIGH){in++;lcd.clear();time=millis();w=1;if(in>2){in=0;}if(in<0){in=2;}audio();lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);delay(1000);} ///////////////////////////////////// GAIN ////////////////////////////////////////// if(menu1==1){ if(in==0){gain=gain1;} if(in==1){gain=gain2;} if(in==2){gain=gain3;} if (newPosition != oldPosition) { oldPosition = newPosition; gain=gain+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(gain>3){gain=3;}if(gain<0){gain=0;}audio();} if(in==0){gain1=gain;} if(in==1){gain2=gain;} if(in==2){gain3=gain;} lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);lcd.print(" Gain ");lcd.print(gain); } /////////////////////////////// LOUDNESS ////////////////////////////////////////// if(menu1==2){ if (newPosition != oldPosition) { oldPosition = newPosition; loud=loud+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(loud>1){loud=0;}if(loud<0){loud=1;}audio();} lcd.setCursor(0,0);lcd.print("LOUDNESS ");if(loud==1){lcd.print("ON ");}else{lcd.print("OFF");} } ////////////////////////////////// att LR ////////////////////////////////////////////// if(menu1==3){ if (newPosition != oldPosition) { oldPosition = newPosition; lr=lr+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(lr>31){lr=31;}if(lr<0){lr=0;}audio();} lcd.setCursor(0,0);lcd.print("Speaker LR ");lcd.print(lr); } //////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// att LF ////////////////////////////////////////////// if(menu1==4){ if (newPosition != oldPosition) { oldPosition = newPosition; lf=lf+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(lf>31){lf=31;}if(lf<0){lf=0;}audio();} lcd.setCursor(0,0);lcd.print("Speaker LF ");lcd.print(lf); } //////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// att RF ////////////////////////////////////////////// if(menu1==5){ if (newPosition != oldPosition) { oldPosition = newPosition; rf=rf+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(rf>31){rf=31;}if(rf<0){rf=0;}audio();} lcd.setCursor(0,0);lcd.print("Speaker RF ");lcd.print(rf); } //////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// att RR ////////////////////////////////////////////// if(menu1==6){ if (newPosition != oldPosition) { oldPosition = newPosition; rr=rr+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(rr>31){rr=31;}if(rr<0){rr=0;}audio();} lcd.setCursor(0,0);lcd.print("Speaker RR ");lcd.print(rr); } //////////////////////////////////////////////////////////////////////////////////////// if(millis()-time>10000 && w==1){ EEPROM.update(0,vol); EEPROM.update(1,bass+7); EEPROM.update(2,treb+7); EEPROM.update(3,in); EEPROM.update(4,gain1);EEPROM.update(5,gain2);EEPROM.update(6,gain3); EEPROM.update(7,loud); EEPROM.update(8,lr);EEPROM.update(9,rr);EEPROM.update(10,lf);EEPROM.update(11,rf); cl();menu=0;menu1=0;w=0;} } void cl(){delay(300);lcd.clear();} void audio(){ tda.setVolume(vol); // громкость 0...63 tda.setAttLR(lr); // аттенюатор LR 0...31 tda.setAttRR(rr); // аттенюатор RR 0...31 tda.setAttLF(lf); // аттенюатор LF 0...31 tda.setAttRF(rf); // аттенюатор RF 0...31 tda.setSwitch(in,loud,gain); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3 tda.setBass(bass); // тембр НЧ -7...+7 tda.setTreble(treb); // тембр ВЧ -7...+7 }
Дополнительный материал:
Обновленный скетч — TDA7313_IR.zip
Исправления:
delay(1000);audio();
заменить на:
delay(1000);lcd.clear();audio();
Улучшена работа энкодера, изменено графическое исполнение шкал регулировок, добавлен ИК пульт (прокрутка меню, кнопки <> и IN). В мониторе порта Вы сможете посмотреть коды кнопок и вписать в скетч свои значения.
Скетч не тестировался!!!
Для нормальной работы скетча необходимо скачать дополнительные библиотеку:
IRremote.zip — библиотека изменена
Требуется тестирование:
TDA7313 + энкодер + ИК пульт + анализатор спектра (протестировано) — http://forum.rcl-radio.ru/viewtopic.php?id=32
Аудиопроцессор TDA7313 + LCD дисплей 84×48 Nokia 5110 (протестировано) — http://forum.rcl-radio.ru/viewtopic.php?id=102
Аудиопроцессор TDA7313 + LCD дисплей 84×48 Nokia 5110 + ИК пульт — http://forum.rcl-radio.ru/viewtopic.php?pid=534#p534
Спасибо за ответ. Если правильно понял, то в скетче после строки
lcd.setCursor(0,0);lcd.print(«IN «);lcd.print(in+1);lcd.print(» Gain «);lcd.print(gain);
нужно добавить
lcd.setCursor(0,0);
switch(in){
case 0: lcd.print(«BT «);break;
case 1: lcd.print(«MP3»);break;
case 2: lcd.print(«AUX»);break;
}
lcd.print(» Gain «);lcd.print(gain);
или полностью заменить строку на Ваш ответ? Не судите строго. Я в этом просто практически ничего не понимаю, но пытаюсь.
Заменить