Регулятор громкости M62429 (Arduino)

Микросхема M62429 при совместном использовании с Arduino Nano (Uno) позволяет регулировать громкость (стерео) в диапазоне от -83 до 0 дБ, регулировка громкости осуществляется одновременно по двум каналам, так и раздельно. Для управления микросхемой M62429 используется последовательный интерфейс с пакетной передачей данных.

Основные характеристики M62429 (m62429.pdf):

  • Напряжение питания 4.5 … 5.5 В
  • THD = 0.01 % Typ. (V0 = 0.5 Vrms)
  • Разделение каналов 80 дБ
  • Диапазон регулировки громкости от -83 до дБ с шагом 1 дБ
  • Ток потребления 8 мА
  • Максимальное входное напряжение 1.7 Vrms

Выходной сигнал необходимо подавать на нагрузку (наушники или вход усилителя) через разделительный конденсатор 2.2 мкФ.

Функция библиотеки setVolume содержит несколько переменных, значения которых необходимо указать:

setVolume (1,2,3,4,5);

  1. I/O вывод Arduino для CLK
  2. I/O выводы Arduino для DATA
  3. Регулировка громкости раздельная 0, одновременно оба канала 1
  4. Номер канала 1,2 ПК ЛК (1 в 3 пункте, эта функция не активна)
  5. Уровень громкости от 83 (можно указывать -83) до 0 (макс.)

Библиотеки

M62429.zip

MsTimer2.ZIP

Encoder.zip

#include <M62429.h>
void setup(){}
void loop(){
audio();
delay(1000);
}
 
void audio(){
setVolume (11,12,0,0,5); 
setVolume (11,12,0,1,5);
/* pin CLK
   pin DATA
   0 - по одному каналу, 1 - оба вместе
   0 ПК 1 ЛК
   83 ... 0 громкость 83 = -83 дБ */  
}

Ниже показан пример использования M62429 в качестве регулятора громкости. Регулировка громкости происходит при помощи энкодера KY-040, информация выводится на LCD дисплея LCD1602 на базе контроллера HD44780.

Кнопка энкодера позволяет переключать режимы настроек между громкостью и балансом. Уровень громкости и баланса сохраняются в энергонезависимой памяти.

#include <M62429.h>
#include <MsTimer2.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <EEPROMex.h>
   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};
   int z,z0,z1,vol,vol_d,w,menu,balans;
   unsigned long newPosition,time,oldPosition  = -999;
 
   void to_Timer(){newPosition = myEnc.read()/4;}
 
void setup(){
  lcd.begin(16, 2);lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  pinMode(A0,INPUT);// КНОПКА ЭНКОДЕРA
  vol = EEPROM.read(0)-83;balans = EEPROM.read(1)-4;
  MsTimer2::set(3, to_Timer);MsTimer2::start();
}
 
void loop(){
    if(analogRead(A0)<900){menu++;cl();myEnc.write(0);time=millis();w=1;if(menu>1){menu=0;}}// меню
 
if(menu==0){ delay(10);
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;if(vol>0){vol=0;}if(vol<-83){vol=-83;}audio();}
  lcd.setCursor(0,0);lcd.print("Volume  ");
  lcd.print(" ");lcd.print(vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol+48;
   for(z=0,z0=0,z1=0;z<=vol_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);}}
 
    if(menu==1){
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(balans>4){balans=4;}if(balans<-4){balans=-4;}audio();}
  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("L");
  lcd.setCursor(15,1);lcd.print("R");
   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(millis()-time>10000 && w==1){// сохранение всех настроек в eeprom через 10 сек неактивности
     EEPROM.update(0,vol+83);
     EEPROM.update(1,balans+4);
     w=0;menu=0;lcd.clear();}
}
 
void cl(){delay(300);lcd.clear();}
void audio(){
setVolume (11,12,0,0,vol-4+balans); 
setVolume (11,12,0,1,vol-4-balans);
/* pin CLK
   pin DATA
   0 - по одному каналу, 1 - оба вместе
   0 ПК 1 ЛК
   83 ... 0 громкость 83 = -83 дБ */  
}

Comments

  1. Arduino: 1.8.19 (Windows 10), Плата:»Arduino Nano, ATmega328P (Old Bootloader)»

    C:\Users\User\Documents\Arduino\____________________M62429__Arduino_\____________________M62429__Arduino_.ino: In function ‘void audio()’:

    ____________________M62429__Arduino_:62:1: error: ‘setVolume’ was not declared in this scope

    setVolume (11,12,0,0,vol-4+balans);

    ^~~~~~~~~

    exit status 1

    ‘setVolume’ was not declared in this scope

    Вот сообщение об ошибке

Добавить комментарий

Войти с помощью: