ИМС TDA7449 – регулятор громкости и регулятор тембра, разработан для использования в HI-FI аппаратуре и качественных автомобильных аудиосистемах, обладает низким уровнем шумов и искажений.
Основные технические характеристики ИМС TDA7449:
- Громкость 47 уровней от -47 до 0 дБ (0 громкость -72 дБ)
- Регулировка тембра НЧ, ВЧ ±14 дБ (±7 уровней)
- Коммутация входов — 2 стерео канала
- Усиление от 0 до 30 дБ независимое для каждого канала
- Регулировка баланса ±4 дБ (ограниченно программно)
- Аттенюатор — 72 … 0 дБ
- Напряжение питания от 6 до 10,2 В (типовое значение 9 В)
- КНИ на частоте 1 кГц не более 0,01%
Плата Arduino Nano аудиопроцессор TDA7449 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация). В качестве индикатора используется LCD1602 на базе контроллера HD44780.
Управление регулятором тембра состоит из 4-х кнопок:
- Кнопка «МЕНЮ» — пять основных регулировок: громкость, тембр НЧ, тембр СЧ, тембр ВЧ, баланс.
- Кнопка «+» — увеличение громкости, тембра, рег. баланса, рег. усиления.
- Кнопка «-» — уменьшение громкости, тембра, рег. баланса, рег. усиления.
- Кнопка «INPUT» (режим INPUT) — выбор стерео канала и регулировка усиления для каждого канала.
Плата | Пин SDA | Пин SCL |
---|---|---|
Arduino Uno, Nano, Pro и Pro Mini | A4 | A5 |
Все настройки в МЕНЮ сохраняются в энергонезависимой памяти. Сохранение настроек происходит через 10 секунд неактивности кнопок управления. Для сохранения настроек в режиме INPUT, так же необходимо подождать 10 секунд, после чего номер текущего канала и настройки усиления всех каналов будут сохранены в энергонезависимой памяти.
Библиотека https://github.com/liman324/TDA7449/archive/master.zip или TDA7449.zip
#include <Wire.h> #include <TDA7449.h> #include <LiquidCrystal.h> #include <EEPROM.h>//#include <EEPROMex.h> для старых версий Arduino IDE TDA7449 tda; LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000}; byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000}; int vol,vol_d,z,bass,mids,treb,balans,in,gain,gain1,gain2; int att=4; // аттенюатор - если звук очень громкий увеличьте значение (-72 mute), меньше 4 не делать. byte menu,w,w1,in_d; unsigned long time; void setup(){ Serial.begin(9600);Wire.begin(); lcd.begin(16, 2); pinMode(12,INPUT);// меню pinMode(11,INPUT);// плюс pinMode(10,INPUT);// минус pinMode(A1,INPUT);// in 1-2 lcd.createChar(0,a1); lcd.createChar(1,a2); 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 g1();audio(); } void loop() { if(digitalRead(12)==HIGH){menu++;cl();in_d=0;if(menu>3){menu=0;}}// меню if(analogRead(A1)>900){in++;menu=5;w=1;in_d=1;cl();if(in>2||in<1){in=1;}}// in // индикация громкости + управление кнопками ////////////// if(menu==0){ if(digitalRead(11)==HIGH){vol++;w=1;if(vol>47){vol=47;}}// 47 максимальная громкость if(digitalRead(10)==HIGH){vol--;w=1;if(vol<0){vol=0;}}// 0 минимум громкости if(vol==0){att=72;}else{att=4;} if(w==1){audio();cl();time=millis();w=0;w1=1;} lcd.setCursor(0,0);lcd.print("Volume "); lcd.print(-47+vol);lcd.setCursor(13,0);lcd.print("dB"); vol_d=vol/2; 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); } // индикация тембр НЧ + управление кнопками ////////////// if(menu==1){ if(digitalRead(11)==HIGH){bass++;w=1;if(bass>7){bass=7;}} if(digitalRead(10)==HIGH){bass--;w=1;if(bass<-7){bass=-7;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Bass "); lcd.print(bass*2);lcd.setCursor(13,0);lcd.print("dB"); for(z=-7;z<=bass;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);} } /////////////////////////////////////////////////////////// // индикация тембр BЧ + управление кнопками ////////////// if(menu==2){ if(digitalRead(11)==HIGH){treb++;w=1;if(treb>7){treb=7;}} if(digitalRead(10)==HIGH){treb--;w=1;if(treb<-7){treb=-7;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Trebble "); lcd.print(treb*2);lcd.setCursor(13,0);lcd.print("dB"); for(z=-7;z<=treb;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);} } /////////////////////////////////////////////////////////// // индикация баланс + управление кнопками +\- 4 дБ /////// if(menu==3){ if(digitalRead(11)==HIGH){balans++;w=1;if(balans>4){balans=4;}} if(digitalRead(10)==HIGH){balans--;w=1;if(balans<-4){balans=-4;}} lcd.setCursor(0,0); if(balans>=0){lcd.print("-");}else{lcd.print("+");} lcd.print(abs(balans*2));lcd.print(" dB "); lcd.print(" <> "); if(balans>=0){lcd.print("+");}else{lcd.print("-");} lcd.print(abs(balans*2));lcd.print(" dB "); lcd.setCursor(0,1);lcd.print("R"); lcd.setCursor(15,1);lcd.print("L"); if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);} if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);} if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);} if(w==1){audio();cl();time=millis();w1=1;w=0;} } ///////////////////////////////////////////////////////////// /////////// input + gain ///////////////////////////////////////// if(in_d==1){ g1(); if(digitalRead(11)==HIGH){gain++;w=1;if(gain>15){gain=15;}} if(digitalRead(10)==HIGH){gain--;w=1;if(gain<0){gain=0;}} g2(); lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in); lcd.setCursor(0,1);lcd.print("Input Gain: ");lcd.print(gain); if(w==1){audio();cl();time=millis();w1=1;w=0;} } //////////////////////////////////////////////////////////// // запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек // если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости if(millis()-time>10000 && w1==1){ 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); menu=0;w1=0;cl();in_d=0; } } 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 cl(){delay(200);lcd.clear();} 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(att-balans); // int 0...79 (шаг 1дБ) tda.setAttR(att+balans); // int 0...79 (шаг 1дБ) }
Тестирование скетча tda7449 + энкодер + ИК пульт — http://forum.rcl-radio.ru/viewtopic.php?id=30
Тестирование скетча tda7449 + энкодер + ИК пульт + анализатор спектра — http://forum.rcl-radio.ru/viewtopic.php?pid=43#p43
Hi Liman,
I assembled this project. It didn’t work. The Arduino sketch worked well seperately without connecting to the TDA 7449 preamp.But when I connect the SDA,SCL pins to Arduino,the LCD display freezes and buttons don’t respond.I tried connecting pull up resistor of 2.2k from SDA and SCL to 5 voLT.with this,the LCD and buttons work even with SDA and SCL input, but there’s no sound. I checked all connections.The chip is new one.Any help?
Apply this code to clear memory, place it at the beginning of the setup () block — http://forum.rcl-radio.ru/viewtopic.php?id=77
After clearing the memory check the I2C connection using the I2C scanner — http://forum.rcl-radio.ru/viewtopic.php?id=64, it will show the address of Your chip, if not, the connection is not correct.
Resistors on the i2c bus are not needed.
Arduino GND and TDA GND must be combined
Superb!!.You correctly said..I missed the Arduino and tda ground.Now it works great!!.Very Happy with the performance! My first arduino project is successful because of this great website. Many Thanks. I did same grounding mistake with My pt2322 also. I will check my pt2322 project also… I will soon be making 7439 project also. Only problem is I don’t have a PCB design for toner transfer. Doing a perfboard layout is difficult since it is SDIP. Anyway, many Thanks. One request.How to add a frequency spectrum to this sketch? I found one for encoder version. But not for button controlled version..
There is no project with a spectrum analyzer with push-button control, there is only an encoder + IR remote
Спасибо, собрал всё заработало.Память специально не чистил — прошёл последовательно по пунктам меню и кнопкой минус уменьшил значения имеющихся там чисел до нормы.
Возник небольшой вопрос- как увеличить задержку кнопки «меню»?
А то чуть нажмёшь на эту кнопку и сразу проскакиваешь несколько пунктов меню.
void cl(){delay(200);lcd.clear();}
заменить на
void cl(){delay(400);lcd.clear();}
Всё понятно,спасибо.