Receptor de rádio online com Raspberry Pi

Receptor de rádio online com Raspberry Pi

Rádios online não são novidade, é verdade. Porém, constituem um meio ainda fantástico de se ouvir música e notícias do mundo todo e, por que não, conhecer novas culturas também. Quando 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.

Rádio On-line com Raspberry Pi

O que é necessário comprar para reproduzir o projeto?

Para fazer o projeto de rádio online com Raspberry Pi, será necessário:

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:

 Circuito Rádio on-line com Raspberry Pi

 

Código-fonte projeto Rádio online com Raspberry Pi

Veja abaixo o código-fonte do projeto!
Observação: para maiores informações das bibliotecas a serem instaladas para o funcionamento do display OLED na Raspberry Pi, veja este nosso artigo.

#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
	Playlists.append("http://yp.shoutcast.com/sbin/tunein-station.pls?id=1057392")
	NomesRadios.append("Radio Shoutcast")

	#playlist 2
	Playlists.append("http://panel3.serverhostingcenter.com:2199/tunein/radiobackstage1.pls")
	NomesRadios.append("Radio Backstage")

	#playlist 3
	Playlists.append("http://yp.shoutcast.com/sbin/tunein-station.pls?id=1425714")
	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:

 

Gostou do post rádio online com Raspberry Pi? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo), comente e visite nossa loja FILIPEFLOP!

4
Receptor de rádio online com Raspberry Pi
4 votos, 5.00 classificação média (100% pontuação)

Engenheiro eletricista formado pela Faculdade de Engenharia de Guaratinguetá (FEG - UNESP), trabalha com desenvolvimento de firmware. Colaborador do site FILIPEFLOP.

Compartilhe este Post

4 Comentários

  1. Paulo Henrique - 10 de maio de 2017

    tem como fazer algom assim mais com Bluetooth ?
    o smart controla ele e ele so toca a radio qualquer uma ?

    • Pedro Bertoleti - 11 de maio de 2017

      Paulo, bom dia.

      Eu entendi que você gostaria de controlar o projeto por Bluetooth através de seu Smartphone, certo? Se sim, isso é possível ser feito (apesar de eu não ter feito algo assim ainda, não vejo impeditivo algum).

      Quanto a tocar qualquer rádio, apenas tenha um cuidado: como o artigo diz, o formato do arquivo que contém as informações de streaming (no caso deste projeto, arquivo .pls) deve ser compatível com o mplayer. Se isso for obedecido, a rádio pode ser tocada sim.

      Atenciosamente,
      Pedro Bertoleti

  2. Pedro Bertoleti - 9 de maio de 2017

    Nelson, boa tarde.

    Não seria possível por dois motivos:

    1) Somente o Arduino Uno + display não possui conectividade com a Internet.
    2) Mesmo se existisse conectividade com a Internet neste caso, o Uno não é capaz de lidar stream e decodificação de áudio.

    Atenciosamente,
    Pedro Bertoleti

  3. NELSON ICIBACI - 9 de maio de 2017

    TERIA COMO RODAR NUM UNO ARDUINO COM DISPLAY 1.8 TFT V1.0 SPI 128*160

    GRATO

Deixe uma resposta