Самодельный Bluetooth усилитель АБ класса с автоматизацией управления питанием

Всё началось с лени.
А точнее, с Веги 50у-122с, доставшейся в наследство вместе с акустикой Электроника 25ас-033. И вначале всё было хорошо. А потом, споткнувшись за провод, был убит ноут. После этого, в Веге появился BT модуль, а сама Вега научилась включаться по подключению устройств к этому модулю.

Время шло и качества стало мало. Тогда был проведён Веге первый апгрейд. Потом второй. Потом акустике. Потом… Потом пришло понимание что надо делать что-то качественно новое. Ну, а когда Вега стала хрипеть и замаячила перспектива полной перепайки всех электролитов…

И началось строительство…
Кому лень читать технические подробности и хочется просто посмотреть как это работает — можно прокрутить в конец, там сокращённая видео версия для моего канала.

image


Это не рассказ про то, как спаять такое. Это не инструкция: не будет схем, не будет описания настройки итд.
Это будет рассказ, про идеи и технологии, которые я применяю в своих устройствах.
Идеи, которые я воплотил сам, и которые, может, захотите воплотить вы.

Итак.

Базовая идея. Хочу усилитель. Но не хочу путаться в проводах. Это и не удобно и не столь качественно как хотелось бы. Нужно некое беспроводное решение.

Вторая идея. Я не хочу куда-то там бегать и тыкать кнопочки. Особенно если я хочу послушать релаксирующую музыку перед сном. Да, я ленивая скотина, я хочу лечь на диван, нажать кнопку питания ноутбука и что б всё включилось и заиграло само. А когда я буду засыпать и ноут выключится скриптом — выключилось вслед за ним.

Третья идея. Таймеры. Иначе говоря — на выходных я ноут на ночь не выключаю. А это значит, что если реализовано просто включение питания по блютусу, то так всю ночь и будет включён усилитель. Как-то не круто, учитывая что во-первых снашиваются фильтрующие конденсаторы. А во-вторых, оно банально греется и пожирает электричество.

Идея четвёртая. Хочу индикатор. Большой. Красивый. Индикатор. И тут я нашёл ИН-33, на радостях аж написав предыдущую статью. Но не сказать что он большой, поэтому была найдена хитрость с плёночкой от монитора, которая визуально «раздваивает» шкалу.

В итоге, по обдумыванию всех идей, я пришёл к тому, что надо делать новый усилитель и с нуля.
Был заказан блютус модуль с apt-x:
image

Были заказаны готовые усилители AB класса:
image

Был куплен у деда шикарный ТОР на 200 Вт всего за 1000 руб. с готовыми отводами 2×26в и 2×12в. А вот остальное уже делал сам.

Корпус.

Корпус делался 300×300 мм, низ — дюралюминиевая пластина толщиной 5 мм на неё крепится П образно согнутый уголок 50×100*5 мм, к которому и крепятся транзисторы через силиконовые прокладки и комплекта, а сверху всё стягивается болтами и планкой 20×6 мм

image

image

Лицевая панель — минеральное стекло. Стекло бралось с фото рамки за 300 руб и подрезалось в нужный размер обычным стеклорезом.
Затем заказывалась шелкография. Причём, рекомендую не кроить на краске и таки сделать с краской по стеклу. Иначе оно рано или поздно отслоится и будет жаль.
image

Причём, рекомендую именно шелкографию, потому что прямая печать фигня. Поясню:
Прямая печать на просвет (другой проект)
image

А вот шелкография на просвет:
image

Отверстие под регулятор громкости просто сверлится сверлом по стеклу.
Причём, если делаете это в первый раз, рекомендую таки потренироваться. Это не так быстро и просто как кажется.
image

Затем сенсоры. На стекло наклеивался белый двойной скотч. Затем бралась медная фольга, с одной стороны заклеивалась скотчем, с другой ЛУТом наносился рисунок и травилось «насквозь».
Получалось вот так:
image

Затем фольга снималась, всё отмывалось и получалось:
image

Это готовые заготовки для сенсоров. К ним паялись отводы и вся конструкция лепилась на лицевую панель.
image

Важно точное совмещение. Потому что всё должно работать на просвет.
image

Далее индикатор. Для «расширения» шкалы применялась призматическая подложка от матрицы монитора. А что б она точно легла, клеилась суперклеем. Клея не жалеть!
Важно выгнать все пузыри и накладывать плёнку много шире самого индикатора, иначе клей перетечёт на обратную сторону и всё испортит.
Ну и надо учитывать, что «раздваивает» эта плёнка только в одной плоскости, так что важно выдержать строгую горизонтальность призм плёнки.
image

На этом, если всё подсветить изнутри, получится как-то так:
image

Но вот сделать ровную подсветку символов не так просто, как может показаться.
Дело в том, что если просто взять светодиод и начать светить, то свет засвечивает и часть иконки. Смотрится некрасиво. Причём, если в полутьме ещё может казаться что всё не плохо, то в полной темноте будет масса косяков засветки. Раздражало.

Выход такой:
Бралась фольга, скручивалась в конус:
image

Затем разогревался термоклей. Утюг мне для этого дюже понравился, хотя жена не разделяла моей радости…
image

Затем заливалось и обрезалось по размеру подсвечиваемой иконки, с обратной стороны сверлилось углубление под светодиод.
image

Ну и приклеивалось. Я клеил суперклеем. Но потом подумалось, что лучше б просто разогреть клей конуса и прям на него и приклеить.
А небольшие пробелы между фольгой конуса и фольгой иконки, заклеивались замазкой и закрашивались. Замазка — что б краска не затекла между светофильтром и сенсором. После установки светодиодов иконок — и они с торца закрашивались. Только так я смог полностью избавиться от сторонних заветов.

По схеме.
Начну с блоков питания. Их 2.

Первый — силовой блок питания, не стабилизирован по напряжению. Собран по схеме с 2-мя отдельными диодными мостами, в каждом плече по 33в постоянки и 3×10 000 мкФ блок электролитов, зашунтированных 0.33 мкФ плёнкой и 1 мкФ керамикой. Так же, и сами обмотки трансформатора зашунтированы 1 мкф керамикой.

Силовая разводка: от трансформатора до мостов 2.5 мм^2, от мостов до блоков конденсаторов — 4 мм^2, от конденсаторных блоков до план усилителей 6 мм^2.

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

Платы усилителей тоже пришлось полностью перепропаивать. Одна плата была ещё ничего, но вот вторая спаяна была просто похабно. + дополнительно пролудил силовые дорожки.

В качестве центрального «мозга» был выбран STM32. В принципе, я мог бы использовать и ардуину на AVRке, но у мег во-первых мало ног, а во-вторых всего один АЦП, из-за чего плохо работает индикатор. Дело в том, что пока оцифровываем один канал — звук меняется в обоих, и к моменту оцифровки второго, разница уже достаточно велика. Это бросается в глаза и этого хотелось избежать. Поэтому и STM32.

Схема индикатора мало чем отличается от схемы из предыдущей статьи (кстати, похоже никто так и не заметил ошибку в схеме, ну да ладно).

Управление.
Нужны были сенсорные клавиши. Порывшись в статьях про сенсорику для STM32, нашёл несколько вариантов, от которых был не в восторге.
Во-первых я ничего не понял)))
Во-вторых, мне надо было 5 кнопок. Да ещё и что б работало оно через 3-х мм минеральное стекло.

В итоге, пришлось вкурить в принцип, немного поэкспериментировать и получил следующий код:

Код считывания сенсорики
//Чуствительность
#define SenseMinLevel 100

//Пины
#define ButZ GPIOA, GPIO_Pin_10
#define BtnOn GPIOB, GPIO_Pin_15 
#define BtnOff GPIOA, GPIO_Pin_8
#define BtnAuto GPIOA, GPIO_Pin_9
#define BtnBT GPIOA, GPIO_Pin_3
#define BtnRCA GPIOA, GPIO_Pin_2

//Значение автокалиброки
volatile uint16_t CalibrateTimeB1 = 0; 
volatile uint16_t CalibrateTimeB2 = 0; 
volatile uint16_t CalibrateTimeB3 = 0; 
volatile uint16_t CalibrateTimeB4 = 0; 
volatile uint16_t CalibrateTimeB5 = 0;

//Возвращает код нажатой кнопки
uint8_t SenseButton(void)
{
                uint16_t m;
        
                uint16_t b1 = 0; uint16_t b2 = 0; uint16_t b3 = 0; uint16_t b4 = 0; uint16_t b5 = 0;
        
                for (m = 0; m < 21; m++)
                {                       

                        b1 += scan_sense_pin(BtnOff);
                        
                        b2 += scan_sense_pin(BtnOn);

                        b3 += scan_sense_pin(BtnAuto);

                        b4 += scan_sense_pin(BtnBT);

                        b5 += scan_sense_pin(BtnRCA);
                }
                
                if (CalibrateTimeB1 == 0)
                {
                        CalibrateTimeB1 = b1;
                        CalibrateTimeB2 = b2;
                        CalibrateTimeB3 = b3;
                        CalibrateTimeB4 = b4;
                        CalibrateTimeB5 = b5;
                }
                else
                {
                        if (b1 > CalibrateTimeB1)    b1 -= CalibrateTimeB1; else b1 = 0;
                        if (b2 > CalibrateTimeB2)    b2 -= CalibrateTimeB2; else b2 = 0;
                        if (b3 > CalibrateTimeB3)    b3 -= CalibrateTimeB3; else b3 = 0;
                        if (b4 > CalibrateTimeB4)    b4 -= CalibrateTimeB4; else b4 = 0;
                        if (b5 > CalibrateTimeB5)    b5 -= CalibrateTimeB5; else b5 = 0;
                }
                
                //Сравнение с калибровочными уровнями
                if (b1 > SenseMinLevel || b2 > SenseMinLevel || b3 > SenseMinLevel || b4 > SenseMinLevel || b5 > SenseMinLevel)
                {
                        if (b1 > b2 && b1 > b3 && b1 > b4 && b1 > b5)
                                return 1;
                        
                        if (b2 > b1 && b2 > b3 && b2 > b4 && b2 > b5)
                                return 2;

                        if (b3 > b1 && b3 > b2 && b3 > b4 && b3 > b5)
                                return 3;

                        if (b4 > b1 && b4 > b3 && b4 > b2 && b4 > b5)
                                return 4;

                        if (b5 > b1 && b5 > b3 && b5 > b4 && b5 > b2)
                                return 5;
                }
                
                return 0;
}

uint16_t scan_sense_pin(GPIO_TypeDef* port, uint16_t pin)
{
        uint16_t ret = 0;
                GPIO_ResetBits(ButZ);
                delay_t(1800);
                GPIO_SetBits(ButZ);
                
                while (!GPIO_ReadInputDataBit(port, pin) && ret < 500)
                {
                                        ret++;
                }
                GPIO_ResetBits(ButZ);
        return ret;
}

void delay_t(uint32_t ms) {
//        nCount=(RCC_Clocks.HCLK_Frequency/1000)*ms;
//        for (; nCount!=0; nCount--);
                                        
        for (; ms!=0; ms--);
}


Где — ButZ — затравочный пин, в режиме GPIO_Mode_Out_PP, остальные — считывающие в режиме GPIO_Mode_IN_FLOATING
Идея проста. Все считывающие сенсоры подключены к затравочному пину через резистор на 3МОм. Далее даём единицу на затравочный пин и смотрим — как долго будет заряжаться до логической единицы пин сенсора. Если дольше калибровочного времени — значит заряжать приходится и палец, к сенсору прислонённый. А значит — есть прикосновение к сенсору.

Режимы работы

Их три.

Первый — Просто выключено. И всё.

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

Третий — «А». А вот это — главный режим, автоматический. Если выбран блютус вход, то усилитель включается и выключается по подключению источника звука. Но если устройство подключилось и не играет — через 15 минут усилитель перейдёт в режим ожидания звука. И, конечно, если звука нет в течении минуты — выключается индикатор уровня.

Причём, не важно, какой аудио вход используется — будь то блютус или внешний RCA вход.

В общем-то остальное всё стандартно. Ручка громкости просто переменный резистор. Просто потому что основной регулятор громкости предполагается на ноутбуке и к усилителю для этого никто ходить не будет.

Результат — красиво. И не плохо звучит!

Видео:

© Geektimes