Всем читателям datagor.ru привет! Продолжаем строить аудиоплеер. Сегодня подключим к «Raspberry Pi» энкодер, регулятор громкости на основе чипа PGA2310 и индикатор уровня громкости на светодиодах. Также уделим внимание передней панели аудиоплеера.
Содержание статьи / Table Of Contents
↑ Передняя панель и блестящая «крутилка» громкости
Для размещения всех блоков нашего плеера я использую корпус от старого видеомагнитофона.В большинстве видеомагнитофонов передние панели имеют плавные обтекающие формы, но в моем случае, передняя панель плоская, и это хорошо.
Отсек для видеокассеты я выпилил полностью (см. рис 2).
Далее взял оргстекло 6 мм, отфрезеровал по периметру (рис. 3) и вставил с обратной стороны (рис. 4). Оргстекло немного затемнённое.
Получилось симпатично. На рисунке 5 - задняя панель с дисплеями и втулкой для ручки регулировки громкости. Здесь обычное оргстекло.
Рис. 5. Задняя стеклянная панель
Надевать ручку непосредственно на энкодер считаю не очень хорошей идеей. Ручка будет болтаться, особенно заметно, если ручка большая в диаметре. Да и энкодер износится быстрее. Втулку сделал из видеоголовки. В ней два подшипника, прецизионные. Вал от головки подошел к ручке без проблем (6мм).
На заднюю панель приклеил черную самоклеющуюся плёнку, на которой лазером вырезана шкала. В этом могут помочь рекламные фирмы, которые делают различные вывески и наружную рекламу. См. рисунок 7.
Здесь я планировал вырезать две шкалы, одну на черной плёнке, а вторую на рассеивающей прозрачной (транслюцентная плёнка), затем квадратики рассеивающей вставить в черную шкалу. Но такой хитрой рассеивающей плёнки не оказалось в наличии, и я просто позади оргстекла скотчем прилепил какую-то рассеивающую пленку из разбитой матрицы от ноутбука.
Получилось, в принципе, неплохо, но не так как хотелось - свет от светодиодов немного проникает в соседние сегменты.
Далее (рис. 8) всё оставшееся место на оргстекле, кроме дисплеев конечно, заклеиваем остатками чёрной пленки. По периметру на двусторонний скотч клеим ворсистый материал (чтобы пыль не проникала между передним стеклом и задней панелью).
Осталось в оргстекле пропилить отверстие для ручки и передняя панель готова (см. рис. 1)
↑ Светодиодный индикатор уровня громкости
В схеме применены замечательные микросхемы фирмы MOTOROLA MC74HCT574A . Это регистр (набор D триггеров) с параллельной записью. Чтобы превратить эту микросхему в сдвигающий регистр с последовательной записью, все внутренние D-триггеры соединяем последовательно. Следует отметить, что после включения питания, все выходы данной микросхемы устанавливаются в состояния логической единицы. А это значит, что светодиоды не горят и необходимость в предварительном сбросе схемы отпадает.
Стабилизатор VR1 позволят установить необходимую яркость светодиодов. Я, непонятно почему, сделал 33 светодиода, поэтому первый светодиод LED1 пришлось зажечь навсегда.
Обслуживает индикатор базовый класс устройства - 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 осциллограмма импульсов энкодера. Алгоритм следующий: периодически опрашиваем пины, если состояние в предыдущем опросе было «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 энкодер соединяется с валом с помощью резинового шланга, внутренним диаметром 6 мм.
↑ Регулятор громкости на PGA2310
Микросхема PGA2310 - высокопроизводительный стереофонический аудиоконтроллер, предназначенный для профессиональных аудиосистем высокого класса. Как раз для моего аудиоплеера! Напряжение питания ± 15 В. (Я запитал от БП ЦАП-а ± 10 В.)
Внутри - качественные операционные усилители, обеспечивают низкий уровень шума и искажений THD+N = 0.0004%, Нагрузить микросхему можно входным сопротивлением 600 Ом и выше.
Управление очень простое: выбираете микросхему с помощью пина CS и последовательно записываете 2 байта (старшими битами вперёд), с помощью пинов SDI и SCLK.
Первый байт – громкость правого канала, второй байт – громкость левого канала. Собственно это SPI интерфейс.
Обслуживает микросхему 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. Шумы на том же уровне. Это хорошо! Немного подросла помеха от ИБП, наверное, потому что нагрузка на БП 5V выросла, подключена передняя панель.
Далее, на всех графиках воспроизводим синус 1 кГц, 0 dB как и в прошлый раз, и будем крутить регулятор громкости.
Рис. 17. При уровне регулятора громкости 0 dB получил перегруз линейного входа ПК. Чуть-чуть PGA видимо усилила сигнал, поэтому смотрим при -1dB на регуляторе громкости. Сравниваем с рисунком 13 предыдущей моей статьи.
На глаз иголочки чуть-чуть подросли, рост искажений небольшой. В этот момент я понимаю, что я не зря сделал ставку на PGA2310. Всё получилось, все отлично!
Думаю, на этом можно закончить.
↑ Видео регулятора в работе
Демонстрационное видео работы регулятора громкости и индикатора на светодиодах.
↑ Загрузки
🎁Исходный код 4.03 Kb ⇣ 121🎁Перевод кода PGA2310 в децибелы.xlsx 9.72 Kb ⇣ 97
🎁Плата и схема 78.72 Kb ⇣ 137
Надеюсь, вам пригодится материал.
Всем спасибо за внимание. Пока!
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.