Обычно регулировка громкости на переменном резисторе выглядит так:
Для подключения данной схемы необходимо 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: Выложил скетч в первом комментарии к данной статье на нашем телеграмм канале. Не забудьте подписаться на канал!
Заголовок подправьте, не tp а pt. И что насчет шумов и искажений, вносимых данным дэвайсом в звуковой тракт?
ОтветитьУдалитьСпасибо, исправил. Искажений и шумов не заметил.
УдалитьСпасибо за схемку. А не пробовали ещё и ИК-пульт привязать?
ОтветитьУдалитьПланов много, времени не хватает... Изначально ставил себе целью создать плату, которой можно заменить переменный резистор регулятора громкости. В будущем хочу заменить плату Arduino на Digispark (Attiny85). Ну и подумать о пульте и индикаторе.
УдалитьВячеслав здравствуйте. Как продвигаются Ваши планы? Очень заинтересован в их реализации. Буду очень рад их увидеть.
Удалитьit was very good your project congratulations I did but I am with encoder noise in the audio what can be
ОтветитьУдалитьУ меня посторонних шумов нет. Попробуйте запитать Arduino или плату от другого батареек или аккумулятора. Если помехи пропадут - добавьте фильтр по питанию.
УдалитьЗачем на выходе кондеры?
ОтветитьУдалить