Интернет радиоприемник

 

Для сборки использовал:

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$. Подробности подключения и настройки здесь.

rpi5

Настройка пульта дистанционного управления

IR

Добавить в /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

ir2

Добавляю в авто загрузку ~/.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

Отображение информации о названии радиостанции и исполнителе

2KC1N0~O

Информация отображается в окне эмулятора терминала 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

Прослушивания музыкальных файлов

2QT6FD~J

Для музыки использую консольный аудио проигрыватель MOC
Чтобы соблюдать пропорции отображения moc плеера, в эмуляторе терминала задаются опции размера
lxterminal —geometry=60×21 —command=mocp

Управление аудио плеером с помощью пульта ДУ
Команды для пульта есть в файлах .lircrc и lircd.conf

Загрузка новых музыкальных файлов возможна через USB разъем который выведен на
корпус

Две программы прослушивания интернет радиостанций для сенсорного экрана 3.5 дюйма
(320х480)

Для использования этих программ нужно настроить сенсорный экран, подробности здесь

25NZ1G~D

Radioplayer

2II9LC~J

Tron-radio


Screenshot at 2016-04-29 07:25:38

Схема устройства

Screenshot at 2016-04-28 18:01:49.png

Схема подключения LCD 3.5inch 320×480

musical-1

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-rpi

Добавил несколько новых команд управления 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, а кнопочное управлением сделает его удобным.

audacious