ИМС TDA7448 представляет собой шести канальный регулятор громкости, регулировка громкости независимая для каждого канала.
Технические характеристики TDA7448:
- Напряжение питания от 4,75 до 10 В (9 рекомендуемое)
- Ток потребления 7 мА
- Максимальное входное напряжение (THD = 0.3%) 2.5 Vrms
- Отношение сигнал / шум 100 дБ
- Частотный диапазон от 20 до 20000 Гц
- КНИ при входном напряжении 1Vrms не более 0,01%
- Диапазон регулировки громкости от -79 до 0 дБ
Плата Arduino Nano аудиопроцессор TDA7448 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).
Плата | Пин SDA | Пин SCL |
---|---|---|
Arduino Uno, Nano, Pro и Pro Mini | A4 | A5 |
Библиотека — TDA7448.zip
Тестовый скетч
#include <Wire.h> #include <TDA7448.h> TDA7448 tda; void setup(){Wire.begin();} void loop(){ audio_tda(); delay(1000); } void audio_tda(){ tda.setAtt(1,0);// 0 макс громк, -79(79) мин громк tda.setAtt(2,0); tda.setAtt(3,0); tda.setAtt(4,0); tda.setAtt(5,0); tda.setAtt(6,0); }
tda.setAtt(1,0) : первый параметр номер канала, второй параметр уровень ослабления сигнала от 0 до -79 дБ
TDA7448.pdf
Пример использования библиотеки
Дополнительные библиотеки
#include <Wire.h> #include <MsTimer2.h> #include <LiquidCrystal.h> #include <Encoder.h> #include <EEPROM.h> #include <TDA7448.h> TDA7448 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,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000}; byte a2[8]={0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000}; byte a3[8]={0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000}; unsigned long newPosition,time,oldPosition = -999; int vol1,vol2,vol3,vol4,vol5,vol6,vol1_d,vol2_d,vol3_d,vol4_d,vol5_d,vol6_d; int w,w2,menu,z,z0,z1; void setup(){ Wire.begin(); lcd.begin(16, 2); lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3); vol1 = -EEPROM.read(0); vol2 = -EEPROM.read(1); vol3 = -EEPROM.read(2); vol4 = -EEPROM.read(3); vol5 = -EEPROM.read(4); vol6 = -EEPROM.read(5); pinMode(A0,INPUT);// КНОПКА ЭНКОДЕРA MsTimer2::set(3, to_Timer);MsTimer2::start(); lcd.setCursor(0,0);lcd.print(" TDA7448 ");delay(1000);lcd.clear();audio_tda(); } void loop(){ if(analogRead(A0)<900){menu++;cl();myEnc.write(0);time=millis();w=1;w2=1;if(menu>5){menu=0;}}// меню if(menu==0){ if (newPosition != oldPosition) { oldPosition = newPosition; vol1=vol1+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol1>0){vol1=0;}if(vol1<-79){vol1=-79;}audio_tda();} lcd.setCursor(0,0);lcd.print("Vol 1 "); lcd.print(" ");lcd.print(vol1);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol1_d=vol1+48; if(w2==1){ for(z=0,z0=0,z1=0;z<=vol1_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}} if(menu==1){ if (newPosition != oldPosition) { oldPosition = newPosition; vol2=vol2+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol2>0){vol2=0;}if(vol2<-79){vol2=-79;}audio_tda();} lcd.setCursor(0,0);lcd.print("Vol 2 "); lcd.print(" ");lcd.print(vol2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol2_d=vol2+48; if(w2==1){ for(z=0,z0=0,z1=0;z<=vol2_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}} if(menu==2){ if (newPosition != oldPosition) { oldPosition = newPosition; vol3=vol3+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol3>0){vol3=0;}if(vol3<-79){vol3=-79;}audio_tda();} lcd.setCursor(0,0);lcd.print("Vol 3 "); lcd.print(" ");lcd.print(vol3);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol3_d=vol3+48; if(w2==1){ for(z=0,z0=0,z1=0;z<=vol3_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}} if(menu==3){ if (newPosition != oldPosition) { oldPosition = newPosition; vol4=vol4+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol4>0){vol4=0;}if(vol4<-79){vol4=-79;}audio_tda();} lcd.setCursor(0,0);lcd.print("Vol 4 "); lcd.print(" ");lcd.print(vol4);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol4_d=vol4+48; if(w2==1){ for(z=0,z0=0,z1=0;z<=vol4_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}} if(menu==4){ if (newPosition != oldPosition) { oldPosition = newPosition; vol5=vol5+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol5>0){vol5=0;}if(vol5<-79){vol5=-79;}audio_tda();} lcd.setCursor(0,0);lcd.print("Vol 5 "); lcd.print(" ");lcd.print(vol5);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol5_d=vol5+48; if(w2==1){ for(z=0,z0=0,z1=0;z<=vol5_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}} if(menu==5){ if (newPosition != oldPosition) { oldPosition = newPosition; vol6=vol6+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol6>0){vol6=0;}if(vol6<-79){vol6=-79;}audio_tda();} lcd.setCursor(0,0);lcd.print("Vol 6 "); lcd.print(" ");lcd.print(vol6);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol6_d=vol6+48; if(w2==1){ for(z=0,z0=0,z1=0;z<=vol6_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}} if(millis()-time>10000 && w==1){ EEPROM.update(0,abs(vol1)); EEPROM.update(1,abs(vol2)); EEPROM.update(2,abs(vol3)); EEPROM.update(3,abs(vol4)); EEPROM.update(4,abs(vol5)); EEPROM.update(5,abs(vol6)); w=0;} } void audio_tda(){ tda.setAtt(1,vol1); // 0 макс громк, -79(79) мин громк tda.setAtt(2,vol2); tda.setAtt(3,vol3); tda.setAtt(4,vol4); tda.setAtt(5,vol5); tda.setAtt(6,vol6); } void cl(){delay(300);lcd.clear();} void to_Timer(){newPosition = myEnc.read()/4;}
Доработка — общий регулятор громкости + 6-и канальный аттенюатор от -20 до 0 дБ. — http://forum.rcl-radio.ru/viewtopic.php?pid=3051#p3051
Когда вы протестируйте этот скетч??? И видеобзор сделайте как все правильно подключать и заливать скетч!!!
Скетч что касаемо энкодера, отправка команд на TDA7448 и экрана протестировано, видео опубликовано. Не протестировано мной реагирование на команды TDA7448, но протестировано другим пользователем.
В вашем случае, необходимо полностью проверить правильность подключения экрана и энкодера. В скетче все указано:
7, 6, 2, 3, 4, 5 // RS,E,D4,D5,D6,D7 для экрана
9, 8 // CLK, DT для энкодера + А0 кнопка энкодера
http://rcl-radio.ru/?p=42773
Перед заливкой скетча с экраном, как правило тестируют первый тестовый скетч, проверяют работоспособность TDA, в ручную меняют громкость всех каналов:
tda.setAtt(1,0);// 0 макс громк, -79(79) мин громк
tda.setAtt(2,0);
tda.setAtt(3,0);
tda.setAtt(4,0);
tda.setAtt(5,0);
tda.setAtt(6,0);
Только потом, если тест прошел удачно, подключают экран и энкодер.
можно включить pt2323 для выбора записей, вы можете отправить мне файл ino спасибо
Как Вы видит реализацию этой функции, переключение входов кнопкой? Или как то по другому, а индикация входа, светодиоды, вывод на экран?
Повторил работает. Как сделать мастер громкость, чтобы громкость регулировалась на всех каналах сразу?
Можно сделать только общий регулятор громкости или поканально, одновременно не получится.
Это в самой TDA не предусмотрено?
Нет, только поканальная регулировка
https://labkit.ru/html/tembrobloki?id=88 тут есть и общая и поконалная регулировка, неужели в ардуино нельзя реализовать?
Можно, но только если поканальная регулировка будет иметь ограничение, например от 0 до -20 дБ. Тогда регулировка громкости будет от -59 до 0 дБ, вместо -79 до 0.
Можете скетч изменить для этого?
Я поправлю скетч, но не смогу протестировать.
На мейл можете выслать?
Я создам тему на форуме и оставлю ссылку в этой статье.
Еще бы реализовать в прошивке автоматический возврат в меню общей
громкости
http://forum.rcl-radio.ru/viewtopic.php?pid=3051#p3051
Благодарю! Все работает как надо!
Добавьте пожалуйста управление пультом, а с кодами пульта я справлюсь
http://forum.rcl-radio.ru/viewtopic.php?pid=3061#p3061
Спасибо большое!