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.
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!
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!
Site: Blog FILIPEFLOP