Всем датагорцам привет!!! А вот и я, и снова изобретаю аудиоплеер. Смотри также цикл моих статей об аудиоплеере «Raspberry Pi» на Датагоре.
Сегодня мы будем собирать классную Панель управления с графическим дисплеем и радиальный LED-индикатор громкости.
На этот раз я решил придать устройству универсальности: долой GPIO, даёшь USB!
Кто умеет работать с мини-компами, тот легко всё настроит сам на своём любимом. А для всех остальных предлагаем отработанный вариант для Nano Pi NEO2. Образ SD-карты с ОС и настройки в комплекте.
Содержание статьи / Table Of Contents
↑ Как это работает?
Панель работает по USB-порту на любом компе под ОС Linux. С этим модулем для изготовления навороченного плеера нам подойдёт практически любой «пирожок» — одноплатный мини-компьютер с USB: Raspberry Pi, Orange Pi, Nano Pi, Banana Pi и пр.↑ Что важно при выборе мини-компа
• Хорошо бы иметь иметь на борту 4 USB-входа (пусть часть с гребёнки): 1 — наша Панель управления, 2 — внешний HDD, 3 — для флешки (если надо с флешки музыку слушать), 4 — на USB DAC, например, наш Project-1 «Goldsmith».Если портов USB не хватает, а на недорогих мини-ПК USB-порт обычно всего один, можно применить модули — хабы USB2.0. Мной на практике не проверено, я такой хаб не заказывал. Но народ пишет в Сети, что работает.
• Попробуйте воспроизводить на вашем минике ваши любимые форматы. Если комп их декодирует тяжело, затыкается, заикается, то имеем явное несоответствие вычислительных мощностей кандидата на эту роль.
• Если вы предполагаете подключить внешний ЦАП по I²S, то необходимо убедиться, что у одноплатника выведен I²S (обычно на гребёнку). Есть образы ОС от Nik Kov с прописанной поддержкой I²S для следующих плат: nano pi neo2, nano pi air, nano pi neo plus2, nano pi neo, cubietruck. С другими платами нужно разбираться самостоятельно.
↑ Видео тестирования Панели
Слушали когда-нибудь музыку на осциллографе? Хотите попробовать? А придётся! ? Просто на момент теста не было у меня внешнего ЦАПа.Панель формирует и отправляет сигналы управления от кнопок и энкодера по USB соединению на специально написанную софтинку и далее на программный плеер Linux, а также получает от миним-компа обратную связь и отображает информацию на графическом дисплее.
? Поддерживается управление плеером со смартфона!
↑ Особенности Панели управления
? Важнейшая фича — подключение по USB. Позволяет организовать стационарный плеер на любом Linux-компьютере, без привязки к GPIO.? Все органы управления подключаются к плате Панели.
? Использованы популярные недорогие дисплеи (т.н. «ардуиновские»).
? Новый блок индикации уровня громкости для новой Панели.
? Платы заводские, ниже ссыка на заказ.
? Переработан код МК.
↑ Структурная схема
Этот плеер, как законченное устройство, я пока не собрал, но ему однозначно быть. Структура его немного изменилась. Обновим в памяти что к чему, см. Рисунок 2.Эта упрощенная структурная схема, на ней не показаны еще блоки питания устройств.
USB плата расширения — обслуживает переднюю панель устройства (плеера). К ней подключается TFT дисплей, клавиатура, энкодер, индикатор уровня громкости, регулятор уровня громкости PGA2310.
Кнопки управления плеером - это обычные кнопки без фиксации, один вывод которых объединен и подключаются к общему проводу.
TFT дисплей — это китайский модуль MAR3955 или MAR3502 предназначенный для Arduino UNO, вставляются в USB плату расширения.
Энкодер регулировки громкости — обычный AB-фазный энкодер. Подключается напрямую к плате.
Индикатор уровня громкости — это обновленный индикатор, на нём 32 светодиода, показывает уровень громкости в процентном отношении. Имеет возможность программно изменять яркость светодиодов, из соображений снижения помех ШИМ не применяется.
Так же возможно регулировать яркость дисплея. Регулятор громкости, как и в прошлый раз, будет на PGA2310. USB плата расширения поддерживает именно этот чип. Регулятор громкости теперь можно отключать вообще (в параметрах программы). Или можно задействовать программный регулятор громкости подсистемы ALSA, если он, конечно, поддерживается драйвером.
Дисплей, кстати, тоже можно отключить, случай когда дисплей ещё не прилетел из Китая, а уже всё собрано и слушать плеер уже очень хочется. Индикатор уровня громкости так же можно отключить в параметрах. Всё можно отключать, даже сама плата расширения не обязательное устройство.
Если в параметрах программы Audio Commander не указывать ни одного устройства, то остается только сетевое управление плеером с Андроида.
↑ Графические дисплеи для проекта и новый интерфейс
Нормальные дисплеи в Китае найти не так уж легко. А дождаться их ещё сложнее. Я выбирал среди модулей для Ардуино, с экраном на 3,5 и 3,9 дюйма, с разрешением 480×320. Другой критерий выбора — контроллер. Нам подойдут ILI9486 (очень популярный) или ST7796S.И, наконец, берём платы с резистором ограничения тока подсветки (R1) с обратной стороны. Таких дисплеев нашлось не мало. Основная масса из них это клоны модулей MAR3502 и MAR3955.
Дисплей 3.5 дюйма 480×320 на ILI9486 заказываем тут, тут, или тут. Везде есть выбор - с или без сенсорной панели.
Дисплей 3.95 дюйма 480×320 на ST7796S заказываем тут.
Хочу отметить, что эти модули хорошо документированы.
Чем же они хороши? Во-первых, они яркие. Углы обзора очень даже ничего. А самое главное, подсветку запитали через резистор R1. Додумались наконец-то! В идеале нужно было бы повесить на каждый светодиод по резистору, но спасибо и на этом.
Мы же этот резистор отпаяем совсем и соединим проводом с платой расширения для регулировки яркости подсветки. См. рисунок 4. Регулировку яркости я сделал для галочки, так как есть регулировка на индикаторе уровня громкости. Главное, что дает это соединение — это возможность выключить подсветку на время, пока дисплей не инициализарован. При старте на дисплее «каша», и, чтобы это исключить, я включаю подсветку с задержкой.
Я по началу купил себе такой, тачскрин был наклеен криво и закрывал где-то 5 пикселей. Он долго не протянул, пустил полосу. И когда я его оторвал от платы, то заметил разрезанный шлейф, в котором была подпаяна какая-то «сопля». Я так понял, платы были косячные и они исправляли брак, ставя перемычку в шлейфе. Извращенцы. ?
На выбранных модулях тачскрина нет, они дешевле. Но они бывают и с тачскрином. В моем проекте тачскрин не используется, но его стекло может служить дополнительной механической защитой дисплея. То есть, если ставить в корпус без своего стекла, то лучше взять с тачскрином. Тачскрин можно снять, а толстое стекло останется.
В прошлой версии плеера у меня было целых два дисплея, да дефицитные к тому же. Теперь я исправился. На разрешении 480×320 у меня входит вся необходимая информация на один дисплей.
Здесь вторая строка — информационная, информация постоянно меняется. Например, покрутил громкость — напишет уровень громкости на некоторое время. Шрифт новый — 8×12, немного пришлось его ужать по высоте, чтобы влезли десять строк. Да, да, в Пайнте пришлось 255 символов отредактировать. ?
Выбор контроллера дисплея и разрешение графического интерфейса производится при компиляции прошивки в файле S83_configuration.h.
Пока ждал дисплеи из Китая, сделал графический интерфейс 320×240 для контроллера RM68090, он же ILI9325, но на этих дисплеях модули я не покупал. Просто он у меня завалялся с какого-то китайского «айфона».
↑ Схема и устройство Панели управления
Схему в высоком разрешении скачать можно во вложениях. Панель выполнена на популярном микроконтроллере STM32F103C8T6.
↑ Список элементов
Полные списки берите в pdf-ках:
🎁bom-usb-eb.pdf 489.32 Kb ⇣ 63
🎁bom-vol-leds.pdf 482.18 Kb ⇣ 52
↑ Печатная плата в сборе
Как говорил выше, плата заводская.
↑ Назначение разъёмов
Рассмотрим назначение разъемов.X1 — Подключается к USB порту компьютера.
X2 — AB-фазный энкодер. Сигналы относительно GND. Pin 5V не используется.
X3 — LCD модуль.
X4 — Плата индикации уровня громкости.
X5 — Регулятор громкости на PGA2310
X6 — Зарезервирован
X7 — Кнопки управления плеером. Сигналы относительно GND. Pin 5V не используется.
X8 — LCD модуль.
X9 — LCD модуль.
X10 — Питание платы 5V. Сигнал 'W' — сигнал для блока питания (для снятия питания). Через USB шнурок питать конечно можно, но не стоит. Лучше завести отдельно от блока питания.
X11 — Разъем программирования. Разъем для подключения программатора ST-Link v2.
↑ Регулировка яркости дисплея
Уделим внимание схеме регулировки яркости дисплея. См. Рис. 9. Возможно, потребуется небольшая настройка.Выводов у STM32F103C8T6 не хватило для моих нужд, я решил расширить их сдвиговым регистром IC3. Пять первых разрядов R2R-матрица преобразует цифровой двоичный код в аналоговый сигнал, который в свою очередь подается на стабилизатор IC4 или IC5.
Я развел плату под два вида корпусов стабилизаторов: SOT223 и TO252. Стабилизатор на 1.8V, например, LF18 или FSP2160-1.8. Основное требование к стабилизатору — это минимально возможный ток по земляному выводу GND. Иначе, этот ток будет влиять на напряжение с R2R матрицы. В идеале эти стабилизаторы должны быть выполнены по CMOS-технологии, как FSP2160, но её нигде не удалось найти.
При питании IC3 = 5V и при 50% установленной яркости напряжение с выхода R2R составит 2,5V. При запайке LF18 оно поднялось до 3V. Далее вступает в работу резистор R25, R26. Его задача — снизить это напряжение. Я хотел вместо этих резисторов ставить подстроечный, но потом забыл. Этот резистор должен обеспечить при 100% заданной яркости минимальное рабочее входное напряжение для стабилизатора, при этом на выходе LF18 получается 4,5V. Для LF18 подойдет 470 Ом.
В итоге мы получим изменение напряжения где-то от 1,8V (2V) до 4.5V. Яркость светодиодов LCD матрицы резко падает, когда на них выпадает меньше 2 Вольт. То есть, нет смысла регулировать напряжение меньше 2V. А если выходной транзистор стабилизатора полевой, как у FSP2160, то от 2 до 5V.
В этой схеме стабилизатор применяется не для стабилизации, а как усилитель. Транзистор T1 снимает выходное напряжение с регулятора яркости. Он закрыт при подаче питания, пока не пройдет инициализация дисплея. Недостаток этой схемы — это немного нелинейная регуляция яркости, так как напряжение питания не велико. Вообще, этот кусок схемы не претендует на Оскара, но надежно работает.
↑ Исходный код
С помощью программы STM32CubeMX была сгенерирована заготовка USB Custom HID device, потом немножко допилена вручную. Проект для среды разработки Keil uVision 5.Обработка энкодера и клавиатуры организована с помощью прерываний. В файле перед компиляцией S83_configuration.h выбирается графический интерфейс и тип контроллера LCD дисплея, а так же ориентация изображения на дисплее.
//Выбор графического интерфейса плеера для разных разрешений экрана
//#define CONFIG_GUI_320×240 1
#define CONFIG_GUI_480×320 1
//Выбор контроллера дисплея
#define CONFIG_LCD_ILI9486 1 //480×320
//#define CONFIG_LCD_ST7796S 1 //480×320
//#define CONFIG_LCD_ILI9325 1 //320×240
//#define CONFIG_LCD_RM68090 1 //320×240
//Выбор ориентации картинки
#define CONFIG_ORIENTATION_LANDSCAPE_01 1
//#define CONFIG_ORIENTATION_LANDSCAPE_02 1
По умолчанию выбран графический интерфейс 480×320 и контроллер ILI9486. С помощью LANDSCAPE_02 можно перевернуть изображение вверх ногами, может пригодится, если механически дисплей нужно будет перевернуть в корпусе устройства, при сборке. Ориентация осуществляется контроллером дисплея. После изменений нужно пересобрать проект.
↑ Добавление поддержки других дисплеев
За тип дисплея (ILI9486) отвечают 2 файла S83_lcd_ILI9486.h и S83_lcd_ILI9486.с — можно назвать их драйвером. Для добавления новых дисплеев нужно написать и добавить по аналогии эти файлы. Затем указать их, аналогично используемым, в файлах S83_lcd.c S83_lcd.h и файле конфигурации S83_configuration.h.↑ Прошивка платы Панели управления
Прошить контроллер можно прямо из среды Keil. Можно прошить с помощью STM32 ST-LINK Utility. Я прикреплю два HEX-а для ILI9486 и ST7796S. Чисто для прошивки нет смысла устанавливать Keil. Прошивается с помощью недорогого программатора ST-Link v2.↑ Круговой индикатор уровня громкости
Эта первая схема, которую я начертил в Altium Designer и заказал печатные платы. Получилась с первого раза. Построен на пяти сдвиговых регистрах 74HC595. Четыре для светодиодов и последний для регулятора яркости.
Принцип регулировки яркости тот же, что и на плате расширения. Плата разведена под стабилизатор SOT223 (FSP2160B — 1.8V). Стоит заметить, что в даташите по FSP2160B распиновка ошибочна и соответствует классической AMS1117.
Применены светодиоды — китайские LED «кирпичики» 2×5×7 мм, яркость приблизительно 1000 — 1500 mcd.
NB! На схеме светодиоды, по ошибке, нарисовал в другую сторону, поверну как положено в следующей версии платы.
↑ Программные новшества. Audio_commander (AC83) + клиент для Android (С83)
Подпилил напильником поддержку CUE, под все кривые CUE файлы, конечно, не подстроишься, но теперь вроде все работает, как надо. Многофайловые CUE теперь тоже учтены. Многофайловые — это когда на каждую песенку по аудио файлу, а еще бывает, например — аудио файлов 4, а треков 20.В плеере все же должна быть возможность создавать собственные плейлисты. Добавил два типа плейлистов.
↑ Первый тип плейлиста — это просто целевая папка.
Так как у меня плеер по папкам, то пускай, создать папку — это и будет создать плейлист. А добавлять в нее будем жесткие ссылки файловой системы. Все современные файловые системы поддерживают жесткие ссылки.Чем хороша такая ссылка? Это готовый ярлык, ничего своего изобретать не надо. Если попытаться удалить файл, на который ссылается жесткая ссылка, то файл все равно останется в плейлисте, так как удаляется не файл, а одна из записей о файле в файловой системе. Папку тоже можно добавить в плейлист, только это уже будет символическая ссылка.
Придумать можно все, что угодно, а вот реализовать это на экране смартфона, да чтобы ещё и удобно было — это самое сложное.
Я все сделал через контекстное меню (см. рисунок 12).
↑ Второй тип плейлиста — фоновый плейлист.
Это временный плейлист, который мы слушаем в данный момент; при смене каталога во время воспроизведения, играющий список автоматически становится фоновым. Это сделано для того, чтобы можно было полазить по папкам и набросать в плейлист файлов. Можно выделять и выполнять некоторые действия над группой файлов. Например удалять файлы в корзину, или просто из списка, или добавлять в плейлист.Что еще? Еще можно переименовывать файлы.
Также задействован программный эквалайзер mplayer-а, при необходимости настройки эквалайзера можно задать для каждой папки (плейлиста) индивидуально. Считается, что эквалайзер это зло, но моим 50АС-106 он очень помогает. В любом случае, этот «вредный» фильтр можно отключить и не использовать.
↑ Mplayer
Напомню, я его использую в качестве инструмента для воспроизведения аудиофайлов. Попал он мне под руку в этот раз основательно.Немного разобрался в исходниках, удалил все связанное с видео, или почти все. Теперь он компилируется не пол дня, как раньше, а минут 10, в зависимости, конечно, от мощности компьютера.
В планах разобраться полностью, как он устроен.
↑ Пара слов о Nano PI NEO2
Прикупил я когда-то Nano PI NEO2, маленький, полноценные USB, чип снизу — удобно для охлаждения. И вот, дождался этот миникомп своего часа.Рис. 13. Невероятно маленький Nano PI NEO2, всего 40×40 мм!
Рис. 14. Внешний вид с обеих сторон
NanoPi NEO2 — это маленький одноплатный компьютер ARM от FriendlyElec. Используется 64-битный четырехъядерный SoC от Allwinner H5 (ARM Cortex-A53). Графический шестиядерный процессор Mail450, 512 МБ DDR3. Есть готовые файлы образов ОС UbuntuCore и Armbian.
Кроме того, в таком небольшом размере Nano PI имеет Gbps Ethernet и USB-порт.
Для хранения данных служит сменная карта microSD. Питание 5V/2A подается через разъём MicroUSB. Есть последовательный порт отладки и 24-контактный GPIO.
Купить Nano PI NEO2 можно на Aliexpress. Или у другого продавца Nano PI NEO2 v1.1. Или тут: несколько предложений Nano PI NEO2
Имеются разнообразные платы расширения с дополнительными разъёмами и функционалом.
↑ Образ ОС на SD-карте для Nano PI NEO2
Здесь всё просто — записал образ на карту памяти и готово. Образ на microSD карту можно записать с помощью Win32DiskImager, например. Минимальный объем карты 2 Gb.За основу был взят образ с Volumio, предложенный Nik Kov. Он дописал ядро Linux, и теперь NanoPI Neo2 может работать в двух режимах I²S — Master и Slave.
Volumio я удалил и поставил в автозагрузку свой Audio commander.
В образе включен режим Master. Можно использовать, подключив по I²S, ЦАП на PCM5102, или мой первый ЦАП на СS4350 и многие другие.
Карту нужно отформатировать в ext4, необязательно конечно, но нужно иметь ввиду что в fstab он монтируется как ext4 в /media. Туда же автоматически монтируется USB флешка, вставленная в свободное USB гнездо.
IP адрес назначается по DHCP автоматически. Я рекомендую на роутере привязать какой-нибудь IP адрес к MAC адресу, чтобы всегда назначался один и тот же IP адрес.
Настройки для входа по SSH: root / pi.
↑ Файлы
🎁Проект Панели управления в Altium 2.81 Mb ⇣ 60🎁Проект индикатора уровня громкости в Altium 1.27 Mb ⇣ 41
🎁Список деталей bom-usb-eb.pdf 489.32 Kb ⇣ 63
🎁Список деталей bom-vol-leds.pdf 482.18 Kb ⇣ 52
🎁Исходный код программы Панели 1.16 Mb ⇣ 47
🎁Скомпилированные прошивки для Панели 56.68 Kb ⇣ 45
🎁Исходный код Audio Commander «AC83» 125.04 Kb ⇣ 38
🎁Скомпилированные бинарники «AC83» и mplayer для разных архитектур x86, armv7, aarch64 3.54 Mb ⇣ 50
🎁Исходный код клиента для андроид «C83» 5.64 Mb ⇣ 40
🎁Установочный архив клиента для Андроид C83.apk 7.4 Mb ⇣ 42
🎁Исходный код оптимизированного mplayer 1.78 Mb ⇣ 37
↑ Ссылки
• Мой готовый образ ОС для NanoPi NEO2 в облаке mail.ru• Образы ОС от Nik Kov с прописанной поддержкой I²S
• Документация на дисплейные модули MAR3502, MAR3955 и др.
• Программа STM32CubeMX для быстрого конфигурирования чипов STM32
• Среда разработки Keil uVision 5
• Официальный Вики по NanoPi_NEO2
• Программа Win32DiskImager
Спасибо за внимание.
Продолжение следует!
↑ Быстрый заказ заводских плат проекта
• Плата #1 — основная плата USB Панели управления• Плата #2 — радиальный LED-индикатор громкости
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.