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

 
 
 
13

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

Разместил Sergiy_83 26 апреля 2017. Просмотров: 1 994


Всем читателям 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 загружен 11 раз.
Перевод кода PGA2310 в децибелы.xlsx | Файл 9,72 Kb загружен 10 раз.
Плата и схема | Файл 78,72 Kb загружен 14 раз.

Надеюсь, вам пригодится материал.
Всем спасибо за внимание. Пока!
Сергей (Sergiy_83)
Беларусь. Жодино
Профиль Sergiy_83
Электроникой увлекся в старших классах школы.
Потом закончил Минский профтехнический колледж электроники.
Потом «БГУИР» — Белорусский государственный университет информатики и радиоэлектроники. Инженер-электроник вот уже 11 лет.

Часто тянет что-нибудь изобрести.
Люблю программирование (Си, С++).
 

Понравилось? Палец вверх!

  • всего лайков: 73

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

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


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

Сергей / Yamazaki

Цитата
  • С нами с 2.07.2009
  • Ушёл в реал Пользователь offline
  • 138 комментариев
  • 3 публикации
 
  • +2
Отличное решение по ручке громкости! Тоже не выношу, когда ручка громкости хлипкая и болтается, вариант с подшипниками почти безальтернативен.
С этой точки зрения очень понравилось использовать шаговый двигатель. Он и механически безупречен, никаких люфтов, и его можно использовать как энкодер.

<
  • Главный редактор
26 апреля 2017 19:52

Игорь Петрович Котов / Datagor

Цитата
  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 1 649 комментариев
  • 261 публикация
 
  • +1
Сергей (Sergiy_83), я тихо прифигел над видео.
Жалко, что лайкнуть можно только 1 раз.
Очень красиво, целесообразно, во всех смыслах.
Спасибо!
yahoo

<
  • Гражданин
26 апреля 2017 20:54

Сергей / Sergiy_83

Цитата
  • С нами с 16.10.2012
  • Ушёл в реал Пользователь offline
  • 35 комментариев
  • 4 публикации
 
  • 0
Цитата: Yamazaki
его можно использовать как энкодер

Серегй спасибо. Да, я рассматривал и такое решение.
Цитата: Datagor
Жалко, что лайкнуть можно только 1 раз.

Спасибо Игорь. Тоже иногда приходит такая мысль, когда читаю статьи.

<
  • Подписчик
27 апреля 2017 08:25

Игорь / StalKer-NightMan

Цитата
  • С нами с 15.03.2012
  • Ушёл в реал Пользователь offline
  • 92 комментария
  • 1 публикация
 
  • +1
Какая красивенная панель получилась!!!
Эстетическое наслаждение...
И схемотехнические решения изящные.

<
  • Гражданин
27 апреля 2017 08:52

Тимур / maddiego

Цитата
  • С нами с 2.08.2016
  • Ушёл в реал Пользователь offline
  • 17 комментариев
  • 8 публикаций
 
  • +1
Вся эта штуковина выглядит очень даже круто!
Как заводская прям, целый день сидел бы крутил ручку громкости yahoo

<
  • Гражданин
27 апреля 2017 20:18

Сергей / Sergiy_83

Цитата
  • С нами с 16.10.2012
  • Ушёл в реал Пользователь offline
  • 35 комментариев
  • 4 публикации
 
  • 0
Игорь, Тимур, спасибо за теплые слова.

<
  • Гражданин
2 мая 2017 11:59

Максим / max132

Цитата
  • С нами с 15.11.2009
  • Ушёл в реал Пользователь offline
  • 51 комментарий
  • 0 публикаций
 
  • 0
Здорово.
Возник вопрос - индикатор показывает максимальную громкость, а на дисплее плеера что-то около -55db?
Как это согласуется?

<
  • Главный редактор
2 мая 2017 12:08

Игорь Петрович Котов / Datagor

Цитата
  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 1 649 комментариев
  • 261 публикация
 
  • 0
Максим, хочу заметить, что на дисплее вообще ничего не отображается.
Это, очевидно, нормально для этой стадии проекта.

Во всей красе, я верю, мы увидим дисплей в следующей части статьи Сергея. yahoo

<
  • Гражданин
2 мая 2017 12:29

Сергей / Sergiy_83

Цитата
  • С нами с 16.10.2012
  • Ушёл в реал Пользователь offline
  • 35 комментариев
  • 4 публикации
 
  • 0
Цитата: max132
Возник вопрос - индикатор показывает максимальную громкость, а на дисплее плеера что-то около -55db?
Как это согласуется?

Максим, вы немножко не внимательны. Я писал что светодиоды всегда будут гореть от минимума до максимума (для обычного пользователя). Светодиоды - это уровень громкости в пределах разрешенного диапазона, а на дисплее реальное положение регулятора громкости в dB. (см. абзац перед измерениями)

Цитата: Datagor
мы увидим дисплей в следующей части статьи

Через одну. В следующей - усилитель мощности.

<
  • Гражданин
2 мая 2017 21:19

Владимир / vlad59

Цитата
  • С нами с 12.03.2009
  • Ушёл в реал Пользователь offline
  • 26 комментариев
  • 0 публикаций
 
  • +1
Красиво сделано, молодец, Сергей!
Увидел ручку - аж слюнки потекли.

<
  • Гражданин
2 мая 2017 21:36

Сергей / Sergiy_83

Цитата
  • С нами с 16.10.2012
  • Ушёл в реал Пользователь offline
  • 35 комментариев
  • 4 публикации
 
  • 0
Владимир спасибо. Ручка китайская - OD45 Potentiometer Knob. Но она не металлическая, а пластмассовая.

<
  • Гражданин
11 мая 2017 20:25

Максим / max132

Цитата
  • С нами с 15.11.2009
  • Ушёл в реал Пользователь offline
  • 51 комментарий
  • 0 публикаций
 
  • 0
Sergiy_83,
Спасибо за уточнение, действительно не очень внимательно прочитал.
На дисплее абсолютные величины, а ручка весьма относительные smile

<
  • Кандидат
16 мая 2017 14:48

Александр / alexzender

Цитата
  • С нами с 5.07.2016
  • Ушёл в реал Пользователь offline
  • 12 комментариев
  • 3 публикации
 
  • 0
Смотрю я на вашу работу, Сергей, и чувствую себя старовером-Лыковым, гнущим руками кусок целлофана: "Стекло, а гнётся!" :)

Добавление комментария


Налетай! Паяльники, станции, жала с доставкой
  • smilelolbyewinkyahoocoollaughing
    crazybadcryingsadirefulsickstraight
    ballooncakegooddrinksmailbombsun
    nightrainstarscolddashguitar-manhandshake
    musicnegativenopardonshoksleepunknown
    wackoyawnblushbullyhashsmokingwhew
Скопируйте текст вашего комментария на случай неверного ответа на контрольный вопрос.