Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Construa uma Rádio Internet Wi‑Fi com Raspberry Pi e Arduino: Transmita Estações Globais

Componentes e Materiais

Componente Quantidade Observações
Arduino UNO 1
Raspberry Pi 3 Model B 1
Shield LCD Keypad SainSmart para Arduino 1
Fonte de alimentação 5V 1

Aplicativos e Serviços Online

Sobre o Projeto

Visão Geral

Adoro ouvir rádio quando estou fazendo algo ou cozinhando, mas onde moro a recepção FM é terrível. E com a Internet, ouvir estações de rádio do mundo todo é um prazer, mas não gosto de usar meu smartphone para ouvir música. Então, com muita pesquisa no Google, encontrei várias soluções.

Baseei este projeto em outro tutorial: Arduino / Raspberry Pi Internet Radio por akellyirl. O código é escrito em Python no Raspberry Pi e basicamente usa o daemon de música do Linux (mpd) e o player (mpc). Existe uma biblioteca nanpy que permite ao Python se comunicar com o Arduino, que controla os botões e o LCD.

Usei um shield LCD/teclado para Arduino que tem botões: SainSmart LCD Keypad Shield for Arduino, e depois adicionei uma fileira de 4 botões que retirei de um relógio despertador quebrado. Primeiro usei um Raspberry Pi 2 com adaptador WiFi USB, mas agora uso um RP3 que tem WiFi embutido e não precisa de antena.

A parte mais difícil foi encontrar as URLs certas das estações que queria. Finalmente encontrei este programa: URL HELPER, que fareja o site em que você está e mostra as URLs da mídia tocando. Para o som, usei um par de caixas de computador ativas também recuperadas de sucata.

Construa uma Rádio Internet Wi‑Fi com Raspberry Pi e Arduino: Transmita Estações Globais
Rádio Internet finalizada - Vista frontal
Construa uma Rádio Internet Wi‑Fi com Raspberry Pi e Arduino: Transmita Estações Globais
Vista interna com Raspberry Pi e Arduino

Instruções de Instalação

Instruções para RP3 (do tutorial Arduino / Raspberry Pi Internet Radio por akellyirl no Arduino):

1. Atualize o Raspbian para os pacotes mais recentes:

$ sudo apt-get update

2. Instale os pacotes mpd/mpc:

$ sudo apt-get install mpc mpd

Queremos poder falar com o Arduino a partir do Python rodando no Pi. Para isso, precisamos instalar a biblioteca nanpy para Python e o firmware nanpy para Arduino:

1. Instale pacotes Arduino para compilar o firmware nanpy para Arduino:

$ apt-get install arduino

2. Baixe a biblioteca nanpy para Python e extraia de /home/pi:

$ wget https://pypi.python.org/packages/source/n/nanpy/nanpy-v0.7.tar.gz
$ tar xvf nanpy-v0.7.tar.gz

3. Baixe setuptools para Python (dependência do nanpy) e extraia:

$ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e
$ tar xvf setuptools-0.6c11.tar.gz

4. Baixe pyserial para Python (dependência do nanpy) e extraia:

$ wget https://pypi.python.org/packages/source/p/pyserial/pyserial-2.6.tar.gz
$ tar xvf pyserial-2.6.tar.gz

5. Vá ao diretório setuptools e instale o Python setuptools:

$ cd setuptools-0.6c11
$ sudo python setup.py install

6. Vá ao diretório nanpy e instale a biblioteca Python nanpy:

$ cd ../nanpy
$ sudo python setup.py install

7. Vá ao diretório serial e instale a biblioteca Python serial:

$ cd ../pyserial-2.6
$ sudo python setup.py install

Agora temos os arquivos necessários, vamos colocar o firmware nanpy no Arduino.

Firmware

nanpy permite que um programa Python rodando no Raspberry Pi opere o Arduino usando sintaxe convencional de Arduino Sketch, por exemplo, o programa Python para ler uma entrada analógica do Arduino poderia ler:

int val = Arduino.analogRead(14)

O Nanpy tem dois componentes:

Instalamos a parte Python do nanpy e baixamos a parte Arduino do nanpy no Pi no passo anterior. Agora precisamos fazer upload do firmware nanpy para o Arduino.

Conecte o Arduino na USB do Raspberry Pi.

1. Vá ao diretório do firmware nanpy e faça upload para o Arduino:

$ cd ../nanpy/firmware
$ export BOARD=uno
$ make
$ make upload

Se receber um relatório de que o dispositivo não foi encontrado em /dev/ttyACM0, conecte o Arduino na outra porta USB.

Criei um script de playlist e um script Python (publicados na aba código) e fiz o script Python rodar automaticamente no boot do Raspberry. Também adicionei outro botão para mostrar opções de menu como mostrar o IP ou escolher a saída de áudio.

Última atualização: refiz o projeto, adicionei encoders rotativos para sintonia e volume, e imprimi a caixa em 3D:

Construa uma Rádio Internet Wi‑Fi com Raspberry Pi e Arduino: Transmita Estações Globais
Versão 2.0: Caixa impressa em 3D com encoders rotativos para volume e sintonia

Código

piradio (Python)

Não sou programador Python (isto é mostly copy/paste de trechos que encontrei no Google. Até agora funciona :)

Este script deve carregar na inicialização do Pi, adicionei a uma tarefa crontab.

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, INPUT)
lcd = Lcd([8,9,4,5,6,7],[16,2]) # Configura pinos LCD para Shield SainSmart
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 = []
# Adicionado para mostrar nome da estação quando botão pressionado
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'))

# Mostra endereço IP
def display_ipaddr():
    show_wlan0 = "ip addr show wlan0 | cut -d/ -f1 | awk '/inet/ {printf \"w%15.15s\", $2}'"
    show_eth0 = "ip addr show eth0 | cut -d/ -f1 | awk '/inet/ {printf \"e%15.15s\", $2}'"
    ipaddr = ''
    #ipaddr = run_cmd(show_eth0)
    ipaddr = get_local_ip_address('10.0.1.1')
    #if ipaddr == "":
    # ipaddr = run_cmd(show_wlan0)
    lcd.printString('IP Address:',0,0)
    lcd.printString(ipaddr,0,1)
    sleep(2)

# Menu no quinto botão
def displaymenu():
    if x==1:
        lcd.printString("1. Display ",0,0)
        lcd.printString(" IP Address ",0,1)
    elif x==2:
        lcd.printString("2. Audio Output ",0,0)
        lcd.printString(" to hdmi Port ",0,1)
    elif x==3:
        lcd.printString("3. Audio Output ",0,0)
        lcd.printString(" to Analog port",0,1)
    elif x==4:
        lcd.printString("4. Audio Output ",0,0)
        lcd.printString(" Auto Sel. Port",0,1)
    elif x==5:
        lcd.printString("5. Reload the ",0,0)
        lcd.printString(" Playlist ",0,1)
    elif x==6:
        lcd.printString("6. ShutDown ",0,0)
        lcd.printString(" the System ",0,1)
    else:
        lcd.printString("7. Exit to ",0,0)
        lcd.printString(" Main Menu ",0,1)

def load_playlist():
    output = run_cmd("mpc clear")
    output = run_cmd("/home/pi/radio/radio_playlist.sh")

def run_cmd(cmd):
    p = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT)
    output = p.communicate()[0]
    return output

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():
    L = [S.strip('\n') for S in os.popen('mpc').readlines()]
    # Obtém info da faixa da saída stdout do comando mpc
    output = run_cmd("mpc current")
    station = output[0:16]  # Extrai nome da estação
    track = output[-17:-1]  # Extrai info da faixa
    lcd.printString(station + " " * (16 - len(station)), 0, 0)
    lcd.printString(track + " " * (16 - len(track)), 0, 1)
    track_num = 1
    os.system("sudo service mpd restart")
    os.system("mpc play " + str(track_num))

while loop_radio == 1:
    getTrack()
    loop_menu = 1
    x = 1
    key = getKey()
    if key == "UP":
        track_num += 1
        if track_num > max_trax:
            track_num = 1
        lcd.printString(stations[track_num-1],0,0)
        os.system("sudo service mpd restart")
        os.system("mpc play " + str(track_num))
        getTrack()
    elif key == "DOWN":
        track_num -= 1
        if track_num < 1:
            track_num = max_trax
        lcd.printString(stations[track_num-1],0,0)
        os.system("sudo service mpd restart")
        os.system("mpc play " + str(track_num))
        getTrack()
    elif key == "LEFT":
        os.system("mpc volume +10")
        lcd.printString(16*" ", 0, 0)
        lcd.printString(16*" ", 0, 1)
        output = run_cmd("mpc volume")
        lcd.printString("VOLUME UP:", 0, 0)
        lcd.printString(output, 5, 1)
        sleep(.25)
        lcd.printString(16*" ",0,0)
        lcd.printString(16*" ",0,1)
    elif key == "RIGHT":
        os.system("mpc volume -10")
        lcd.printString(16*" ",0,0)
        lcd.printString(16*" ", 0,1)
        output = run_cmd("mpc volume")
        lcd.printString("VOLUME DOWN:", 0, 0)
        lcd.printString(output, 5, 1)
        sleep(.25)
        lcd.printString(16*" ",0,0)
        lcd.printString(16*" ",0,1)
    elif key == "SEL":
        while loop_menu == 1:
            displaymenu()
            key = getKey()
            if key == "RIGHT":
                os.system("mpc volume +10")
                lcd.printString(16*" ", 0, 0)
                lcd.printString(16*" ", 0, 1)
                output = run_cmd("mpc volume")
                lcd.printString("VOLUME UP:", 0, 0)
                lcd.printString(output, 5, 1)
                sleep(.25)
                lcd.printString(16*" ",0,0)
                lcd.printString(16*" ",0,1)
            elif key == "LEFT":
                os.system("mpc volume -10")
                lcd.printString(16*" ",0,0)
                lcd.printString(16*" ", 0,1)
                output = run_cmd("mpc volume")
                lcd.printString("VOLUME DOWN:", 0, 0)
                lcd.printString(output, 5, 1)
                sleep(.25)
                lcd.printString(16*" ",0,0)
                lcd.printString(16*" ",0,1)
            elif key == "UP":
                if x <= 1:
                    x = 7
                else:
                    x = x - 1
            elif key == "DOWN":
                if x >= 7:
                    x = 1
                else:
                    x = x + 1
            elif key == "SEL":
                if x == 1:
                    display_ipaddr()
                    sleep(1)
                elif x == 2:
                    output = run_cmd("amixer -q cset numid=3 2")
                    lcd.printString("Audio OUT-->HDMI", 0, 0)
                    lcd.printString("output ", 0, 1)
                    sleep(.5)
                elif x == 3:
                    output = run_cmd("amixer -q cset numid=3 1")
                    lcd.printString("Audio OUT->Analog", 0, 0)
                    lcd.printString("output ", 0, 1)
                    sleep(.5)
                elif x == 4:
                    output = run_cmd("amixer -q cset numid=3 0")
                    lcd.printString("Audio OUT-> Auto", 0, 0)
                    lcd.printString("output ", 0, 1)
                    sleep(.5)
                elif x == 5:
                    load_playlist()
                    os.system('mpc play 1')
                elif x == 6:
                    lcd.printString("Good Bye ", 0, 0)
                    lcd.printString("Have a Nice Day ", 0, 1)
                    output = run_cmd("mpc stop")
                    # = run_cmd("sudo shutdown now")
                    quit()
                elif x == 7:
                    loop_menu = 0
                    getTrack()
                    break
            elif key == "RIGHT":
                os.system("mpc volume +2")
                lcd.printString(16*" ",0,0)
                lcd.printString(16*" ", 0,1)
                output = run_cmd("mpc volume")
                lcd.printString("VOLUME UP:", 0, 0)
                lcd.printString(output, 5, 1)
                sleep(.25)
                lcd.printString(16*" ",0,0)
                lcd.printString(16*" ",0,1)
            elif key == "LEFT":
                os.system("mpc volume -2")
                lcd.printString(16*" ", 0, 0)
                lcd.printString(16*" ", 0, 1)
                output = run_cmd("mpc volume")
                lcd.printString("VOLUME DOWN:", 0, 0)
                lcd.printString(output, 5, 1)
                sleep(.25)
                lcd.printString(16*" ",0,0)
                lcd.printString(16*" ",0,1)

radio_plylist.sh (Shell)

Esta é minha playlist com estações israelenses.

#! /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

Esquemático

Construa uma Rádio Internet Wi‑Fi com Raspberry Pi e Arduino: Transmita Estações Globais
Esquemático de conexões Raspberry Pi + Arduino + Shield LCD

Processo de manufatura

  1. Construa um Controle Remoto Universal Profissional para Raspberry Pi com LIRC
  2. Convertendo RF em DC com Raspberry Pi: Construindo e Solucionando Problemas de um Detector de Envelope
  3. Cycle Chaser: Transforme Sua Bicicleta em um Show de Luzes Noturno com Raspberry Pi
  4. Construa um Detetor de Ladrão Baseado em Raspberry Pi – Guia Passo a Passo
  5. Construa Monitor de Temperatura Doméstico com Raspberry Pi, MCP9808, InfluxDB e Grafana
  6. Construa Sistema de Automação Residencial com Raspberry Pi para Controle Remoto
  7. MrRobot: Robô Rapiro Controlado por Ubuntu Mobile com Voz, Toque e Interação por Movimento
  8. Robô DIY Inspirado no Wall‑E com Caixa de CD e Raspberry Pi
  9. Construa um Robô Raspberry Pi Controlado por Bluetooth com Feedback de Áudio
  10. Construa um Robô de Streaming de Vídeo Controlado por Internet com Arduino e Raspberry Pi