В начало | Зарегистрироваться | Заказать наши киты почтой
 
 
 
 

Hi-Fi аудиоплеер на базе миникомпьютера «Raspberry Pi». Часть 3. Регулятор громкости на PGA2310

📆26 апреля 2017   ✒️Sergiy_83   🔎20.344   💬15  

Всем читателям datagor.ru привет! Продолжаем строить аудиоплеер. Сегодня подключим к «Raspberry Pi» энкодер, регулятор громкости на основе чипа PGA2310 и индикатор уровня громкости на светодиодах. Также уделим внимание передней панели аудиоплеера.

Передняя панель и блестящая «крутилка» громкости

Для размещения всех блоков нашего плеера я использую корпус от старого видеомагнитофона.
В большинстве видеомагнитофонов передние панели имеют плавные обтекающие формы, но в моем случае, передняя панель плоская, и это хорошо.
Отсек для видеокассеты я выпилил полностью (см. рис 2).

Рис. 2. Передняя панель аудиоплеера

Далее взял оргстекло 6 мм, отфрезеровал по периметру (рис. 3) и вставил с обратной стороны (рис. 4). Оргстекло немного затемнённое.

Рис. 3. Фрезерованное оргстекло для передней панели


Рис. 4. Передняя панель + оргстекло

Получилось симпатично. На рисунке 5 - задняя панель с дисплеями и втулкой для ручки регулировки громкости. Здесь обычное оргстекло.

Рис. 5. Задняя стеклянная панель

Надевать ручку непосредственно на энкодер считаю не очень хорошей идеей. Ручка будет болтаться, особенно заметно, если ручка большая в диаметре. Да и энкодер износится быстрее. Втулку сделал из видеоголовки. В ней два подшипника, прецизионные. Вал от головки подошел к ручке без проблем (6мм).

Рис. 6. Втулка из головки от видеомагнитофона

На заднюю панель приклеил черную самоклеющуюся плёнку, на которой лазером вырезана шкала. В этом могут помочь рекламные фирмы, которые делают различные вывески и наружную рекламу. См. рисунок 7.

Рис. 7. Шкала на задней панели

Здесь я планировал вырезать две шкалы, одну на черной плёнке, а вторую на рассеивающей прозрачной (транслюцентная плёнка), затем квадратики рассеивающей вставить в черную шкалу. Но такой хитрой рассеивающей плёнки не оказалось в наличии, и я просто позади оргстекла скотчем прилепил какую-то рассеивающую пленку из разбитой матрицы от ноутбука.

Получилось, в принципе, неплохо, но не так как хотелось - свет от светодиодов немного проникает в соседние сегменты.

Далее (рис. 8) всё оставшееся место на оргстекле, кроме дисплеев конечно, заклеиваем остатками чёрной пленки. По периметру на двусторонний скотч клеим ворсистый материал (чтобы пыль не проникала между передним стеклом и задней панелью).

Рис. 8. Задняя стеклянная панель в сборе

Осталось в оргстекле пропилить отверстие для ручки и передняя панель готова (см. рис. 1)

Светодиодный индикатор уровня громкости


Рис. 9. Схема светодиодного индикатора уровня громкости

В схеме применены замечательные микросхемы фирмы MOTOROLA MC74HCT574A . Это регистр (набор D триггеров) с параллельной записью. Чтобы превратить эту микросхему в сдвигающий регистр с последовательной записью, все внутренние D-триггеры соединяем последовательно. Следует отметить, что после включения питания, все выходы данной микросхемы устанавливаются в состояния логической единицы. А это значит, что светодиоды не горят и необходимость в предварительном сбросе схемы отпадает.

Стабилизатор VR1 позволят установить необходимую яркость светодиодов. Я, непонятно почему, сделал 33 светодиода, поэтому первый светодиод LED1 пришлось зажечь навсегда.

Рис. 10. Плата A1


Рис. 11. Плата A2


Обслуживает индикатор базовый класс устройства - leds. Полный листинг, как всегда, можно скачать в конце статьи.

class leds 
    {
    byte led_pos;   //текущая позиция по светодиодам
    byte i;         //для циклов
    uint32_t res;   //вспомогательная переменная
    public:
        byte num_led;              //количество светодиодов
        leds(void);                //конструктор
        void clear_leds(void);     //погасить все
        void set_leds (byte new_pos_leds);  //зажечь новое состояние
        void led_pos_up(void);              //зажечь еще один
        void led_pos_down(void);            //погасить один
        byte get_led_pos(void);             //узнать текущее положение
    };


Энкодер

Каких только алгоритмов не бывает для определения направления вращения энкодера и подсчета импульсов. Надо определится, каким методом программа узнает об изменениях на пинах с энкодером. Прерывания или опрос.

Прерывания с GPIO в «Raspberry Pi» в интернете освещены мутно и реализация, я бы сказал, неизящна, хотя, может быть, я плохо разобрался в данном вопросе.
Поэтому пока я выбрал метод опроса.

Рис. 12. Осциллограмма сигналов энкодера

На рисунке 12 осциллограмма импульсов энкодера. Алгоритм следующий: периодически опрашиваем пины, если состояние в предыдущем опросе было «11», то текущее состояние определит направление вращения, его потом и сосчитаем, за исключением текущих состояний с одинаковыми сигналами(«00» и «11»). Вот и весь алгоритм.

Из файла encoder.h:
unsigned char Encoder_Execute(void) //Основная функция опроса энкодера
	{
        Pre_state = Current_state;         //запомним предыдущее состояние энкодера
	Current_state= Scan_Encoder;      	
//сканируем энкодер и запоминаем текущее состояние энкодера

        if(Pre_state == 3) return Current_state;
//Если предыдущее состояние 3, то возвращаем текущее сосотояние 
        return 0;                               //иначе возвращаем 0.
}


В функции main:
#include "encoder.h"

int main(void)
{
volume_control volume; //регулятор громкости
init_encoder();  

while(1)	//основной цикл
    {
    switch(Encoder_Execute())
        {
         case 1: volume.down(); break; //тише
         case 2: volume.up();   break; //громче
        default: ;
        }
    switch (READ_BUTTONS)//Читаем кнопки
        {
        …
        }
    delay(5); //спать
    }
}

В цикле опроса процесс обязательно нужно «положить поспать» (в моём случае на 5 ms), иначе загрузка процессора будет большой. Так же задержка в 5 ms исключает влияние дребезга контактов энкодера.

На осциллограмме сигналы нового энкодера – без дребезга, но я подключал и старые, трофейные – тоже всё отлично.

Рис. 13. Соединение энкодера с валом

На рисунке 13 энкодер соединяется с валом с помощью резинового шланга, внутренним диаметром 6 мм.

Регулятор громкости на PGA2310


Рис. 14. Схема регулятора громкости на PGA2310

Микросхема PGA2310 - высокопроизводительный стереофонический аудиоконтроллер, предназначенный для профессиональных аудиосистем высокого класса. Как раз для моего аудиоплеера! Напряжение питания ± 15 В. (Я запитал от БП ЦАП-а ± 10 В.)

Внутри - качественные операционные усилители, обеспечивают низкий уровень шума и искажений THD+N = 0.0004%, Нагрузить микросхему можно входным сопротивлением 600 Ом и выше.

Управление очень простое: выбираете микросхему с помощью пина CS и последовательно записываете 2 байта (старшими битами вперёд), с помощью пинов SDI и SCLK.
Первый байт – громкость правого канала, второй байт – громкость левого канала. Собственно это SPI интерфейс.

Рис. 15. Регулятор громкости на PGA2310 (без крышки)


Обслуживает микросхему PGA2310 базовый класс: PGA2310.
class PGA2310
    {
    byte max_admin_volume;     //максимальное значение громкости
    byte min_admin_volume;     //минимальное значение громкости
       
    unsigned short value;                  //текущий уровень громкости
    unsigned short value_right;          //текущий уровень громкости правого канала
    unsigned short value_left;            //текущий уровень громкости левого канала
             
    byte           balance_value_right;  //ослабление для правого канала   
    byte           balance_value_left;   //ослабление для левого канала
    
public:
         PGA2310(void);			   //конструктор
void mute (void);			   //тихо очень
void set_volume (int new_value);    //установить новое значение громкости
void set_balance (int balance);        //0 - нет   -255 левый тише, 255 правый тише
float get_dB(void);			    //получить текущее значение в dB
byte get_max_admin_volume(void); //получить максимальное значение громкости
byte get_min_admin_volume(void);  //получить минимальное значение громкости
void set_admin_volume(int min_v,int max_v);//установить пределы рег. громкости
};


Кроме простой регулировки громкости, в классе организована балансировка каналов. Данную функцию при необходимости можно будет осуществить (потом) с клиента на ПК или смартфоне. На самом аудиоплеере только регулятор громкости.

Также есть возможность задать пользовательское изменение диапазона регулирования громкости с помощью переменных max_admin_volume и min_admin_volume. Эти значения будут инициализироваться (при загрузке программы) из файла настроек, изменить их так же можно будет с помощью клиентов.

Пользовательский класс volume_control наследует функционал базовых классов PGA2310 и leds и полностью определяет регулятор громкости аудиоплеера. Фактически он содержит алгоритм изменения громкости в связке с индикатором на светодиодах.

class volume_control:public PGA2310, public leds
    {
    float step;				//шаг изменения громкости на один щелчок
    byte min_volume;			//минимальная стартовая громкость.
void parametr_update (void);
    public:
        volume_control(void);		//конструктор
        void up (void);			//громче
        void down (void);		//тише
  void set_admin_volume(int min_v,int max_v);//установить пределы рег. громкости
    };  


Я сделал так, что вне зависимости от пределов регулировки громкости светодиоды в индикаторе все равно светятся от 0 до 32. Пользователь (например жена) может закрутить ручку громкости до упора, будут гореть все светодиоды и зеленые и красные, но громкость будет ограничена.

Измерения

Не помешает посмотреть, что китайская PGA2310 внесёт в аудиосигнал, насколько вырастут искажения, шумы.
Измерительное устройство, как и в прошлый раз, звуковая карта ПК. Калибровка та же. Просто добавляется PGA2310.

Рис. 16. Шумы (всё подключено, воспроизведение отсутствует)

Рис 16. Шумы на том же уровне. Это хорошо! Немного подросла помеха от ИБП, наверное, потому что нагрузка на БП 5V выросла, подключена передняя панель.

Далее, на всех графиках воспроизводим синус 1 кГц, 0 dB как и в прошлый раз, и будем крутить регулятор громкости.

Рис. 17. Регулятор громкости -1 dB

Рис. 17. При уровне регулятора громкости 0 dB получил перегруз линейного входа ПК. Чуть-чуть PGA видимо усилила сигнал, поэтому смотрим при -1dB на регуляторе громкости. Сравниваем с рисунком 13 предыдущей моей статьи.

На глаз иголочки чуть-чуть подросли, рост искажений небольшой. В этот момент я понимаю, что я не зря сделал ставку на PGA2310. Всё получилось, все отлично!

Рис. 18. Положение регулятора громкости -7 dB


Рис. 19. Положение регулятора громкости -80,5 dB

Думаю, на этом можно закончить.

Видео регулятора в работе


Демонстрационное видео работы регулятора громкости и индикатора на светодиодах.

Загрузки

🎁Исходный код  4.03 Kb ⇣ 121
🎁Перевод кода PGA2310 в децибелы.xlsx  9.72 Kb ⇣ 97
🎁Плата и схема  78.72 Kb ⇣ 137

Надеюсь, вам пригодится материал.
Всем спасибо за внимание. Пока!

Камрад, рассмотри датагорские рекомендации

🌼 Полезные и проверенные железяки, можно брать

Опробовано в лаборатории редакции или читателями.




 

Читательское голосование

Нравится

Статью одобрили 110 читателей.

Для участия в голосовании зарегистрируйтесь и войдите на сайт с вашими логином и паролем.
 

Поделись с друзьями!

 

 

Связанные материалы

 

Схема на Датагоре. Новая статья Немножко о дизайне. Часть 1. Передняя панель... Сколько сайтов по усилителям не обошел, сколько не расчесывал интернет, тему дизайна всегда...
Схема на Датагоре. Новая статья Мощный светодиод в панель... Всем доброго дня! Возникла необходимость закрепить мощные светодиоды на панели без возможности...
Схема на Датагоре. Новая статья Алюминиевый плинтус в изготовлении корпуса УМЗЧ и небольшая история о сборке усилителя "из мусора" в условиях крайнего Севера... Вся история началась с того, что попал ко мне в руки музцентр со спаленными мозгами, но вполне...
Схема на Датагоре. Новая статья Регулятор громкости и тембра с ДУ на TDA8425 + ATMEL AT90S4433... Когда-то, в 2005-2006 году, мной был сделан регулятор громкости и тембра на TDA8425 с ДУ. Статья...
Схема на Датагоре. Новая статья Шкала со светодиодной подсветкой для усилителя: Corel + плёнка ORACAL + режущий плоттер... Привет, друзья! После публикации моей первой датагорской статьи «Ламповый аудио усилитель на 6П6С с...
Схема на Датагоре. Новая статья Метод крепления электрического защитного автомата на панели... Всем хороши современные автоматы: и малогабаритные и широкая номенклатура. Но они рассчитаны на...
Схема на Датагоре. Новая статья Даташит CS4350 pdf datasheet 192-kHz Stereo DAC with Integrated PLL... Давненько наш справочник не пополнялся полезняшками. Предлагаю возобновить традицию: нашли...
Схема на Датагоре. Новая статья Углы и овалы. Простые мониторы с переменным сопротивлением. 1ГД-40 + 2ГД-36... Я с детства не любил овал, я с детства угол рисовал… Колонки эти зародились неожиданно. В 1998...
Схема на Датагоре. Новая статья Новая жизнь старых колонок. 15ГД-17 (25ГДН4) в тандеме с S-30... Попавшийся по случаю динамик 15ГД-17 (25ГДН4—4) позволил сделать из старых колонок с...
Схема на Датагоре. Новая статья Storm - корпус усилителя, изготовленный в домашних условиях... Этот усилитель я сделал несколько лет назад. Тогда у меня ещё не было никого металлообрабатывающего...
Схема на Датагоре. Новая статья Предварительный аудиоусилитель: схема, плата, технология изготовления корпуса и карданных регуляторов... Эта статья — логическое продолжение моей статьи на Датагоре «Сделай сам корпус усилителя...
Схема на Датагоре. Новая статья Опыт переделки пассивной акустики 6АС-511 в активную. «Элегия 102» + TDA2030A... «Элегия 102», 6АС-511 Сказ про Ивана-самоделыча, гусли-самогуды эмпэтришные и колоды...
 

Комментарии, вопросы, ответы, дополнения, отзывы

 

<
Читатель Датагора

Yamazaki

<
Читатель Датагора

Datagor

<
Читатель Датагора

Sergiy_83

<
Читатель Датагора

StalKer-NightMan

<
Читатель Датагора

maddiego

<
Читатель Датагора

Sergiy_83

<
Читатель Датагора

max132

<
Читатель Датагора

Datagor

<
Читатель Датагора

Sergiy_83

<
Читатель Датагора

vlad59

<
Читатель Датагора

Sergiy_83



<
Читатель Датагора

max132

<
Читатель Датагора

alexzender

<
Читатель Датагора

Dimonos

<
Читатель Датагора

Sergiy_83

Добавить комментарий, вопрос, отзыв 💬

Камрады, будьте дружелюбны, соблюдайте правила!

  • Смайлы и люди
    Животные и природа
    Еда и напитки
    Активность
    Путешествия и места
    Предметы
    Символы
    Флаги
 
 
В начало | Зарегистрироваться | Заказать наши киты почтой