Pular para o conteúdo principal

Como Fazer Um Receptor de Rádio Online Com Raspbery Pi

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.

 
Resultado de imagem para receptor de radio online com raspberry

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:

Video Player

Comentários

Postagens mais visitadas deste blog

Free E-Books sobre SQL Server para Download

Fala galera ; ), no post de hoje trago links para download de vários ebooks sobre Microsoft SQL Server e sobre banco de dados! Aproveite e amplie seus conhecimentos na área! Bons estudos!! Última Atualização: 20/06/2017 Materiais para Certificação Segue abaixo o link de um post que  atualizo frequentemente  com diversos  Materiais para Certificação : https://www.fabriciolima.net/sql-server/materiais-certificacao/ Materiais para Estudo Segue abaixo o link de um post que  atualizo frequentemente  com mais Materiais para Estudo com vários  Cursos Gratuitos, Vídeos e Links interessantes : https://www.fabriciolima.net/sql-server/materiais-para-estudo/ Microsoft SQL Server 2016 Link  –  Atualizado dia 28/10/2016  –  Site Microsoft – SQL Server 2016 Training Kit Link  –  Atualizado dia 28/10/2016  –  SQLServerCentral – Learning New Features in SQL Server 2016 Download  –  Atualizado dia 09/09/2016  –  Introducing Microsoft SQL Server 2016 Download  –  Atua

Projetos com Arduíno: Semáforo

Neste post vou mostrar um pequeno projeto com arduíno, é um projeto para iniciantes é um projeto para iniciantes e bastante interessante, acedendo três ledS SIMULANDO UM SEMÁFORO, MÃOS A OBRA! SEMÁFORO com arduíno Olá pessoal, agora vamos fazer um pequeno projeto, um semáforo que irá do verde ao vermelho, passando pelo amarelo e, que retornará ao vermelho depois de um intervalo de tempo. Este projeto poderá ser utilizado em uma maquete com carinhos simulando uma pequena cidade ou mesmo uma estrada de ferro. Os códigos serão todos comentados para melhor entendimento, podendo ser retirados após a compreensão de cada linha. Bom trabalho !!! COMPONENTES NECESSÁRIOS 1 Arduino Uno R3 1 Protoboard 1 LED Amarelo 1 LED Verde 1 LED Vermelho 3 Resistor de 100 ohms * Fios jumpers * Esse valor pode ser diferente, dependendo do LED que você utilizar. CONECTANDO OS COMPONENTES Primeiro, certifique-se de que seu Arduino esteja desligado, desconectando-o

Inciando com Node-RED e Arduino UNO

21 Para aqueles que não conhecem, o   Node-RED   consiste em uma ferramenta bastante versátil, voltada principalmente para o desenvolvimento de aplicações relacionadas ao conceito de   Internet de Coisas (IoT) . Este recurso utiliza uma abordagem de   programação gráfica , ou seja, através do mesmo, torna-se possível elaborar uma aplicação por meio do estabelecimento de conexões entre blocos que possuem códigos predefinidos (conhecidos como   nós ) para a realização de determinadas tarefas. O  N ode-RED  tem como função primordial auxiliar na elaboração de aplicações propondo uma maneira mais simples para o usuário que não domina muito as ferramentas de programação e também não possui conhecimento suficiente sobre estruturas utilizadas no desenvolvimento de sistemas embarcados, como um  Arduino UNO  ou um  Raspberry PI . Entretanto, também é possível desenvolver uma vasta gama de aplicações avançadas, de maneira rápida e fácil. O objetivo deste artigo consiste em apresentar al