ИМС TDA7439 – регулятор громкости и трехполосный регулятор тембра, разработан для использования в HI-FI аппаратуре и качественных автомобильных аудиосистемах, обладает низким уровнем шумов и искажений.
Основные технические характеристики ИМС TDA7439:
- Громкость 48 уровней от -48 до 0 дБ
- Регулировка тембра НЧ, СЧ, ВЧ ±14 дБ (±7 уровней)
- Коммутация входов — 4 стерео канала
- Усиление от 0 до 30 дБ независимое для каждого канала
- Регулировка баланса ±4 дБ (ограниченно программно)
- Напряжение питания от 6 до 10,2 В (типовое значение 9 В)
- КНИ на частоте 1 кГц не более 0,01%
Плата Arduino Nano аудиопроцессор TDA7439 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).
Управление регулятором тембра состоит из 4-х кнопок:
- Кнопка «МЕНЮ» — пять основных регулировок: громкость, тембр НЧ, тембр СЧ, тембр ВЧ, баланс.
- Кнопка «+» — увеличение громкости, тембра, рег. баланса, рег. усиления.
- Кнопка «-» — уменьшение громкости, тембра, рег. баланса, рег. усиления.
- Кнопка «INPUT» (режим INPUT) — выбор стерео канала и регулировка усиления для каждого канала.
Плата | Пин SDA | Пин SCL |
---|---|---|
Arduino Uno, Nano, Pro и Pro Mini | A4 | A5 |
Все настройки в МЕНЮ сохраняются в энергонезависимой памяти. Сохранение настроек происходит через 10 секунд неактивности кнопок управления. Для сохранения настроек в режиме INPUT, так же необходимо подождать 10 секунд, после чего номер текущего канала и настройки усиления всех каналов будут сохранены в энергонезависимой памяти.
TDA7439.zip — скачайте и установите измененную библиотеку для данного скетча
#include <Wire.h> #include <TDA7439.h> #include <LiquidCrystal.h> #include <EEPROMex.h> TDA7439 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,gain3,gain4; byte menu,w,w1,in_d; unsigned long time; void setup() { Serial.begin(9600); Serial.print("TDA7439"); lcd.begin(16, 2); lcd.setCursor(0,0);lcd.print(" TDA7439 ");delay(1000); pinMode(12,INPUT);// меню pinMode(11,INPUT);// плюс pinMode(10,INPUT);// минус pinMode(A1,INPUT);// in 1-4 lcd.createChar(0,a1); lcd.createChar(1,a2); vol = EEPROM.read(0);// vol eeprom bass = EEPROM.read(1)-7;// bass eeprom mids = EEPROM.read(2)-7;// mids 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 gain3 = EEPROM.read(8);// gain3 eeprom gain4 = EEPROM.read(9);// gain4 eeprom g1();audio(); } void loop() { if(digitalRead(12)==HIGH){menu++;cl();in_d=0;if(menu>4){menu=0;}}// меню if(analogRead(A1)>900){in++;menu=5;w=1;in_d=1;cl();if(in>4||in<1){in=1;}}// in // индикация громкости + управление кнопками ////////////// if(menu==0){ if(digitalRead(11)==HIGH){vol++;w=1;if(vol>48){vol=48;}}// 48 максимальная громкость if(digitalRead(10)==HIGH){vol--;w=1;if(vol<0){vol=0;}}// 0 минимум громкости if(w==1){audio();cl();time=millis();w=0;w1=1;} lcd.setCursor(0,0);lcd.print("Volume "); lcd.print(-48+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);} } /////////////////////////////////////////////////////////// // индикация тембр CЧ + управление кнопками ////////////// if(menu==2){ if(digitalRead(11)==HIGH){mids++;w=1;if(mids>7){mids=7;}} if(digitalRead(10)==HIGH){mids--;w=1;if(mids<-7){mids=-7;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Mids "); lcd.print(mids*2);lcd.setCursor(13,0);lcd.print("dB"); for(z=-7;z<=mids;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);} } /////////////////////////////////////////////////////////// // индикация тембр BЧ + управление кнопками ////////////// if(menu==3){ 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==4){ 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));lcd.print(" dB "); lcd.print(" <> "); if(balans>=0){lcd.print("+");}else{lcd.print("-");} lcd.print(abs(balans));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(2,mids+7); EEPROM.update(3,treb+7); EEPROM.update(5,in); EEPROM.update(6,gain1);EEPROM.update(7,gain2);EEPROM.update(8,gain3);EEPROM.update(9,gain4); menu=0;w1=0;cl();in_d=0; } } void g1(){if(in==1){gain=gain1;}if(in==2){gain=gain2;}if(in==3){gain=gain3;}if(in==4){gain=gain4;}} void g2(){if(in==1){gain1=gain;}if(in==2){gain2=gain;}if(in==3){gain3=gain;}if(in==4){gain4=gain;}} void cl(){delay(200);lcd.clear();} void audio(){ tda.setInput(in); // 1 to 4 // номер канала tda.inputGain(gain); // 0 to 15 // усиление tda.setVolume(vol); // 0 to 48 ( 0 is mute) // громкость tda.setSnd(bass, 1); //-7 to +7 , 1 - Bass | 2 - Mids | 3 - Trebble tda.setSnd(mids, 2); tda.setSnd(treb, 3); tda.spkAtt(4-balans, 4+balans); // баланс R L от 0 to 79 (db) }
Ура заработало! Ардуино уно модель Р3 с выделеными каналами sda scl. И всё пошло! Спасибо.
Поздравляю!!!
А команду Wire.begin; добавляли в раздел setup() ?
Нет, ничего не добавлял. Заменил ардуинку и всё пошло. Её раз спасибо.
Dear Liman28,
will u please do me a favour i want coding for same but using IR remote instead of buttons and also using bluetooth, usb, fm radio module to the TDA-3 channels and 1 channel for AUX mode will you please send this using Atmega328p microcontroller on my mail id: tarunesh119@gmail.com
Короче у меня была мёртвая плата НАНО. Аналоговые входа не реагировали.
Понятно.
Ну я рад что у Вас все получилось!
У Вас очень полезный сайт. И скетчи готовые и программировать просто, на уровне копировать-вставить.
Здравствуйте. Созрела мысль по поводу этой микросхемы. Имеется аттенюатор на 4 входа. Для обычного усилителя многовато, достаточно двух. Возможно ли использование шины I2C для подключения нескольких устройств? Например: МП3 плеер, FM радио в совокупности с этим аудиопроцессором. Ну и пару входов оставить для подключения источников.
Здравствуйте.
Да, можно. Просто к шине i2c параллельно подключается новое уст-во и дописывается скет. Главное что-бы памяти хватило.
Спасибо за статью! Собрал пока что на коленках, все прекрасно заработало. Единственное, что смутило — это постоянка на выходе около 4В, подумал, что перегрел микросхему во время пайки. Перерыл весь интернет, оказалось, что так и должно быть. С опаской подключил к усилку … и, «О ЧУДО», оно запело!
Не могли бы Вы подсказать, как добавить кнопку «MUTE»? Иногда бывает, нужно срочно убавить громкость, а тут пока по менюшке найдешь, пока натыкаешь…. Сам в программировании только начинаю разбираться, тяжело дается.
Сейчас жду энкодер, хочу собрать схему с ним, думаю, будет удобнее.
Здраствйте!
В раздел setup добавьте:
pinMode(9,INPUT);// mute — новая кнопка на выход 9 цифровой
А перед строкой:
/////////// input + gain /////////////////////////////////////////
добавьте:
if(analogRead(9)==HIGH){mute++;}
if(mute>1){mute=0;}
if(mute==1){vol_old=vol;vol=0;}else{vol=vol_old;}
перед setup добавьте новые переменные:
int mute,vol_old;
можно не добавлять кнопку а нажать одновременно + и —
тогда новый код исправьте:
if(analogRead(9)==HIGH){mute++;}
на
if(analogRead(11)==HIGH && analogRead(11)==HIGH){mute++;}
Этот код не тестировался, поэтому может и не работать, если возникнут вопросы, то оставьте комментарий.
Премного благодарен! Буду пробовать.
Здравствуйте.А это принципиально?У Вас на процессоре (по схеме) 26 нога 22Н ,25 нога 18Н,а по даташиту 26-18Н,25-22Н.
Спасибо, что заметили, буду исправлять схему, вероятней всего это бы повлияло на регулировку СЧ (при повышении уровня СЧ, уровень бы понижался и наоборот).