Звук и акустика

Интернет-радио для детей

Этот проигрыватель мастер сделал для своих детей. Им нравится слушать музыку, но, они слишком маленькие, чтобы запускать Spotify* и транслировать их на телевизор. Мастер решил сделать для них простой и, увлекательный интерфейс.
*Spotify — интернет-сервис потокового аудио, позволяющий легально и бесплатно прослушивать музыкальные композиции, аудиокниги и подкасты, не скачивая их на устройство.
Плеер построен на базе Raspberry, имеет аудиомодуль и RFID. Метки приклеиваются деревянным фигуркам. Каждая кукла отвечает за свой трек и дети отлично их запоминают.
Давайте посмотрим демонстрационное видео.

Инструменты и материалы:
-Raspberry Pi;
-Аудио модуль для Рассбери;
-RFID-модуль;
-Динамик;
-Блок питания;
-Кнопки тактильные;
-Светодиод;
-Резистор 220 Ом;
-Макетная плата;
-SD-карта (от 4 Гб);
-Провода;
-МДФ 25 мм;
-Фанера толщиной 4 мм;
-Ткань для динамика;
-Клеевой пистолет;
-Шурупы;
-Шпаклевка;
-Лак для дерева;
Шаг первый: электроника
После покупки всех деталей мастер проверяет работу устройства на макетной плате.
Модуль HiFi можно просто установить на разъем GPIO, он поставляется с металлическими стойками. Через модуль также идет питание Pi, что устраняет необходимость в более чем одном источнике питания и значительно упрощает подключение.
Для модуля NFC нужен кабель для подключения:
GPIO 17 — 3,3 В
GPIO 19 — MOSI
GPIO 20 — GND
GPIO 21 — MISO
GPIO 22 — RST
GPIO 23 — SCK
GPIO 24 — SDA
Все кнопки используют внутренние подтягивающие резисторы raspberry pi, поэтому они должны быть подключены так, чтобы при нажатии подавались 5 В на соответствующий контакт. Для этого он сделал специальную печатную плату, которая равномерно размещает кнопки, распределяет 5 В от Pi на все кнопки.
GPIO 2 или 4 на первую кнопку и отвод (перемычками) на остальные кнопки (5V)
Кнопка воспроизведения / паузы — GPIO 38
Кнопка остановки — GPIO 31
Следующая кнопка — GPIO 33
Кнопка увеличения громкости — GPIO 11
Кнопка Vol — GPIO 13
В качестве индикатора, который показывает, что радио готово к воспроизведению, был добавлен светодиод на отдельной плате. Он подключен к GPIO 36 и имеет резистор 220 Ом, соединяющий его с землей на отрицательном выводе.

Шаг второй: программное обеспечение
1. Установите Raspberry Pi OS Lite на SD-карту с помощью Win32DiskImager.
2. Включите ssh (описание здесь), поместив новый пустой текстовый документ с именем ssh, но без расширения, в корень SD-карты.
3. Также можно настроить автоматическое подключение к Wi-Fi, поместив текстовый файл конфигурации в корень SD-карты. Файл должен называться wpa_supplicant.conf, и вы должны добавить этот текст с учетом кода страны и сети:

 Показать / Скрыть текстctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=BE

network={
ssid="YOUR_SSID"
psk="YOUR_PASSWORD"
}
4. Войдите в систему через SSH с помощью Putty. Пользователь по умолчанию — ‘pi с паролем ‘raspberry’.
5. Измените пароль для главного пользователя. Сделайте это, набрав команду «passwd» при входе в систему.
6. Разверните файловую систему Pi, набрав «sudo raspi-config» и выбрав вариант 1 — развернуть файловую систему. Перегрузите, набрав команду sudo reboot .
7. Обновите все пакеты, набрав:
sudo apt update && sudo apt upgrade
Дальше нужно установить Mopidy, медиаплеер Linux, который служит ПО для радио
8. Полное руководство по установке Mopidy можно найти здесь. ОС Raspberry Pi основана на Debian, поэтому вам нужно будет выполнить шаги для Debian (каждая строка представляет собой отдельную команду):

 Показать / Скрыть текстwget -q -O — https://apt.mopidy.com/mopidy.gpg | sudo apt-key add —
sudo wget -q -O /etc/apt/sources.list.d/mopidy.list https://apt.mopidy.com/buster.list
sudo apt update
sudo apt install mopidy
9. Установите расширение Mopidy Spotify:

 Показать / Скрыть текстsudo apt install mopidy-spotify
10. Теперь нужно настроить Mopidy и расширение Spotify. Мы настроим Mopidy для запуска как службу при запуске. Для этого нужно создать файл конфигурации в /etc/mopidy/mopidy.conf. Вводим:

 Показать / Скрыть текстsudo nano /etc/mopidy/mopidy.conf
Добавляем или изменяем следующие разделы для HTTP и Spotify:

 Показать / Скрыть текст[http]
enabled = true
hostname = 127.0.0.1
port = 6680
zeroconf = Mopidy HTTP server on $hostname
allowed_origins =
csrf_protection = true
default_app = mopidy

[spotify]
enabled = true
username = YOUR_USERNAME
password = YOUR_PASSWORD
client_id = YOUR_CLIENT_ID
client_secret = YOUR_CLIENT_SECRET
bitrate = 160
timeout = 10
cache_dir = $XDG_CACHE_DIR/mopidy/spotify
11. Установите загрузку Mopidy при загрузке Pi, набрав команду:

 Показать / Скрыть текстsudo systemctl enable mopidy
12. Следующий шаг зависит от выбранного оборудования. Модуль, должен быть настроен как HiFiBerry. Для этого откройте /boot/config.txt:

 Показать / Скрыть текстsudo nano /boot/config.txt
Удалите строку:

 Показать / Скрыть текстdtparam = audio = on
Добавьте строку:

 Показать / Скрыть текстdtoverlay = hifiberry-amp
13. Перезагрузите Pi командой sudo reboot.
14. Если все сделано правильно, теперь должна быть возможность начать воспроизведение музыки удаленно. Для тестирования и знакомства с HTTP-командами мастер использовал Postman.
Как только вы добавите песни в трек-лист, вы должны получить отзыв от Mopidy, содержащий все добавленные треки. Когда вы отправляете команду воспроизведения, музыка должна воспроизводиться практически сразу.
Если вы не получаете коды ответа ‘200 — OK’ в Postman, это означает ошибку подключения, и следует проверить IP-адрес, порт и файл конфигурации Mopidy.
Если вы получили код ответа ‘200 — OK’, но в нем есть ошибка, возможно, проблема связана с командой post или ее форматом.

Настройка для RFID-ридера и скрипта Python
15. Включите SPI на выводах GPIO, набрав sudo raspi-config и выбрав 5 параметров- P4 SPI.
16. Перезагрузите Pi командой sudo reboot. Если модуль RFID подключен правильно, он должен быть обнаружен Pi. Если вы введете следующую команду, вы должны увидеть устройство bcm2835:
Lsmod | grep spi
17. Установите Python:
sudo apt-get install python3-dev python3-pip
18. Установите библиотеки SPI для Python:
sudo pip3 install spidev
19. Установите библиотеки RC522 для Python:
sudo pip3 установить mfrc522
Сценарий
20. Мастер помещает сценарий в / home / pi / RFID_Radio /:

 Показать / Скрыть текст#!/usr/bin/env/ python

#imports
from time import sleep
import RPi.GPIO as GPIO
import requests
from mfrc522 import SimpleMFRC522

#variables/instances
reader = SimpleMFRC522()
previoustext = ""
text = ""
url = "http://localhost:6680/mopidy/rpc"
volume = 30

btn_play = 38
btn_stop = 31
btn_next = 33
btn_vol_dn = 13
btn_vol_up = 11
led_active = 36

#function definitions
def play_pause(channel):
#get current playback state first
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.playback.get_state"})

if r.text.find('playing') == -1:
#not playing, go to play
requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.playback.play"})

else:
#playing, go to pause
requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.playback.pause"})

def next(channel):
#play next track
requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.playback.next"})

def stop(channel):
global previoustext

#stop playback, clear tracklist
requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.playback.stop"})
sleep(0.1)

#Clear existing tracklist
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.tracklist.clear"})

previoustext = ""

def vol_up(channel):
global volume

#increase volume but not higher than 100
if volume == 0:
volume = 1
elif volume == 1:
volume = 10
elif volume == 100:
volume = 100
else:
volume += 10

print(volume)
#set volume
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.mixer.set_volume", "params": {"volume": volume}})

def vol_dn(channel):
global volume

#decrease volume but not lower than 0
if volume == 10:
volume = 1
elif volume == 1:
volume = 0
elif volume == 0:
volume = 0
else:
volume -= 10

print(volume)
#set volume
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.mixer.set_volume", "params": {"volume": volume}})

def new_playlist(uri):
#Is URI a playlist or an album?
URITypePlaylist = uri.find('playlist') != -1

#Pause playback first
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.playback.pause"})
sleep(0.1)

#Clear existing tracklist
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.tracklist.clear"})
sleep(0.1)

#Add URI to tracklist
r = requests.post(url, json={"method": "core.tracklist.add", "jsonrpc": "2.0", "params": {"uris": [uri]}, "id": 1})
sleep(0.5)

#If the URI is a playlist, set shuffle ON, else set shuffle OFF
if URITypePlaylist:
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.tracklist.set_random", "params": {"value": True}})
sleep(0.1)

else:
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.tracklist.set_random", "params": {"value": False}})
sleep(0.1)

#Start playing tracklist
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.playback.play"})

#I/O setup
GPIO.setup(led_active, GPIO.OUT)

GPIO.setup(btn_play, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(btn_play, GPIO.RISING, callback=play_pause, bouncetime=500)

GPIO.setup(btn_next, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(btn_next, GPIO.RISING, callback=next, bouncetime=500)

GPIO.setup(btn_stop, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(btn_stop, GPIO.RISING, callback=stop, bouncetime=500)

GPIO.setup(btn_vol_up, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(btn_vol_up, GPIO.RISING, callback=vol_up, bouncetime=100)

GPIO.setup(btn_vol_dn, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(btn_vol_dn, GPIO.RISING, callback=vol_dn, bouncetime=100)

#set consume for tracklist off
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.tracklist.set_consume", "params": {"value": False}})
sleep(0.1)

#set initial volume to 30
r = requests.post(url, json={"jsonrpc": "2.0", "id": 1, "method": "core.mixer.set_volume", "params": {"volume": volume}})
sleep(0.1)

#infinite loop (on purpose!)
try:
while True:
GPIO.output(led_active, 1)

id, text = reader.read()

if text and text != previoustext:
print("Starting new playlist")

#Get the URI
uri = text.rstrip()

new_playlist(uri)

previoustext = text

sleep(1)

else:
sleep(1)

finally:
GPIO.cleanup()
Дальше нужно сделать, чтобы скрипт запускался автоматически при загрузке Pi.
21. Создайте файл:
sudo nano /lib/systemd/system/RFID_Radio.service
Добавьте следующий текст:

 Показать / Скрыть текст[Unit]
Description=RFID tag activated Spotify player
Wants=network-online.target
After=network-online.target network.target mopidy.service

[Service]
Type=idle
ExecStart=/usr/bin/python3 /home/pi/RFID_Radio/RFID_Radio.py > /home/pi/RFID_Radio/RFID_Radio.log 2>&1
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
22. После закрытия и сохранения файла необходимо правильно настроить права доступа:
sudo chmod 644 /lib/systemd/system/RFID_Radio.service
23. Перезагрузите конфигурацию и включите новую службу для автоматического перезапуска:
sudo systemctl daemon-reload
sudo systemctl включить RFID_Radio.service
24. Перезагрузите и проверьте, запустилась ли служба:
sudo reboot
sudo systemctl status RFID_Radio
Если служба запустилась, последняя строка будет меткой времени в журнале raspberrypi systemd[1]: Started RFID tag activated Spotify player.’.

Шаг третий: дизайн
Дальше мастер переходит к корпусу. Его дизайн разработан в программе Fusion 360.

Файлы можно скачать ниже.
Cutout.pdf
Шаг четвертый: детали корпуса
Корпус мастер делает из МДФ. Сначала вырезает основную пластину.

Вырезает торцевые детали.

Делает пропилы в заготовке.

Теперь можно нанести клей и склеить основную часть корпуса.

После высыхании клея шпаклюет, шлифует и затем красит корпус.

Шаг пятый: лицевая панель динамика
Отсканировав динамик, мастер вырезал шаблон. Затем по шаблону вырезал из фанеры две панели. Склеил их.
Установил динамик и обтянул тканью.

Для задней части сделал такую же панель, но отверстие только для провода.
Шаг шестой: сборка
Дальше мастер переходит к сборке устройства. Устанавливает внутри корпуса Рассбери.

Устанавливает RFID-модуль и динамик.

Шаг седьмой: RFID-метки
Последнее, что нужно сделать — это сделать RFID-фигурки и назначить им плейлисты. Куклы на фотографиях были изготовлены вручную.
Для написания тегов нужно создать и запустить еще один скрипт:
sudo nano /home/pi/RFID_Radio/Write_tag.py
Добавляем:

 Показать / Скрыть текст#!/usr/bin/env python

import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522

reader = SimpleMFRC522()

try:
text = input('New data:')
print("Now place your tag to write")
reader.write(text)
print("Written")
finally:
GPIO.cleanup()
Если запустить этот сценарий:
sudo python3 /home/pi/RFID_Radio/Write_tag.py
Пользователю будет предложено ввести данные. Введите URI Spotify, который может быть URI песни, альбома или плейлиста в следующем формате:
spotify:playlist:37i9dQZF1E8EjOu4PXKY8q
После нажатия клавиши ввода нужно прикоснутся меткой к модулю RFID.
Все готово. После всех этих шагов у мастера есть надежно работающее радио, и детям оно нравится. Конечно, они постоянно переключают плейлисты, но, по крайней мере, они могут включить музыку, которую хотят.
В дальнейшем он планирует добавить пульт управление, возможность подключения устройства к смартфону и несколько других улучшений.

Источник

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть
Закрыть