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

Аппаратный Hi-Fi аудиоплеер MkII. Часть 3. Плата-адаптер для NanoPi

📆1 апреля 2024   ✒️Sergiy_83   🔎260   💬2  

Всем датагорцам привет! Продолжаем заниматься любимым делом. Для культурного согласования с платой ЦАП в корпусе пришлось сделать небольшую аудио-ориентированную платку с нормальными разъёмами.

Переходная плата для NanoPi Neo2 (AIR)

Рассмотрим, что на ней есть.
X8 — Разъем для подключения USB-UART переходника. С его помощью можно попасть в систему через виртуальный COM порт. В этом пригодится программа PuTTY. В этот порт ядро пишет свои сообщения. И так как плеер запускается через /etc/rc.local то весь лог активности плеера также можно наблюдать в реальном времени при работе. Покрутили ручку громкости, и светодиод TX весело моргает.
X4, X6 — USB порты. В один я подключаю USB модуль расширения в данном плеере. А в другой — USB HDD планирую или выведу наружу устройства.
X1, X2 — Шина i2c /dev/i2c-0. К ней будет подключен новый i2C индикатор уровня громкости (в следующей статье рассмотрим). Второй разъем — свободный пока.
X7 — Разъем питания. 5V
X3 — SPDIF выход. Можно вывести наружу. Вдруг пригодится.
X9 — Аналоговый выход. Отличная штука, для временного прослушивания, пока ЦАП не созрел, например.
X5, X10, X11 — Разъемы для подключения модуля ЦАП, рассмотренного в предыдущей статье.
И еще осталась небольшая гребенка с GPIO. Можно туда прикрутить дополнительный энкодер, например. Или инфракрасный приемник. Или дополнительные кнопки управления плеером.


Рис. 2 Модули вместе.


Энкодер в Linux с помощью GPIO


Рис. 3 Свободные GPIO

И так у нас есть свободные GPIO, или у Вас, на вашем одноплатном мини ПК. Поиграемся с ними, необычно на этот раз.
Допустим, мы хотим прикрутить к ему AB-фазный поворотный энкодер. Например, что бы гонять курсор, для навигации. Или управлять громкостью плеера. Да, на USB модуле расширения уже можно подключить энкодер, но это теперь не единственный вариант. Этот способ я отработал недавно на первом своем плеере.
В Linux в ядре есть (зависит от конфигурации сборки ядра) специальный модуль rotary-encoder, который отвечает за работу с энкодером, подключенным к GPIO одноплатного миникомпьютера. Этот модуль создает файл событий, как если бы мы подключили мышь или обычную USB клавиатуру.
Начиная с версии 2.06 в моем плеере существует возможность работы с файлами входных событий. Это файлы /dev/input/event*. То есть нам надо запустить модуль ядра, и прописать файл в настройках плеера.

Настройка в Armbian

Напишем оверлей дерева устройств sun8i-h3-enc-pg11-pa2.dts (для Air) следующего содержимого:

Здесь gpios = это выбор GPIO пинов одноплатника. Первая цифра это: 0-PA, 1-PB, 2-PC и так далее. Вторая цифра — номер пина на порте A в данном случае. Третья цифра всякие флаги, флаги настройки пина в дереве устройств (подтяжка, открытый коллектор и так др.).
Далее выполняем команду armbian-add-overlay sun8i-h3-enc-pg11-pa2.dts
После этого у нас должен появиться файл sun8i-h3-enc-pg11-pa2.dtbo в директории /boot/overlay-user и в фале /boot/armbianEnv.txt, запись user_overlays = … sun8i-h3-enc-pg11-pa2 …
Ваше ядро на вашем одноплатнике может быть собрано без модуля rotary-encoder. Как узнать? Смотрим файл /boot/config-6.7.0 — это файл конфигурации текущего ядра, ищем в нем определение CONFIG_INPUT_GPIO_ROTARY_ENCODER его значение должно быть y или m. В моих образах я задействовал этот модуль при обновлении ядра Линукс.

Настройка в Raspbian

Если у вас Raspberry Pi, то в Raspbian этот модуль есть 100%. Что бы задействовать его в Raspbian (Raspberry Pi) нужно в /boot/config.txt в конце прописать уже имеющийся в системе overlay дерева устройств.
[all]
dtoverlay=hifiberry-dac
dtoverlay-i2s-mmap
dtoverlay=rotary-encoder,pin_a=2,pin_b=3,relative_axis=1

Здесь pin_a=2, pin_b=3 – это номера GPIO, к которым будет подключен энкодер. После перезагрузки, если эти GPIO не заняты другим модулем ядра (например i2c), в директории /dev/input появится файл event0. Запустим gpioinfo | grep rota и посмотрим, какие пины заняты энкодером.

line  2:    "SDA1"  "rotary@2"  input active-high [used]
line  3:    "SCL1"  "rotary@2"  input active-high [used]

Здесь SDA1 и SCL1 – это просто имена GPIO, на которых есть аппаратный i2c, это их назначение в Raspbery. Но так как у нас, допустим, нет устройств i2c и модуль, который отвечает за i2c, не выбран в /boot/config.txt, то мы можем их использовать по своему усмотрению.
Теперь мы можем установить утилиту evtest (apt install evtest) и посмотреть, какие события происходят при повороте ручки энкодера.

root@Player:~# evtest /dev/input/event0
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0
Input device name: "rotary@2"
Supported events:
 Event type 0 (EV_SYN)
 Event type 2 (EV_REL)
 Event code 0 (REL_X)
Properties:
Testing ... (interrupt to exit)
Event: time 1707407198.313071, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1707407198.313071, -------------- SYN_REPORT ------------
Event: time 1707407198.412048, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1707407198.412048, -------------- SYN_REPORT ------------
Event: time 1707407198.636911, type 2 (EV_REL), code 0 (REL_X), value -1
Event: time 1707407198.636911, -------------- SYN_REPORT ------------
Event: time 1707407198.813153, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1707407198.813153, -------------- SYN_REPORT ------------
Event: time 1707407198.872408, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1707407198.872408, -------------- SYN_REPORT ------------
Event: time 1707407198.946982, type 2 (EV_REL), code 0 (REL_X), value 1
Event: time 1707407198.946982, -------------- SYN_REPORT ------------

Все работает ура.
Теперь в настройках плеера нужно раскомментировать IN_EVENT и прописать события

#Устройства ввода. 
#Можно задать одновременно несколько устройств ввода.
IN_EVENT	 #Включить обработчик событий. (файл: /dev/input/*. Не более 5 файлов)
#Формат события: Type:Code:Value. Просмотр событий - утилита evtest. (Отключенное событие - off или Type = -1).
 event_0_fname = "event0"	#Имя файла - интерфейса в директории /dev/input/* 
 event_0_key_vol_up = 2:0:-1	#Событие "Громкость вверх"
 event_0_key_vol_dn = 2:0:1	#Событие "Громкость вниз" 
 event_0_key_up = off	#Событие "Курсор вверх"
 event_0_key_dn = off	#Событие "Курсор вниз"
 event_0_key_play = off	#Событие "Воспроизвести"
 event_0_key_stop = off	#Событие "Стоп"
 event_0_key_next = off	#Событие "Следующий трек"
 event_0_key_prev = off	#Событие "Предыдущий трек"
 event_0_key_ps = off	#Событие "Завершение работы"
 event_0_key_sw = off	#Событие "Следующий элемент коммутатора"
 event_0_key_ff = off	#Событие "Перемотка вперед"
 event_0_key_rw = off	#Событие "Перемотка назад"
 event_0_key_mute = off	#Событие "Тихо"
 event_0_key_repeat = off	#Событие "Повтор списка"
 event_0_key_random = off	#Событие "Случайный порядок"
……

Такие же события выдает мышь при движении по оси X. Таким же способом можно прописать события обычной USB клавиатуры. К пину PL11 можно подключить инфракрасный приёмник. Оверлей cir (в Armbian) создаст файл /dev/input/event1.
В общем, что хочу сказать, это единственно грамотный способ подключения энкодера в Линукс. На своем первом плеере, на Raspbery, этот метод теперь успешно работает. В ядре Линукс есть ещё много модулей, с помощью которых можно использовать GPIO, да и вообще, чего там только нет, а точнее есть. В этот раз я рассказал о rotary-encoder. Потом расскажу еще про какой-нибудь модуль.

Обновление образов

Прикупил себе проиграться еще NanoPi Air. В облаке теперь образы и для Air и для Neo2. В случае с NEO2 все просто: записал образ на флешку, вставил Ethernet кабель и все, мы в сети. У Air на борту Wi-Fi и встроенная emmc память. И что бы первоначально подключится к своей сети надо что-то придумать более-менее удобное. Можно конечно через USB TTL переходник подключится и сконфигурировать wi-fi, но это не совсем удобно, особенно для начинающего пользователя Linux.
Решил, что надо сделать через USB флешку.
Итак, для того, что бы подключиться к домашней сети: флешка должна иметь метку тома AC83 , быть отформатирована в FAT32 и в корневой директории содержать файлик wifi.txt. В нем через пробел имя сети SSID и пароль. Например: TP_LINK 1234567890
Вставляем в USB порт и через пару секунд должно произойти подключение к домашней сети. Как это сделано:
В папке /lib/udev/rules.d правило /lib/udev/rules.d/99-upap.rules
В нем
KERNEL=="sd[a-z]*",ACTION=="add",ENV{ID_FS_LABEL}=="AC83", RUN+="/programs/connect_to_router.sh"

В скрипте connect_to_router.sh
#! /bin/sh
#Этот скрипт запускается при автомонтировании флеш накопителя
echo "Вставлен USB флеш накопитель" > /dev/console
sleep 4
# Путь к файлу с именем сети и паролем
file_path="/media/AC83.vfat/wifi.txt"
# Чтение имени сети и пароля из файла
echo "Читаем настройки wi-fi из файла: $file_path" > /dev/console
read -r ssid password < "$file_path"
# Проверка, что имя сети и пароль были успешно прочитаны
if [ -z "$ssid" ]; then
echo "Ошибка чтения имени сети и пароля из файла." > /dev/console
exit 1
fi
if [ -z "$password" ]; then
echo "Ошибка чтения пароля" > /dev/console
exit 2
fi
echo "${ssid}" > /dev/console
echo "${password}" > /dev/console
# Модификация соединения Wi-Fi
nmcli connection modify "Home" wifi.ssid "$ssid" > /dev/console
nmcli connection modify "Home" wifi-sec.psk "$password" > /dev/console
# Подключение к Wi-Fi
nmcli connection up Home > /dev/console
nmcli con show
exit 0


Загрузка в режиме точки доступа:
Для запуска NanoPi AIR, при запуске системы в режиме точки доступа нужно GPIO 201 подключить на землю. Имя точки AP_AC83 Пароль: acommander. Реализовано это в образе для EMMC
Как это сделано:
При запуске системы rc.local запускает скрипт /programs/autorun.sh он в свою очередь upap.sh.
В нем
#!/bin/sh
RED='\033[0;31m'
sleep 10
# Выполнение команды gpioget и получение результата
result=$(gpioget --bias=pull-up gpiochip0 201)

# Проверка результата 
if [ "$result" -eq 0 ]; then
echo "${RED}GPIO 201 = 0"
echo "Запускаем точку доступа AP_AC83"
nmcli con up "AP_AC83"
elif [ "$result" -eq 1 ]; then
  echo "GPIO 201 = 1"
else
  echo "Failed to read GPIO state"
fi


AP_AC83 это имя профиля в Network Manager. Запускаем nmtui, редактируем профиль при необходимости. Например, можно там поменять пароль или имя SSID точки доступа.
В образах настроено авто монтирование USB накопителей в папку /media. Обновлены ядра ОС. Исходный код есть в папке /usr/src — на случай, если придется задействовать ещё какой-то функционал в ОС Linux.

Файлы

🎁Altium проект. Схема, герберы. board_for_nanopi.7z  4.13 Mb ⇣ 7
🎁Интерактивный список деталей. int_part_list.7z  143.49 Kb ⇣ 3

Облако всего софта проекта плеера AC83

Спасибо за внимание!
Продолжение следует.
 

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

Нравится

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

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

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

 

 

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

 

Схема на Датагоре. Новая статья Апаратный Hi-Fi аудиоплеер MkII. USB-Панель управления аудиоплеером. Пример использования с Nano PI NEO2... Всем датагорцам привет!!! А вот и я, и снова изобретаю аудиоплеер. Смотри также цикл моих статей...
Схема на Датагоре. Новая статья Электронные часы-термометр с беспроводным датчиком через радиомодуль nRF24L01... Здравствуйте, уважаемые Датагорцы! Представляю вашему вниманию электронные часы с функцией...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 2. Шаблонные файлы и инструкции МК... В предыдущей части статьи мы провели подготовительную работу и вкратце разобрали принципы работы...
Схема на Датагоре. Новая статья Аппаратный Hi-Fi аудиоплеер MkII. Часть 2. Модуль ЦАП 32bit@384kHz для миникомпьютера Nano Pi NEO 2 / AIR (AK4490+PGA2310)... Всем привет. Продолжается история изобретения аудиоплеера, и закончится она не скоро. Я так...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 7. Компиляция, отладка, загрузка... Привет датагорцам и гостям нашего кибер-города! В предыдущих частях материала по Ассемблеру...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 5. Периферия МК.... Сегодня мы рассмотрим работу следующих модулей периферии: • порта ввода-вывода, • таймера •...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 6. Протоколы обмена данными I2C и SPI... В проекте из предыдущей части нашей ассемблерной эпопеи мы подключали к микроконтроллеру светодиод...
Схема на Датагоре. Новая статья Аудио ЦАП DAC. Поделки начинающего цапостроителя. Часть 17. Универсальный ЦАП на три источника на базе пары PCM1794... Универсальный ЦАП на три источника на базе пары PCM1794. Когда берешься за изготовление очередного...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 1. Начало пути... Приветствую всех сограждан и читателей журнала Датагор! Пользуясь кучей времени, предоставленной...
Схема на Датагоре. Новая статья Аудио ЦАП DAC. Поделки начинающего цапостроителя. Часть 21, заключительная. АК4137+АК4490 на новой платформе. Итоги долгого пути... Привет, датагорцы! Вы уже собрали, сожгли, повторили один-в-один за автором или даташитом...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 4. Система адресации памяти, назначение выводов, тактирование и прерывания МК... Привет датагорцам! Сегодня мы остановимся на следующих вопросах касательно рассматриваемых нами...
Схема на Датагоре. Новая статья Hi-Fi аудиоплеер на базе миникомпьютера «Raspberry Pi». Часть 5, заключительная... Всем привет. Эта не последняя статья о моем аудиоплеере. Время разработки составило четыре года, и...
 

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

 

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

nabiullin

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

Sergiy_83

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

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

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