Rádios online atualmente não são mais novidade. Porém, são um meio ainda fantástico de se ouvir música e notícias do mundo todo e, por que não, conhecer e expandir novas culturas também. Para os fãs de rádios online este post vai mostrar como usar um Raspbery Pi para se 'gerenciar' uma web rádio. Leia o post até o fim e mãos a obra!
Quando essas rádios idealizadas e popularizadas, o único dispositivo que tornava possível ouvir uma rádio online era um computador. Mas os tempos mudaram e hoje é possível fazer isso até mesmo de seu smartphone. Neste artigo, será mostrado como construir seu próprio receptor de rádio online com Raspberry Pi rodando a distribuição Linux Raspbian.
Placa Raspberry Pi
Fonte de alimentação 5V/3A
Cabo HDMI (para ligar a Raspberry Pi a um monitor ou TV e programá-la)
Mouse e teclado (com ou sem fio)
Um display OLED (da cor que preferir)
Cinco botões pulsantes / push-button (modelos e cores à sua escolha)
Jumpers macho-fêmea
Uma protoboard (uma do tamanho de 400 pontos é suficiente)
No caso, a Raspberry Pi é o “cérebro” do projeto. Uma vez que o projeto estiver rodando, a rádio-online que estiver tocando no momento irá aparecer do display OLED e será possível controlar totalmente o projeto através dos 5 botões pulsantes / push-buttons. Os botões terão as seguintes funções:
Play/pause
Aumentar volume
Diminuir volume
Ir para a próxima estação
Voltar à estação anterior
Neste projeto de rádio online com Raspberry Pi, podem ser utilizado qualquer modelo de placa (desde que contenham conexão com a Internet), incluindo a Raspberry Pi 3 Model B e a Raspberry Pi A+ à venda em nossa loja FILIPEFLOP.
O projeto deste post será um processo, o qual se comunicará com um player de mídia do Linux para tocar as rádios online, sendo este player um outro processo em execução. O player de mídia em questão é o mplayer, um player muito leve e consagrado do Linux (já testado a exaustão, com sucesso, ao longo dos anos em várias distribuições). Este player pode tocar diferentes tipos de mídia, sendo uma solução leve e elegante para quem deseja tocar mídias no Linux.
Portanto, em termos de funcionamento, o projeto aqui desenvolvido irá se comunicar com o mplayer, enviando comandos ao mesmo através de uma técnica chamada de named pipes. Esta técnica permite que processos distintos no Linux se comuniquem / enviem mensagens uns aos outros, ficando a cargo do Kernel Linux gerenciar a transferências destas mensagens. No caso específico deste projeto, as mensagens trafegadas entre o receptor e o mplayer são os comandos que o mplayer aceita em modo slave, e são escritas e lidas em arquivos FIFO (arquivos especiais para esta finalidade) salvos no diretório /tmp. Não se preocupe com a quantidade de I/Os nesses arquivos, pois no Linux todos os arquivos FIFO são criados/mapeados em RAM!
sudo apt-get install mplayer2
A instalação é rápida e não ocupará muito espaço na memória.
Para a escolha das rádios online, uma das formas é carregar nele arquivos do tipo playlist (.pls) da rádio on-line desejada. Portanto, ao escolher suas rádios a serem ouvidas, procure pela playlist / endereço da playlist em formato .pls. Abaixo há alguns exemplos, todos tirados do site SHOUTCast:
http://yp.shoutcast.com/sbin/tunein-station.pls?id=1057392
http://panel3.serverhostingcenter.com:2199/tunein/radiobackstage1.pls
http://yp.shoutcast.com/sbin/tunein-station.pls?id=142571
Ainda, você pode testar o funcionamento do mplayer ao tocar uma rádio de sua escolha com o seguinte comando:
mplayer -playlist URL_DO_ARQUIVO_PLS_DA_RADIO_ONLINE_DESEJADA
Veja abaixo o código-fonte do projeto:
Copie e cole este código em um editor de texto de sua preferência (sugestão: nano) e salve o arquivo como ReceptorRadioOnlineRasp.py. Para executar o projeto, utilize o seguinte comando:
python ReceptorRadioOnlineRasp.py
Abaixo você confere um vídeo do projeto em ação:
Quando essas rádios idealizadas e popularizadas, o único dispositivo que tornava possível ouvir uma rádio online era um computador. Mas os tempos mudaram e hoje é possível fazer isso até mesmo de seu smartphone. Neste artigo, será mostrado como construir seu próprio receptor de rádio online com Raspberry Pi rodando a distribuição Linux Raspbian.
O QUE É NECESSÁRIO COMPRAR PARA REPRODUZIR O PROJETO?
Para fazer o projeto de rádio online com Raspberry Pi, será necessário:Placa Raspberry Pi
Fonte de alimentação 5V/3A
Cabo HDMI (para ligar a Raspberry Pi a um monitor ou TV e programá-la)
Mouse e teclado (com ou sem fio)
Um display OLED (da cor que preferir)
Cinco botões pulsantes / push-button (modelos e cores à sua escolha)
Jumpers macho-fêmea
Uma protoboard (uma do tamanho de 400 pontos é suficiente)
No caso, a Raspberry Pi é o “cérebro” do projeto. Uma vez que o projeto estiver rodando, a rádio-online que estiver tocando no momento irá aparecer do display OLED e será possível controlar totalmente o projeto através dos 5 botões pulsantes / push-buttons. Os botões terão as seguintes funções:
Play/pause
Aumentar volume
Diminuir volume
Ir para a próxima estação
Voltar à estação anterior
Neste projeto de rádio online com Raspberry Pi, podem ser utilizado qualquer modelo de placa (desde que contenham conexão com a Internet), incluindo a Raspberry Pi 3 Model B e a Raspberry Pi A+ à venda em nossa loja FILIPEFLOP.
COMO FUNCIONA A RÁDIO ONLINE COM RASPBERRY PI?
O princípio de funcionamento deste projeto está na comunicação entre processos no Linux. Cada aplicação executada no Linux pode ser um processo (funcionamento temporário) ou serviço (funcionamento permanente), ficando a cargo do Kernel Linux gerenciar a execução dos mesmos.O projeto deste post será um processo, o qual se comunicará com um player de mídia do Linux para tocar as rádios online, sendo este player um outro processo em execução. O player de mídia em questão é o mplayer, um player muito leve e consagrado do Linux (já testado a exaustão, com sucesso, ao longo dos anos em várias distribuições). Este player pode tocar diferentes tipos de mídia, sendo uma solução leve e elegante para quem deseja tocar mídias no Linux.
Portanto, em termos de funcionamento, o projeto aqui desenvolvido irá se comunicar com o mplayer, enviando comandos ao mesmo através de uma técnica chamada de named pipes. Esta técnica permite que processos distintos no Linux se comuniquem / enviem mensagens uns aos outros, ficando a cargo do Kernel Linux gerenciar a transferências destas mensagens. No caso específico deste projeto, as mensagens trafegadas entre o receptor e o mplayer são os comandos que o mplayer aceita em modo slave, e são escritas e lidas em arquivos FIFO (arquivos especiais para esta finalidade) salvos no diretório /tmp. Não se preocupe com a quantidade de I/Os nesses arquivos, pois no Linux todos os arquivos FIFO são criados/mapeados em RAM!
PREPARAÇÃO: INSTALAÇÃO DO MPLAYER E ESCOLHA DAS RÁDIOS ONLINE
Antes de prosseguir com o projeto, é necessário instalar o mplayer. Para isto, utilize o comando abaixo:sudo apt-get install mplayer2
A instalação é rápida e não ocupará muito espaço na memória.
Para a escolha das rádios online, uma das formas é carregar nele arquivos do tipo playlist (.pls) da rádio on-line desejada. Portanto, ao escolher suas rádios a serem ouvidas, procure pela playlist / endereço da playlist em formato .pls. Abaixo há alguns exemplos, todos tirados do site SHOUTCast:
http://yp.shoutcast.com/sbin/tunein-station.pls?id=1057392
http://panel3.serverhostingcenter.com:2199/tunein/radiobackstage1.pls
http://yp.shoutcast.com/sbin/tunein-station.pls?id=142571
Ainda, você pode testar o funcionamento do mplayer ao tocar uma rádio de sua escolha com o seguinte comando:
mplayer -playlist URL_DO_ARQUIVO_PLS_DA_RADIO_ONLINE_DESEJADA
CIRCUITO ESQUEMÁTICO
O circuito esquemático do projeto pode ser visto abaixo:
CÓDIGO-FONTE PROJETO RÁDIO ONLINE COM RASPBERRY PI
Veja abaixo o código-fonte do projeto:#Projeto: Radio on-line com Raspberry Pi
import
os
import
sys
import
subprocess
import
shlex
import
Adafruit SSD1306
from
PIL
import
Image
from
PIL
import
ImageDraw
from
PIL
import
ImageFont
#Variaveis globais
CaminhoArquivoControle
=
"/tmp/ControleRadio"
ComandoMPlayer
=
"mplayer -input file=/tmp/ControleRadio -slave -playlist "
#variaveis relacionadas ao display OLED
RST
=
24
disp
=
Adafruit_SSD1306.SSD1306_128_64(rst
=
RST)
#Display OLED 128x64 (I2C)
top
=
0
#Variaveis das playlists
Playlists
=
[]
#Array que contem todas as playlists
NumeroPlaylists
=
0
#quantidade de playlists
NomesRadios
=
[]
#Nomes das radios / playlists
PlaylistEscolhida
=
0
#Indice da playlist escolhida
#Variaveis relacionadas aos botoes de comando
PinoPlayPause
=
18
# Broadcom pin 18 (no conector P1, pino 12)
PinoSobeVolume
=
17
# Broadcom pin 17 (no conector P1, pino 11)
PinoDesceVolume
=
22
# Broadcom pin 22 (no conector P1, pino 15)
PinoRadioAnterior
=
27
# Broadcom pin 27 (no conector P1, pino 13)
PinoProximaRadio
=
23
# Broadcom pin 23 (no conector P1, pino 16)
NomeRadio1
=
"Radio ShoutCast"
NomeRadio2
=
"Radio Backstage (www.radiobackstage.com)"
#Funcao: inicia lista de playlists
#Parametros: nenhum
#Retorno: nenhum
def
IniciaListaPlaylists():
global
Playlists
global
NomesRadios
global
NumeroPlaylists
#playlist 1
NomesRadios.append(
"Radio Shoutcast"
)
#playlist 2
NomesRadios.append(
"Radio Backstage"
)
#playlist 3
NomesRadios.append(
"Techno"
)
NumeroPlaylists
=
3
return
#Funcao: Toca a plsylist escolhida
#Parametros: nenhum
#Retorno: nenhum
def
TocaPlaylist(PEscolhida):
global
Playlists
global
ComandoMPlayer
os.system(
"pkill -f mplayer"
)
ComandoPlaylist
=
ComandoMPlayer
+
Playlists[PEscolhida]
#inicia processo e direciona o stdout para /dev/null
FNULL
=
open
(os.devnull,
'w'
)
args
=
shlex.split(ComandoPlaylist)
InterfaceMPlayer
=
subprocess.Popen(args, shell
=
False
, stdin
=
subprocess.PIPE, stdout
=
FNULL, stderr
=
subprocess.STDOUT)
#ajusta volume em 50%
os.system(
'echo "volume 50" >'
+
CaminhoArquivoControle)
return
#Funcao: cria arquivo de controle do player (MPlayer)
#Parametros: nenhum
#Retorno: nenhum
def
CriaArquivoControle():
#se arquivo ja existe, nada e feito.
if
(os.path.exists(CaminhoArquivoControle)):
return
try
:
os.mkfifo(CaminhoArquivoControle)
except
:
print
"Falha ao criar arquivo de controle. Por favor, verifique o caminho de criacao do mesmo."
exit(
1
)
#Funcao: escreve radio atual e estado da reproducao no display
#Parametros: nome da radio, estado de reproducao, tamanho da tela (altura e largura)
# e objetos (draw, image e disp)
#Retorno: nenhum
def
EscreveDisplay(NomeDaRadio, EstadoReproducao, AlturaDisplay, LarguraDisplay, draw, image, disp):
global
top
#Apaga display desenhando um retangulo preto que ocupa toda a tela
draw.rectangle((
0
,
0
,LarguraDisplay,AlturaDisplay), outline
=
0
, fill
=
0
)
font
=
ImageFont.load_default()
draw.text((x, top),
'Player - radio online'
, font
=
font, fill
=
255
)
draw.text((x, top
+
20
),
'Tocando:'
, font
=
font, fill
=
255
)
draw.text((x, top
+
40
), NomeDaRadio, font
=
font, fill
=
255
)
draw.text((x, top
+
60
),
'Status: '
, font
=
font, fill
=
255
)
draw.text((x, top
+
80
), EstadoReproducao, font
=
font, fill
=
255
)
disp.image(image)
disp.display()
return
#------------------
#Programa principal
#------------------
#inicializacoes dos GPIOs
GPIO.setmode(GPIO.BCM)
GPIO.setup(PinoPlayPause, GPIO.IN, pull_up_down
=
GPIO.PUD_UP)
#input c/ pull-up
GPIO.setup(PinoSobeVolume, GPIO.IN, pull_up_down
=
GPIO.PUD_UP)
#input c/ pull-up
GPIO.setup(PinoDesceVolume, GPIO.IN, pull_up_down
=
GPIO.PUD_UP)
#input c/ pull-up
GPIO.setup(PinoRadioAnterior, GPIO.IN, pull_up_down
=
GPIO.PUD_UP)
#input c/ pull-up
GPIO.setup(PinoProximaRadio, GPIO.IN, pull_up_down
=
GPIO.PUD_UP)
#input c/ pull-up
#inicializacoes do display
disp.begin()
disp.clear()
disp.display()
width
=
disp.width
height
=
disp.height
image
=
Image.new(
'1'
, (width, height))
draw
=
ImageDraw.Draw(image)
padding
=
2
shape_width
=
20
top
=
padding
bottom
=
height
-
padding
x
=
padding
#Inicializa lista de playlists
IniciaListaPlaylists()
#Cria arquivo de controle e inicia processo MPlayer
CriaArquivoControle()
#Toca playlist 1
TocaPlaylist(PlaylistEscolhida)
#escreve no display a radio que esta tocando
EscreveDisplay(NomesRadios[PlaylistEscolhida],
'Tocando'
, height,width, draw,image, disp)
while
True
:
try
:
if
(!GPIO.
input
(PinoPlayPause)):
print
"[ACAO] Play/Pause"
os.system(
'echo "pause" > '
+
CaminhoArquivoControle)
if
(!GPIO.
input
(PinoSobeVolume)):
print
"[ACAO] Sobe volume"
os.system(
'echo "volume +10" > '
+
CaminhoArquivoControle)
if
(!GPIO.
input
(PinoDesceVolume)):
print
"[ACAO] Desce volume"
os.system(
'echo "volume -10" > '
+
CaminhoArquivoControle)
if
(!GPIO.
input
(PinoProximaRadio)):
print
"[ACAO] Proxima estacao"
PlaylistEscolhida
=
PlaylistEscolhida
+
1
if
(PlaylistEscolhida
=
=
NumeroPlaylists):
PlaylistEscolhida
=
0
TocaPlaylist(PlaylistEscolhida)
EscreveDisplay(NomesRadios[PlaylistEscolhida],
'Tocando'
, height,width, draw,image, disp)
if
(!GPIO.
input
(PinoRadioAnterior)):
print
"[ACAO] Estacao anterior"
PlaylistEscolhida
=
PlaylistEscolhida
-
1
if
(PlaylistEscolhida <
0
):
PlaylistEscolhida
=
NumeroPlaylists
-
1
TocaPlaylist(PlaylistEscolhida)
EscreveDisplay(NomesRadios[PlaylistEscolhida],
'Tocando'
, height,width, draw,image, disp)
except
(KeyboardInterrupt):
print
"Aplicacao sendo encerrada."
exit(
1
)
Copie e cole este código em um editor de texto de sua preferência (sugestão: nano) e salve o arquivo como ReceptorRadioOnlineRasp.py. Para executar o projeto, utilize o seguinte comando:
python ReceptorRadioOnlineRasp.py
Abaixo você confere um vídeo do projeto em ação:
Comentários
Postar um comentário