Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Bouw een Wi‑Fi Internetradio met Raspberry Pi en Arduino: Stream Wereldwijde Zenders

Onderdelen en benodigdheden

Arduino UNO × 1
Raspberry Pi 3 Model B × 1
SainSmart LCD Keypad Shield voor Arduino × 1
5V voeding × 1

Apps en online diensten

  • Python

Over dit project

Overzicht

Ik luister graag naar de radio als ik aan het maken ben of kook, maar waar ik woon is de FM-ontvangst vreselijk. En met het internet is het luisteren naar radiozenders over de hele wereld een genot, maar ik gebruik mijn smartphone niet graag voor muziek. Na veel googelen vond ik verschillende oplossingen.

Ik baseerde dit project op een andere tutorial: Arduino / Raspberry Pi Internet Radio door akellyirl. De code is in Python geschreven op de Raspberry Pi en gebruikt de Linux music player daemon (mpd) en de speler (mpc). Er is een bibliotheek nanpy die Python laat communiceren met de Arduino die de drukknoppen en het LCD bestuurt.

Ik gebruikte een LCD/toetsenbord-shield voor de Arduino met drukknoppen: SainSmart LCD Keypad Shield voor Arduino, en later voegde ik een 4-knoppenstrip toe die ik uit een kapotte wekker haalde. Eerst gebruikte ik een Raspberry Pi 2 met een USB WiFi-adapter, maar nu gebruik ik een RP3 die ingebouwde WiFi heeft en geen antenne nodig heeft.

Het moeilijkste deel was het vinden van de juiste URL's van de zenders die ik wilde. Uiteindelijk vond ik dit programma: URL HELPER die de site waar je op zit opspoort en de URL's van de speelende media toont. Voor het geluid gebruikte ik een paar actieve computerspeakers die ik ook uit de prullebak haalde.

Bouw een Wi‑Fi Internetradio met Raspberry Pi en Arduino: Stream Wereldwijde Zenders
De internetradio in werking
Bouw een Wi‑Fi Internetradio met Raspberry Pi en Arduino: Stream Wereldwijde Zenders

Installatie-instructies

Installatie-instructies voor RP3 (vanuit Arduino / Raspberry Pi Internet Radio door akellyirl in Arduino):

  1. Update Raspbian naar de nieuwste pakketten:
    $ sudo apt-get update
  2. Installeer de mpd/mpc pakketten:
    $ sudo apt-get install mpc mpd

We willen met de Arduino kunnen praten vanuit Python op de Pi. Daarvoor moeten we de nanpy-bibliotheek voor Python en de nanpy-firmware voor Arduino installeren:

  1. Installeer Arduino-pakketten om de nanpy-firmware voor Arduino te bouwen:
    $ apt-get install arduino
  2. Haal de nanpy-bibliotheek voor Python en pak uit vanaf /home/pi:
    $ wget https://pypi.python.org/packages/source/n/nanpy/nanpy-v0.7.tar.gz
    $ tar xvf nanpy-v0.7.tar.gz
  3. Haal setuptools voor Python (een afhankelijkheid voor nanpy) en pak uit:
    $ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e
    $ tar xvf setuptools-0.6c11.tar.gz
  4. Haal pyserial voor Python (een afhankelijkheid voor nanpy) en pak uit:
    $ wget https://pypi.python.org/packages/source/p/pyserial/pyserial-2.6.tar.gz
    $ tar xvf pyserial-2.6.tar.gz
  5. Ga naar de setuptools-map en installeer Python setuptools:
    $ cd setuptools-0.6c11
    $ sudo python setup.py install
  6. Ga naar de nanpy-map en installeer de Python nanpy-bibliotheek:
    $ cd ../nanpy
    $ sudo python setup.py install
  7. Ga naar de serial-map en installeer de Python serial-bibliotheek:
    $ cd ../pyserial-2.6
    $ sudo python setup.py install

Nu hebben we de benodigde bestanden, laten we de nanpy-firmware op de Arduino zetten.

Firmware

nanpy stelt een Python-programma dat op de Raspberry Pi draait in staat om de Arduino te bedienen met conventionele Arduino-sketch-syntax, bijvoorbeeld het Python-programma om een analoog input van de Arduino te lezen zou kunnen lezen:

int val = Arduino.analogRead(14)

Nanpy heeft twee componenten:

  • Een bibliotheek voor Python die Arduino-commando's in een bekende syntax toestaat en met de Arduino communiceert;
  • Firmware die op de Arduino draait en communiceert met Python op de Pi.

We hebben het Python-deel van nanpy geïnstalleerd en het Arduino-deel van nanpy op de Pi gedownload in de vorige stap. Nu moeten we de nanpy-firmware naar de Arduino uploaden.

Stek de Arduino in de USB van de Raspberry Pi.

  1. Ga naar de nanpy-firmware-map en upload naar Arduino:
    $ cd ../nanpy/firmware
    $ export BOARD=uno
    $ make
    $ make upload

Als je een melding krijgt dat het apparaat niet gevonden wordt op /dev/ttyACM0, steek de Arduino dan in de andere USB-poort.

Ik maakte een playlist-script en een Python-script (gepubliceerd in de code-tab) en maakte het Python-script autostart bij het opstarten van de Raspberry Pi. Ik voegde ook nog een drukknop toe om menu-opties te tonen zoals het IP-adres tonen of de audio-uitgang kiezen.

Laatste update: ik heb het herbouwd, met draaiencoders voor zenderkeuze en volume en een 3D-geprinte behuizing:

Bouw een Wi‑Fi Internetradio met Raspberry Pi en Arduino: Stream Wereldwijde Zenders
De verbeterde versie met 3D-geprinte behuizing en draaiencoders

Code

  • piradio
  • radio_plylist.sh

piradio Python

Ik ben geen Python-programmeur (dit is meestal copy/paste van stukjes die ik op Google vond. Tot nu toe werkt het :)

Dit script moet bij opstarten laden in de Pi, ik voegde het toe aan een crontab-taak

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]) # Setup the LCD pins for the Sainsmart Shield
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=[]
#added to show the station name when push button pressed
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'))
#show the ip address
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 in the fifth pushbutton
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()]
    # Get the Track info from the stdout of the mpc command
    output = run_cmd("mpc current")
    station = output [0:16]
    # Pick out the Station and Track info
    track = output [-17:-1]
    lcd.printString(station + " "*(16 - len(station)), 0, 0)
    lcd.printString(track + " "*(16 - len(track)), 0, 1)
    track_num = 1
    # Start off on Track number 1
    os.system("sudo service mpd restart")
    os.system("mpc play "+str(track_num))
    # Tell the OS to Play it
    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()
                        #get_local_ip_address()
                        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 SH

Dit is mijn playlist met Israëlische zenders

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

Schema's

Bouw een Wi‑Fi Internetradio met Raspberry Pi en Arduino: Stream Wereldwijde Zenders

Productieproces

  1. Een Professionele Raspberry Pi Universele Afstandsbediening Bouwen met LIRC
  2. RF naar DC Converteren met een Raspberry Pi: Een Envelope Detector Bouwen en Troubleshooten
  3. Cycle Chaser: Uw Fiets Transformeren in een Nachttijd Lichtshow met Raspberry Pi
  4. Een Raspberry Pi-gebaseerde Diefdetector Bouwen – Stapsgewijze Handleiding
  5. Een Raspberry Pi thuistemperatuurmonitor bouwen met MCP9808, InfluxDB & Grafana
  6. Een Raspberry Pi-thuisautomatiseringssysteem bouwen voor afstandsbediening
  7. MrRobot: Ubuntu Mobiel-Gestuurde Rapiro Robot met Stem, Touch & Schud Interactie
  8. DIY Wall-E Geïnspireerde Raspberry Pi CD-Doos Robot
  9. Bouw een Bluetooth-gecontroleerde Raspberry Pi Robot met Audio Feedback
  10. Bouw een Internet-gecontroleerde Video-streamende Robot met Arduino & Raspberry Pi
  11. RasPiRobot Board V2: Je Raspberry Pi Uitbreiden tot een Krachtige Robot-controller