Wi‑Fi интернет-радио на Raspberry Pi и Arduino: стриминг станций со всего мира
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Arduino UNO | 1 | |
| Raspberry Pi 3 Model B | 1 | Встроенный WiFi, антенна не нужна |
| SainSmart LCD Keypad Shield для Arduino | 1 | С кнопками и дисплеем |
| Блок питания 5 В | 1 |
Приложения и онлайн-сервисы
- Python (на Raspberry Pi)
О проекте
Обзор
Люблю слушать радио во время дел, но FM-приём у меня ужасен. Интернет-радио — удовольствие, но не хочу использовать смартфон. Нашёл несколько решений, основан на проекте Arduino / Raspberry Pi Internet Radio от akellyirl.
Код на Python на Raspberry Pi использует Linux-демон MPD (Music Player Daemon) и клиент MPC. Библиотека nanpy позволяет Python общаться с Arduino, который управляет кнопками и LCD.
Использовал LCD/Keypad Shield SainSmart, позже добавил 4 кнопки с сломанного будильника. Сначала был Pi 2 с USB-WiFi, теперь Pi 3 со встроенным WiFi. Самое сложное — найти правильные URL станций. Помогла программа URL Helper, которая перехватывает потоки с сайтов. Звук — активные компьютерные колонки, тоже со свалки.
Инструкция по установке (для RP3)
Основана на туториале akellyirl.
- Обновить Raspbian:
$ sudo apt-get update - Установить MPD/MPC:
$ sudo apt-get install mpc mpd - Установить nanpy (Python + прошивка для Arduino):
- Пакеты Arduino для сборки прошивки:
$ apt-get install arduino - Скачать nanpy для Python и распаковать в /home/pi:
$ wget https://pypi.python.org/packages/source/n/nanpy/nanpy-v0.7.tar.gz $ tar xvf nanpy-v0.7.tar.gz - Setuptools (зависимость):
$ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e $ tar xvf setuptools-0.6c11.tar.gz - pyserial (зависимость):
$ wget https://pypi.python.org/packages/source/p/pyserial/pyserial-2.6.tar.gz $ tar xvf pyserial-2.6.tar.gz - Установить setuptools:
$ cd setuptools-0.6c11 $ sudo python setup.py install - Установить nanpy:
$ cd ../nanpy $ sudo python setup.py install - Установить pyserial:
$ cd ../pyserial-2.6 $ sudo python setup.py install
- Пакеты Arduino для сборки прошивки:
- Прошить Arduino прошивкой nanpy:
Подключить Arduino к USB Raspberry Pi.
$ cd ../nanpy/firmware $ export BOARD=uno $ make $ make uploadЕсли устройство не найдено на /dev/ttyACM0 — попробовать другой USB-порт.
Написал скрипт плейлиста и основной Python-скрипт (вкладка Code), настроил автозапуск при загрузке Pi. Добавил кнопку для меню (показ IP, выбор аудиовыхода).
Последнее обновление: переделал — добавил ротари энкодеры для переключения станций и громкости, напечатал корпус на 3D-принтере.
Код
- piradio (Python) — основной скрипт, автозапуск через cron.
- radio_playlist.sh (Shell) — плейлист станций (израильские и международные).
piradio (Python)
from datetime import datetime
from subprocess import *
from time import sleep, strftime
from Queue import Queue
from threading import Thread
import os
from nanpy import Arduino, Lcd
import socket
Arduino.pinMode(14, Arduino.INPUT)
lcd = Lcd([8,9,4,5,6,7],[16,2]) # Пины LCD для SainSmart Shield
lcd.printString("Ruben's RadioZ",0,0)
lcd.printString("Loading" + "."*3,0,1)
sleep(5)
max_trax = 10
x = 1
loop_menu = 1
loop_radio = 1
stations = []
stations.append("Ecco 99 ")
stations.append("Galgalaz ")
stations.append("Galaz ")
stations.append("88 FM ")
stations.append("Gimel ")
stations.append("Radios 100fm ")
stations.append("Kol Hamusica ")
stations.append("WQXR New York ")
stations.append("WPR Winsconsin ")
stations.append("BBC world servic")
stations.append("LINN jazz")
stations.append("LINN classical")
def get_local_ip_address(target):
ipaddr = ''
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((target, 8000))
ipaddr = s.getsockname()[0]
s.close()
except:
pass
return ipaddr
print "Raspberry Pi - Local IP Address"
print(get_local_ip_address('10.0.1.1'))
print(get_local_ip_address('google.com'))
def display_ipaddr():
# ... (показ IP на LCD)
pass
def displaymenu():
# ... (меню на 5-й кнопке)
pass
def load_playlist():
run_cmd("mpc clear")
run_cmd("/home/pi/radio/radio_playlist.sh")
def run_cmd(cmd):
p = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT)
return p.communicate()[0]
def getKey():
val = Arduino.analogRead(14)
if val == 1023: return "NONE"
elif val < 100: return "RIGHT"
elif val < 150: return "UP"
elif val < 330: return "DOWN"
elif val < 510: return "LEFT"
elif val < 750: return "SEL"
else: return "KBD_FAULT"
load_playlist()
def getTrack():
# ... (получение инфо о треке из mpc, вывод на LCD)
pass
# Основной цикл
os.system("sudo service mpd restart")
os.system("mpc play 1")
while loop_radio == 1:
getTrack()
loop_menu = 1
x = 1
key = getKey()
# Обработка клавиш: UP/DOWN — смена станции, LEFT/RIGHT — громкость, SEL — меню
# В меню: 1) IP, 2) Audio->HDMI, 3) Audio->Analog, 4) Audio->Auto, 5) Reload playlist, 6) Shutdown, 7) Exit
# ... (полный код в оригинале)
radio_playlist.sh (Shell)
#! /bin/sh
mpc clear 1>/dev/null
# 1 ecco99
mpc add https://99.livecdn.biz/99fm_aac
# 2 galgalaz
mpc add https://glglzwizzlv.bynetcdn.com/glglz_mp3
# 3 galaz
mpc add https://glzwizzlv.bynetcdn.com/glz_mp3
# 4 88 fm
mpc add https://ibala.vidnt.com:8000/iba_radio-88fmM
# 5 gimel
mpc add https://ibala.vidnt.com:8000/iba_radio-gimelM
# 6 radios 100 fm
mpc add https://100fm.streamgates.net/Radios100Fm
# 7 kol hamusica
mpc add https://ibala.vidnt.com:8000/iba_radio-kolmusicaM
# 8 wqxr
mpc add https://stream.wqxr.org/wqxr
# 9 npr current
mpc add https://current.stream.publicradio.org/kcmp.mp3
# 10 bbc
mpc add https://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-eieuk
# 11 linn jazz
mpc add https://radio.linnrecords.com:8003/autodj
# 12 linn classical
mpc add https://radio.linnrecords.com:8004/autodj
Схемы
Производственный процесс
- Создание профессионального универсального пульта на Raspberry Pi с LIRC
- Преобразование RF в DC с Raspberry Pi: сборка и отладка детектора огибающей
- Cycle Chaser: превратите свой велосипед в ночной световый шоу с Raspberry Pi
- Создание детектора вора на базе Raspberry Pi — пошаговое руководство
- Создайте домашний монитор температуры на Raspberry Pi с MCP9808, InfluxDB и Grafana
- Создайте систему домашней автоматизации на Raspberry Pi для удаленного управления
- MrRobot: Ubuntu Mobile-приложение для управления роботом Rapiro голосом, касанием и встряхиванием
- DIY робот в стиле Wall‑E на Raspberry Pi из коробки от CD
- Создание Bluetooth-робота на Raspberry Pi с аудио-обратной связью
- Создание интернет-управляемого видеostreaming-робота на Arduino и Raspberry Pi