Проект представляет собой специализированный музыкальный плеер, созданный для людей с нарушениями зрения. Основная идея заключается в использовании RFID-меток для выбора музыкальных плейлистов - пользователю достаточно приложить метку к считывателю, чтобы начать прослушивание соответствующей музыкальной коллекции.
- Управление воспроизведением музыки с помощью RFID-меток
- Физические кнопки для управления громкостью, переключения треков и паузы/воспроизведения
- Автоматическое обнаружение сервера по локальной сети
- Поддержка различных аудиоформатов (MP3, WAV, FLAC и др.)
- Создание и управление плейлистами
Проект будет полезен людям с нарушениями зрения, пожилым людям или всем, кому необходим простой физический интерфейс для управления музыкальной библиотекой без использования экранов или сложных меню.
Система состоит из двух основных компонентов:
-
Сервер на Raspberry Pi:
- Хранение и управление музыкальной библиотекой
- Запуск MPD (Music Player Daemon) для воспроизведения музыки
- API на Flask для взаимодействия с клиентской частью
- Хранение привязок RFID-меток к плейлистам
-
Клиент на ESP32:
- Считывание RFID-меток с помощью модуля PN532
- Кнопки для управления воспроизведением
- Вывод звука через I2S DAC (например, MAX98357A)
- Взаимодействие с сервером через WiFi
[RFID метка] → [ESP32 + PN532] → [WiFi] → [Raspberry Pi + API] → [MPD] → [Музыка]
↑ ↓
[Кнопки управления] [Аудио поток]
↓
[ESP32 + I2S DAC]
↓
[Динамик]
- Raspberry Pi (рекомендуется Raspberry Pi 3 или новее)
- microSD карта (минимум 8 GB)
- USB-накопитель для хранения музыки
- Питание для Raspberry Pi
-
Скачайте и установите актуальную версию Raspbian OS:
# Обновление системы sudo apt update sudo apt upgrade -y -
Настройка сетевого имени:
sudo hostnamectl set-hostname musicbox
-
Установка необходимых пакетов:
sudo apt install -y python3-pip mpd mpc python3-flask avahi-daemon pip3 install flask transliterate
Сначала определите, как система видит ваш USB-диск:
sudo fdisk -lили
lsblkСоздайте точку монтирования:
sudo mkdir -p /mnt/usbСоздайте файл systemd для монтирования:
sudo nano /etc/systemd/system/mnt-usb.mountСодержимое файла:
[Unit]
Description=Mount USB Drive
DefaultDependencies=no
Before=local-fs.target
[Mount]
What=/dev/sda1 # Замените на ваше устройство
Where=/mnt/usb
Type=auto
Options=defaults,nofail
[Install]
WantedBy=multi-user.target
Включите автозапуск монтирования:
sudo systemctl enable mnt-usb.mountСоздайте структуру директорий:
sudo mkdir -p /mnt/usb/multimedia/music
sudo mkdir -p /mnt/usb/multimedia/playlists
sudo chown -R pi:pi /mnt/usb/multimediaОтредактируйте конфигурационный файл:
sudo nano /etc/mpd.confНастройте следующие параметры:
music_directory "/mnt/usb/multimedia"
playlist_directory "/mnt/usb/multimedia/playlists"
db_file "/mnt/usb/spec/tag_cache"
log_file "/mnt/usb/spec/mpd.log"
pid_file "/run/mpd/pid"
state_file "/mnt/usb/spec/state"
sticker_file "/mnt/usb/spec/sticker.sql"
user "mpd"
bind_to_address "0.0.0.0"
port "6600"
audio_output {
type "httpd"
name "Stream"
encoder "lame"
port "8000"
bitrate "128"
format "44100:16:2"
Остановите службу MPD для редактирования конфигурации:
sudo systemctl stop mpdСоздайте переопределение для службы MPD, чтобы она запускалась после монтирования USB-диска:
sudo mkdir -p /etc/systemd/system/mpd.service.d/
sudo nano /etc/systemd/system/mpd.service.d/override.confСодержимое файла:
[Unit]
After=mnt-usb.mount
Requires=mnt-usb.mount
Включите автозапуск MPD:
sudo systemctl enable mpd.serviceСоздайте сервис для запуска команд MPC после запуска MPD:
sudo nano /etc/systemd/system/mpc-startup.serviceСодержимое файла:
[Unit]
Description=MPC Startup Commands
After=mpd.service
Requires=mpd.service
[Service]
Type=oneshot
ExecStart=/usr/bin/mpc clear
ExecStart=/usr/bin/mpc update
ExecStart=/usr/bin/mpc random on
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Включите автозапуск:
sudo systemctl enable mpc-startup.serviceУстановка Syncthing:
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list
sudo apt update
sudo apt install syncthingСоздайте переопределение для Syncthing, чтобы он запускался после MPD:
sudo mkdir -p /etc/systemd/system/syncthing@pi.service.d/
sudo nano /etc/systemd/system/syncthing@pi.service.d/override.confСодержимое файла (замените pi на имя вашего пользователя, если оно отличается):
[Unit]
After=mpd.service
Requires=mpd.service
Включите автозапуск Syncthing:
sudo systemctl enable syncthing@pi.serviceСкопируйте файлы сервера в директорию /mnt/usb/utils:
mkdir -p /mnt/usb/utils
# Скопируйте файлы app.py, list.py, playlist.py и т.д.Создайте сервис для запуска Python-приложения:
sudo nano /etc/systemd/system/my-python-app.serviceСодержимое файла:
[Unit]
Description=My Python Application
After=syncthing@pi.service mpc-startup.service
Requires=mnt-usb.mount
Wants=syncthing@pi.service mpc-startup.service
[Service]
Type=simple
User=pi # Замените на имя вашего пользователя
Group=pi # И соответствующую группу
WorkingDirectory=/mnt/usb/utils
Environment=PYTHONPATH=/mnt/usb/utils
ExecStart=/usr/bin/python3 /mnt/usb/utils/app.py
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
Включите автозапуск:
sudo systemctl enable my-python-app.serviceЭто позволит удаленно управлять Raspberry Pi через туннель к вашему серверу.
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@your-server-ipsudo nano /etc/systemd/system/reverse-ssh.serviceСодержимое файла:
[Unit]
Description=Reverse SSH Tunnel
After=network.target
Wants=network-online.target
[Service]
Type=simple
User=pi
ExecStart=/usr/bin/ssh -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -N -R 0.0.0.0:10022:localhost:22 username@your-server-ip
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Включите автозапуск туннеля:
sudo systemctl enable reverse-ssh.serviceНа удаленном сервере откройте файл конфигурации SSH:
sudo nano /etc/ssh/sshd_configДобавьте или измените следующие строки:
GatewayPorts yes
AllowTcpForwarding yes
Перезапустите SSH-сервер:
sudo systemctl restart sshdНа удаленном сервере выполните:
ssh -p 10022 pi@localhost- ESP32 (рекомендуется DevKit или WROOM)
- Модуль RFID PN532
- I2S DAC (например, MAX98357A)
- Кнопки управления (5 штук)
- Динамик
- Макетная плата, провода, корпус
-
Скачайте и установите Arduino IDE
-
Добавьте поддержку ESP32:
- Откройте Arduino IDE
- Перейдите в Файл -> Настройки
- В поле "Дополнительные ссылки для Менеджера плат" добавьте:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json - Перейдите в Инструменты -> Плата -> Менеджер плат
- Найдите и установите "ESP32"
-
Установите необходимые библиотеки:
- Инструменты -> Управление библиотеками
- Установите:
- ESP8266Audio
- Adafruit PN532
- WiFi
- HTTPClient
-
Подготовка кода:
- Скопируйте файлы из директории
clientв ваш проект Arduino - Настройте параметры WiFi в файле
main_1.ino - При необходимости адаптируйте пины под вашу схему подключения
- Скопируйте файлы из директории
-
Компиляция и загрузка:
- Выберите нужную плату ESP32 в меню Инструменты -> Плата
- Нажмите кнопку "Загрузка"
-
PN532 (RFID):
- SDA: GPIO21
- SCL: GPIO22
-
MAX98357A (I2S DAC):
- BCK: GPIO26
- LRC: GPIO25
- DIN: GPIO27
-
Кнопки:
- Громкость + : GPIO32
- Громкость - : GPIO33
- Следующий трек: GPIO12
- Предыдущий трек: GPIO13
- Воспроизведение/Пауза: GPIO15
В директории utils находятся вспомогательные скрипты для работы с музыкальной библиотекой:
-
playlist.py: Создает плейлисты на основе структуры папок с музыкой
python3 playlist.py
-
rename.py: Транслитерирует кириллические названия файлов и папок, удаляет специальные символы
python3 rename.py
Если вы видите сообщение "sudo: unable to resolve host musicbox: Name or service not known", исправьте это, отредактировав файл /etc/hosts:
sudo nano /etc/hostsДобавьте или измените строку:
127.0.1.1 musicbox
Файл должен выглядеть примерно так:
127.0.0.1 localhost
127.0.1.1 musicbox
# Остальные строки...
- Скопируйте музыку на USB-накопитель в директорию
/multimedia/music/ - Организуйте музыку по папкам - каждая папка будет отдельным плейлистом
- При необходимости используйте утилиту rename.py для транслитерации имен
- Запустите утилиту playlist.py для создания плейлистов
- Обновите базу данных MPD:
mpc update
- При первом поднесении RFID-метки к считывателю, она будет зарегистрирована в системе как "unsigned"
- Зайдите в файл
/mnt/usb/multimedia/playlists/list.jsonи замените "unsigned" на имя плейлиста (без расширения .m3u) - Повторное поднесение метки начнет воспроизведение привязанного плейлиста
- Используйте физические кнопки на устройстве для управления воспроизведением
- Для смены плейлиста приложите соответствующую RFID-метку к считывателю
