суббота, 17 февраля 2018 г.

Регулятор громкости: Arduino, энкодер и pt2257



       Хочу поделиться своей разработкой электронного регулятора громкости, которым можно заменить переменный резистор в старом магнитофоне, радиоприемнике или усилителе и сделать таким образом регулировку уровня звука более приятной.


      Обычно регулировка громкости на переменном резисторе выглядит так:



      Для подключения данной схемы необходимо 5 проводов: входы левого и правого каналов, общий провод и выходы левого и правого каналов. Т.к. мой регулятор громкости электронный - то понадобится еще шестой провод - питание. В своей схеме я использую питание 5В, которое можно взять напрямую с блока питания переделываемого устройства или, если напряжение питания выше,  понизить его, например при помощи DC-DC преобразователя.
Для сборки схемы понадобится:
       1) Arduino UNO или Arduino nano - 1шт. Основной "мозг" схемы. В зависимости от направления и угла поворота энкодера подает команду tp2257 по шине i2c для изменения уровня громкости.
       2) Микросхема tp2257 -1шт. Электронный регулятор громкости. В зависимости от команды, постeпающей по шине i2c регулирует уровень сигнала поступающего на вход.
       3) Конденсаторы 10мкФ Х 16В - 4Шт. Убирают постоянную составляющую в регулируемом аудиосигнале.
       4) Конденсаторы 100мкФ х 16В и 0.1мкФ - по 1шт. Обеспечивают фильтрацию питания микросхем.
       5) Энкодер нажимной, 5и-пиновый - 1шт. Служит для взаимодействия схемы с человеком. Человек крутит ручку энкодера - схема регулирует громкость. Человек нажимает на ручку энкодера - схема отключает-включает звук.
       6) Резисторы 1кОм - 2шт. Служат для "подтягивания" A и B выводов энкодера к линии питаня 5В. Внимание: В энкодерах типа KY-040 уже установлены резисторы, поэтому дополнительные ставить не нужно.


Схема:



Текст программы, который нужно залить в ардуину:


#include <Wire.h>

/********************************************************
**   Для управлением громкостью используется энкодер   **
**                    Arduino и tp2257                 **                  
** Вращением энкодера регулируется громкость, нажатием **                  
**       кнопки включается-отключается режим "MUTE"    **
**                        http://mynobook.blogspot.com **                
*********************************************************/
 
int Volume=40;       // Начальная громкость составляет половину (50%)
int Volume_prev=40;  // Предыдущий уровень громкости
int Mute=0;          // Отключение звука
int fadeAmount = 3;        // шаг изменения громкости
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12;       // pin 12
const int pin_B = 11;       // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
 
void setup()  {
  Wire.begin();
  pinMode(9,INPUT);  // устанавливаем pin 9 как вход
  digitalWrite(9,HIGH); // Поддяжка вывода к 1         
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  currentTime = millis();
  loopTime = currentTime;
  // Задаем громкость при включении
  Wire.beginTransmission(0x44);  // i2c адрес pt2257
  Wire.write(Volume/10+224);   // Отправляем десятки громкости в tp2257 значение 224-231(00-70)
  Wire.write(Volume%10+208);   // Отправляем единицы громкости в tp2257 значение 208-217(0-9)
  Wire.endTransmission();
} 
 
void loop()  {
  currentTime = millis();
  if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
    encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера 
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера    
    if((!encoder_A) && (encoder_A_prev)){    // если состояние изменилось с положительного к нулю
      if(encoder_B) {
        // выход В в полож. сост., значит вращение по часовой стрелке
        // увеличиваем громкость, не более чем до 79
        if(Volume + fadeAmount <= 79) Volume += fadeAmount;               
      }   
      else {
        // выход В в 0 сост., значит вращение против часовой стрелки     
        // уменьшаем яркость, но не ниже 0
        if(Volume - fadeAmount >= 0) Volume -= fadeAmount;               
      }   
 
    }   
    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла 
    if  (digitalRead(9) == 0) // Если нажата кнопка то выключить или включить звук 
    {
     if (Mute == 0) 
     {
      Mute = 1;
      while (digitalRead(9) == 0) delay(100);   //  Дождаться отпускания кнопки
      Wire.beginTransmission(0x44);  // i2c адрес pt2257
      Wire.write(0b01111001);
      Wire.endTransmission();
 
     }
     else {
      while (digitalRead(9) == 0) delay(100);  //  Дождаться отпускания кнопки
      Mute = 0;
      Wire.beginTransmission(0x44);  // i2c адрес pt2257
      Wire.write(0b01111000);
      Wire.endTransmission(0x44);
      
     }     
    }
    if (Volume_prev != Volume) // Если крутили энкодер, то 
       {
        Wire.beginTransmission(0x44);  // i2c адрес pt2257
        Wire.write(Volume/10+224);   // Отправляем десятки громкости в tp2257 значение 224-231(00-70)
        Wire.write(Volume%10+208);   // Отправляем единицы громкости в tp2257 значение 208-217(0-9)
        Wire.endTransmission();
      Volume_prev = Volume;
       }
    
    loopTime = currentTime;
  }                       
}

     Скачать скетч можно здесь 

UPD: Новые скетчи для этой схемы описаны в этой статье.

Upd 02.05.2022: Выложил скетч в первом комментарии к данной статье на нашем телеграмм канале. Не забудьте подписаться на канал!

8 комментариев:

  1. Заголовок подправьте, не tp а pt. И что насчет шумов и искажений, вносимых данным дэвайсом в звуковой тракт?

    ОтветитьУдалить
    Ответы
    1. Спасибо, исправил. Искажений и шумов не заметил.

      Удалить
  2. Спасибо за схемку. А не пробовали ещё и ИК-пульт привязать?

    ОтветитьУдалить
    Ответы
    1. Планов много, времени не хватает... Изначально ставил себе целью создать плату, которой можно заменить переменный резистор регулятора громкости. В будущем хочу заменить плату Arduino на Digispark (Attiny85). Ну и подумать о пульте и индикаторе.

      Удалить
    2. Вячеслав здравствуйте. Как продвигаются Ваши планы? Очень заинтересован в их реализации. Буду очень рад их увидеть.

      Удалить
  3. it was very good your project congratulations I did but I am with encoder noise in the audio what can be

    ОтветитьУдалить
    Ответы
    1. У меня посторонних шумов нет. Попробуйте запитать Arduino или плату от другого батареек или аккумулятора. Если помехи пропадут - добавьте фильтр по питанию.

      Удалить