ИМС TDA7449 – регулятор громкости и регулятор тембра, разработан для использования в HI-FI аппаратуре и качественных автомобильных аудиосистемах, обладает низким уровнем шумов и искажений.
На странице http://rcl-radio.ru/?p=56015 был показан пример использования ИМС TDA7449 с выводом информации на индикатор LCD1602 на базе контроллера HD44780. На этой странице будет показан пример использования TDA7449 с выводом информации на LCD дисплей 84×48 Nokia 5110.
Регулятор тембра и громкости имеет четыре кнопки управления:
- Кнопка «МЕНЮ» — пять основных регулировок: громкость, тембр НЧ, тембр СЧ, тембр ВЧ, баланс.
- Кнопка «+» — увеличение громкости, тембра, рег. баланса, рег. усиления.
- Кнопка «-» — уменьшение громкости, тембра, рег. баланса, рег. усиления.
- Кнопка «INPUT» (режим INPUT) — выбор стерео канала и регулировка усиления для каждого канала.
Индикатор Nokia 5110 позволяет вывести все параметры настроек аудиопроцессора TDA7449: громкость, тембр НЧ, тембр ВЧ, балан, номер канала и усиление выбранного канала. Все настройки в МЕНЮ сохраняются в энергонезависимой памяти. Сохранение настроек происходит через 10 секунд неактивности кнопок управления.
Подключение TDA7449 и кнопок управления к Arduino Nano или Uno:
- Nokia 5110 LCD — RST,CE,DC,DIN,CLK (цифровые выходы Arduino 3,4,5,6,7). На вход VCC необходимо подавать питание 3,3 В, а на выход BL (подсветка) можно подавать питание 5 В через сопротивление 330 Ом или 3,3 В через сопротивление 200 Ом.
- Кнопка меню — подключена к цифровому выходу Arduino 12
- Кнопка ПЛЮС выход 10
- Кнопка МИНУС выход 11
- Кнопка INPUT аналоговый выход А1
- Выход ИМС TDA7449 SDA и SCL подключаются к аналоговым входам платы Arduino А4 и А5 соответственно.
В скетче используются две основные библиотеки, это библиотека TDA7449.zip и библиотека PCD8544 для индикатора Nokia 5110, стандартная библиотека была изменена, в ней заменены редко используемые символы на русские буквы, поэтому необходимо использовать именно эту библиотеку — pcd8544.zip
#include <Wire.h> #include <SPI.h> #include <TDA7449.h> #include <PCD8544.h> #include <EEPROMex.h> TDA7449 tda; PCD8544 lcd; // RST,CE,DC,DIN,CLK VCC,BL,GND (3,4,5,6,7 +3.3V,200 OM +3.3V, GND) static const byte asd[] = { B00111100,B00000000,B00000000,B00000000,B00000000 }; static const byte asd1[] = { B00111100,B00111100,B00111100,B0000000,B11111111 }; static const byte asd2[] = { B00111100,B00111100,B00111100,B0000000,B00111100 }; int vol=20,bass=0,treb=0,balans=0,gain,gain1,gain2; int i,menu,in,in_d,w=0,w1=0,w2=0,w3=0,w4=0,eeprom; unsigned long time; void setup() { Serial.begin(9600);Wire.begin(); lcd.begin(84, 48); lcd.setContrast(60);// контрастность 0-127 pinMode(10,INPUT);pinMode(11,INPUT);pinMode(12,INPUT); lcd.createChar(0, asd); lcd.createChar(1, asd1);lcd.createChar(2, asd2); vol = EEPROM.read(0);// vol eeprom bass = EEPROM.read(1)-7;// bass eeprom treb = EEPROM.read(3)-7;// treb eeprom balans = EEPROM.read(4)-4;// balans eeprom in = EEPROM.read(5);// in eeprom gain1 = EEPROM.read(6);// gain1 eeprom gain2 = EEPROM.read(7);// gain2 eeprom audio(); } void loop() { if(digitalRead(12)==HIGH){menu++;w_x();time_x();delay(200);if(menu>3||menu<0){menu=0;}} if(analogRead(A1)>900){in++;menu=5;w_x();time_x();delay(200);if(in>2||in<1){in=1;}}// in ////////////////////////////// vol /////////////////////////////////////////////////////// if(menu==0){ if(digitalRead(10)==HIGH){vol++;w=0;time_x();delay(100);} if(digitalRead(11)==HIGH){vol--;w=0;time_x();delay(100);} if(vol>47){vol=47;}if(vol<0){vol=0;} } if(w==0){ lcd.setCursor(0,0);lcd.print("}P"); for(i=15;i<68;i++){lcd.setCursor(i,0);lcd.write(0);} lcd.setCursor(vol+15,0);if(menu==0){lcd.write(1);}else{lcd.write(2);}lcd.setCursor(72,0);if(vol<10){lcd.print(" ");}lcd.print(vol); audio();w=1; } ///////////////////////////////////////// bass /////////////////////////////////// if(menu==1){ if(digitalRead(10)==HIGH){bass++;w1=0;time_x();delay(100);} if(digitalRead(11)==HIGH){bass--;w1=0;time_x();delay(100);} if(bass>7){bass=7;}if(bass<-7){bass=-7;} } if(w1==0){ lcd.setCursor(0,1);lcd.print("H'"); for(i=8;i<60;i=i+1){lcd.setCursor(i+7,1);lcd.write(0);} lcd.setCursor(bass*3+37,1);if(menu==1){lcd.write(1);}else{lcd.write(2);}lcd.setCursor(72,1);if(bass<10&&bass>=0){lcd.print(" ");}lcd.print(bass); audio();w1=1; } //////////////////////////////////////////// treble ///////////////////////////// if(menu==2){ if(digitalRead(10)==HIGH){treb++;w2=0;time_x();delay(100);} if(digitalRead(11)==HIGH){treb--;w2=0;time_x();delay(100);} if(treb>7){treb=7;}if(treb<-7){treb=-7;} } if(w2==0){ lcd.setCursor(0,2);lcd.print("B'"); for(i=8;i<60;i=i+1){lcd.setCursor(i+7,2);lcd.write(0);} lcd.setCursor(treb*3+37,2);if(menu==2){lcd.write(1);}else{lcd.write(2);}lcd.setCursor(72,2);if(treb<10&&treb>=0){lcd.print(" ");}lcd.print(treb); audio();w2=1; } //////////////////////////////////////////// balans ///////////////////////////// if(menu==3){ if(digitalRead(10)==HIGH){balans++;w3=0;time_x();delay(100);} if(digitalRead(11)==HIGH){balans--;w3=0;time_x();delay(100);} if(balans>4){balans=4;}if(balans<-4){balans=-4;} } if(w3==0){ lcd.setCursor(0,3);lcd.print(" R"); for(i=8;i<60;i=i+1){lcd.setCursor(i+7,3);lcd.write(0);} lcd.setCursor(balans*5+37,3);if(menu==3){lcd.write(1);}else{lcd.write(2);}lcd.setCursor(72,3);lcd.print("L"); audio();w3=1; } ///////////////////////////////////////////////////////////////////////////////// lcd.setCursor(0,4);lcd.print("--------------"); /////////// input + gain ///////////////////////////////////////// if(menu==5){ g1(); if(digitalRead(11)==HIGH){gain++;w4=0;time_x();delay(300);if(gain>15){gain=15;}} if(digitalRead(10)==HIGH){gain--;w4=0;time_x();delay(300);if(gain<0){gain=0;}} g2();} if(w4==0){ g1(); lcd.setCursor(0,5);lcd.print("Bxo(");if(menu==5){lcd.print("=");}else{lcd.print(" ");}lcd.print(in); lcd.print(" @c>{.");lcd.print(gain); audio();w4=1; } //////////////////////////////////////////////////////////// if(millis()-time>10000 && eeprom==1){menu=0; EEPROM.update(0,vol); EEPROM.update(4,balans+4); EEPROM.update(1,bass+7); EEPROM.update(3,treb+7); EEPROM.update(5,in); EEPROM.update(6,gain1);EEPROM.update(7,gain2); w_x();eeprom=0;} } // loop void g1(){if(in==1){gain=gain1;}if(in==2){gain=gain2;}} void g2(){if(in==1){gain1=gain;}if(in==2){gain2=gain;}} void w_x(){w=0;w1=0;w2=0,w3=0;w4=0;} void time_x(){time=millis();eeprom=1;} void audio(){ tda.setInput(in); // int 1...2 //// номер входа tda.inputGain(gain); // int 0...15 (шаг 2дБ) 0...30 дБ //// усиление tda.setVolume(vol); // int 0...47 (шаг 1 дБ) -47...0 дБ //// громкость tda.setBass(bass); // int -7...+7 (шаг 2 дБ) -14...14 дБ //// тембр НЧ tda.setTreble(treb); // int -7...+7 (шаг 2 дБ) -14...14 дБ //// тембр ВЧ tda.setAttL(4-balans); // int 0...79 (шаг 1дБ) tda.setAttR(4+balans); // int 0...79 (шаг 1дБ) }
tda7449_encoder.zip — добавлен энкодер дублирующий кнопки «MENU», «+» и «-«. (не тестировалось!!!)