Для сборки использовал:
Raspberry Pi model B — Одноплатный мини компьютер
3.5inch LCD 320×480 — Сенсорный дисплей 3.5 дюйма
RT3070 USB WIFI Module 150M Wireless Network Card Module — USB модуль WIFI
2.4G Wireless SMA Antenna 2dB 2.5dB — Антенна для модуля WIFI
5V 2.1 Channel Stereo Class D Digital Power Amplifier Audio 2.1 Amplifier Board Audio Amplifier Board MP006. Loudspeakers 4ohms 2×5 watt rms — Усилитель звука с динамиками
InterStep Charger dual USB 2A, 5V — Зарядное устройство
Dexp Lantern8 5V, 1A/2A, 7800MAH, 3x TS-LS 18650 3200MAH — Аккумулятор
HX1838 Infrared Remote Control Module — ИК модуль ДУ с пультом
DIY DS3231 Real Time Clock Module — Часы реального времени
Выбрать дистрибутив Raspbian на странице загрузок
Установка на карту памяти
# dd if=2021-03-04-raspios-buster-armhf.img of=/dev/sdX bs=4M conv=fsync
2021-03-04-raspios-buster-armhf.img — дистрибутив Raspbian
/dev/sdX — указать имя устройства вашей SD-карты
Настройка системы
# sudo raspi-config
Обновление
# sudo apt-get update
Установка программ
# sudo apt-get install mpd mpc moc lirc xterm python-requests buici-clock
Убрать декорацию окон у приложения в openbox
~/.config/openbox/lxde-pi-rc.xml добавить в раздел
<application name="*"> <decor>no</decor> </application>
Экран дисплея при длительном не использовании переходит в спящий режим, чтобы этого не происходило нужно добавить в файл /etc/X11/xorg.conf.d/99-calibration.conf
Section "ServerFlags" Option "blank time" "0" Option "standby time" "0" Option "suspend time" "0" Option "off time" "0" EndSection
Настройка радиостанций
Пример плейлиста Radio.pls
NumberOfEntries=3 File1=http://stream.srg-ssr.ch/m/rsj/mp3_128 File2=http://stream.srg-ssr.ch/m/rsc_de/mp3_128 File3=http://stream.srg-ssr.ch/m/rsp/mp3_128
Разместить плейлист
# sudo chmod -R g+w /var/lib/mpd
# cp Radio.pls /var/lib/mpd/playlists
Запуск Music Player Daemon
# sudo service mpd start
или
# sudo /etc/init.d/mpd restart
Команды для mpc клиента управления mpd-сервером
# mpc update
# mpc clear
# mpc load Radio.pls
# mpc play
# mpc stop
В последних версия mpd 0.19 — mpc load не работает с плейлистами pls, нужен формат m3u.
#EXTM3U #EXTINF:0,Radio Swiss Jazz http://stream.srg-ssr.ch/m/rsj/mp3_128 #EXTINF:0,Radio Swiss Classic http://stream.srg-ssr.ch/m/rsc_fr/mp3_128 #EXTINF:0,Radio Swiss Pop http://stream.srg-ssr.ch/m/rsp/mp3_128
Плейлист интернет-радио без сжатия в хорошем качестве 16 бит/ 44.1 кГц (lossless)
Радиостанция Frequence3 (Франция) https://www.frequence3.com/
#EXTM3U #EXTINF:0,frequence3 #EXTINF:0,frequence3-gold #EXTINF:0,frequence3-world #EXTINF:0,frequence3-urban #EXTINF:0,frequence3-dance
Для загрузки плейлиста не указывается расширение имени файла .m3u
# mpc load radio
Просмотр загруженных плейлистов
# mpc lsplaylists
Так же изменил настройки звука /etc/mpd.config (в старой версии mpd 0.16 настройки) работали по умолчанию.
type "alsa" name "My ALSA Device" device "hw:0,0" # optional format "44100:16:2"
Убрал искажения звука добавив запрет звуковой подсистеме автоматически выравнивать громкость, изменять частоту дискретизации, изменять количество каналов и выполнять преобразование разрядности аудио потока
replay_gain_handler "none" auto_resample "no" auto_channels "no" auto_format "no"
Аналоговый выход не идеален для качественных музыкальных файлов но можно добавить недорогой ЦАП стоимостью от 6$. Подробности подключения и настройки здесь.
Настройка пульта дистанционного управления
Добавить в /etc/modules
lirc_dev lirc_rpi gpio_in_pin=22
Содержание файла /etc/lirc/hardware.conf
# /etc/lirc/hardware.conf # # Arguments which will be used when launching lircd LIRCD_ARGS="--uinput" #Don't start lircmd even if there seems to be a good config file #START_LIRCMD=false #Don't start irexec, even if a good config file seems to exist. #START_IREXEC=false #Try to load appropriate kernel modules LOAD_MODULES=true # Run "lircd --driver=help" for a list of supported drivers. DRIVER="default" # usually /dev/lirc0 is the correct setting for systems using udev DEVICE="/dev/lirc0" MODULES="lirc_rpi" # Default configuration files for your hardware if any LIRCD_CONF="" LIRCMD_CONF=""
В разделе boot карты памяти добавить строку к файлу config.txt
dtoverlay=lirc-rpi,gpio_in_pin=22
Остановка и запуск lirc
# sudo /etc/init.d/lirc stop
# sudo /etc/init.d/lirc start
Файл /etc/lirc/lircd.conf содержит коды для пульта
Как создать файл с кодом описан в разделе: Настройка пульта ДУ в Openelec
# sudo /etc/init.d/lirc stop
# mode2 -d /dev/lirc0
# irrecord ~/lircd.conf -d /dev/lirc0
# sudo mv -f ~/lircd.conf /etc/lirc
Мой lircd.conf
Для запуска приложений с пульта необходимо запустить демон irexec
Настройки хранятся в файле ~/.lircrc
Мой lircrc
Добавляю в авто загрузку ~/.config/lxsession/LXDE-pi/autostart
irexec, irxevent, gpio_button.py — скрипт управления кнопками, buici-clock — аналоговые часы на рабочем столе
@irexec @sudo gpio_button.py @irxevent @buici-clock -geometry=120x120+110+200
В GPIO Raspberi pi остались не задействованы 3 порта (Pin-7,12,16. Gpio-4,18,23)
Использую их для команд
mpc play — запустить радио
mpc stop — остановить радио
sudo shutdown -h now — выключить систему
Скрипт gpio_button.py сохраняю в /usr/local/bin
#!/usr/bin/python # -*- coding: iso-8859-15 -*- from time import sleep import os import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(23 , GPIO.IN) GPIO.setup(18 , GPIO.IN) GPIO.setup(4 , GPIO.IN) while True: if GPIO.input(23)==1: os.system("mpc stop & killall xterm &") os.system("mpc play 1 & mpc-current") if GPIO.input(18)==1: os.system("mpc stop") os.system("sudo shutdown -h now") if GPIO.input(4)==1: os.system("killall xterm &") os.system("mpc stop") sleep(0.1);
Настройка модуля RTC — часы реального времени
# sudo modprobe rtc-ds1307
# sudo bash
# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
# sudo hwclock -r
# sudo nano /etc/modules
rtc-ds1307
# sudo nano /etc/rc.local
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
# sudo hwclock -s
# date
Отображение информации о названии радиостанции и исполнителе
Информация отображается в окне эмулятора терминала xterm с помощью скрипта mpc-current.py. Размер, шрифт, цвет указываю в опциях терминала. Файл запуска расположен в /usr/local/bin/mpc-current
#!/bin/sh xterm -geometry 33x7+0+6 -fn lucidasans-bolditalic-24 -fg blue -cr gray -bg gray -e mpc-current.py &
Обращаю внимание что в команде используется шрифт lucidasans-bolditalic, который должен быть установлен. xlsfonts выводит список всех доступных шрифтов
Скрипт /usr/local/bin/mpc-current.py скачать
#!/usr/bin/env python import subprocess, time, requests, sys last_lines = "" while True: try: lines = subprocess.check_output('mpc current', shell=True) if len(lines) == 1: station_label = ("Station: no data", 1) if lines != last_lines: print lines .replace('_Room', ' ').replace('/', 'Radio ') last_lines = lines except subprocess.CalledProcessError: pass except IndexError: pass time.sleep(0.1)
Для версии python 3 скрипт mpc-current.py будет выглядеть так:
#!/usr/bin/python3 import subprocess, time, requests, sys last_lines = "" while True: try: lines = (subprocess.check_output('mpc current', shell=True)) if len(lines) == 1: station_label = (('Station: no data', 1)) if lines != last_lines: print (lines.decode('utf8').replace('_Room', ' ').replace('/', 'Radio ')) last_lines = lines except subprocess.CalledProcessError: pass except IndexError: pass time.sleep(0.1)
Название станций радиостанции из Швейцарии «Radio Swiss Jazz» (http://stream.srg-ssr.ch/m/rsc_de/mp3_128) выглядит как: /SwissJazz_Room1. В строке .replace(‘_Room’, ‘ ‘).replace(‘/’, ‘Radio ‘) меняю название на Radio SwissJazz 1
Прослушивания музыкальных файлов
Для музыки использую консольный аудио проигрыватель MOC
Чтобы соблюдать пропорции отображения moc плеера, в эмуляторе терминала задаются опции размера
lxterminal —geometry=60×21 —command=mocp
Управление аудио плеером с помощью пульта ДУ
Команды для пульта есть в файлах .lircrc и lircd.conf
Загрузка новых музыкальных файлов возможна через USB разъем который выведен на
корпус
Две программы прослушивания интернет радиостанций для сенсорного экрана 3.5 дюйма
(320х480)
Для использования этих программ нужно настроить сенсорный экран, подробности здесь
Схема устройства
Схема подключения LCD 3.5inch 320×480
Wallpapers 480×320
Изготовленный своими руками интернет радио имеет преимущества перед заводскими устройствами и это не разница стоимости, созданная модель может получится дороже (высокая стоимость на отдельные компоненты). Все дело в творческом подходе, возможности усовершенствования, то что планировалось как игрушка перерастает в увлечение. Улучшая звук я пробую разные варианты УНЧ , меняю расположение динамиков, добавляю ЦАП.
В программном обеспечение изменения коснулись внешнего вида плеера MOC. Не создавая файл config, добавив в /usr/local/bin/mocp_t
#!/bin/sh cd /usr/bin ./mocp -T darkdot_theme
в файле .lircrc изменив строчку
config = /usr/bin/lxterminal —geometry=60×21 —command=mocp_t
плеер запускается с темой darkdot_theme которя расположена в /usr/share/moc/themes.
Добавил несколько новых команд управления MOC с пульта.
l — Переключение между раскладками
«name KEY_L» в /etc/lirc/lircd.conf
S — Воспроизведение в случайном порядке
Опционально «name KEY_RED» в /etc/lirc/lircd.conf
В файле ~/.lircrc
begin prog = irxevent button = KEY_RED config = Key shift-s CurrentWindow repeat = 1 end
Экран дисплея как было указано выше в устройстве работает постоянно, но можно отключить с пульта добавив
Опционально «name KEY_BLUE» в /etc/lirc/lircd.conf
В файле ~/.lircrc
begin prog = irexec button = KEY_BLUE config = export DISPLAY=:0 && xset dpms force off end
В данном устройстве мало свободных портов gpio, так как они задействованы для работы LCD экрана и использование дополнительных кнопок управление нет возможности. Есть альтернатива использовать экран LCD с интерфейсом hdmi. С помощью утилиты xdotool в скрипте gpio_button.py можно эмулировать действия клавиатуры и мыши
os.system(«xdotool key KP_Enter»), os.system(«xdotool key Down») и т.д. Это дает дополнительный возможности использования кнопок управления. LCD экран hdmi размером 5-7 дюймов дает возможность использовать приложения с графическим пользовательским интерфейсом, например Audacious, а кнопочное управлением сделает его удобным.