Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

WLAN-Internetradio mit Raspberry Pi & Arduino bauen: Weltweite Sender streamen

Komponenten und Zubehör

Arduino UNO 1
Raspberry Pi 3 Model B 1
SainSmart LCD Keypad Shield für Arduino 1
5V Netzteil 1

Apps und Online-Dienste

Über dieses Projekt

Überblick

Ich höre gerne Radio beim Basteln oder Kochen, aber wo ich wohne ist der FM-Empfang miserabel. Mit dem Internet kann man weltweit Sender hören, aber ich nutze ungern mein Smartphone dafür. Nach viel Recherche fand ich mehrere Lösungen.

Dieses Projekt basiert auf einem Tutorial: „Arduino / Raspberry Pi Internet Radio“ von akellyirl. Der Code läuft in Python auf dem Raspberry Pi und nutzt den Linux Music Player Daemon (mpd) und den Player (mpc). Die Bibliothek nanpy ermöglicht Python die Kommunikation mit dem Arduino, der die Tasten und das LCD steuert.

Ich nutzte ein LCD/Keypad-Shield für den Arduino mit Drucktasten: SainSmart LCD Keypad Shield. Später fügte ich eine 4-Tasten-Leiste hinzu, die ich aus einem kaputten Wecker ausgebaut hatte. Zuerst verwendete ich einen Raspberry Pi 2 mit USB-WLAN-Adapter, jetzt einen RP3 mit integriertem WLAN – keine Antenne nötig.

Der schwierigste Teil war, die richtigen URLs der gewünschten Sender zu finden. Schließlich fand ich das Programm „URL HELPER“, das die Medien-URLs der besuchten Seite anzeigt. Für den Ton nutzte ich ein Paar aktive PC-Lautsprecher, ebenfalls aus Schrott gerettet.

WLAN-Internetradio mit Raspberry Pi & Arduino bauen: Weltweite Sender streamen
WLAN-Internetradio mit Raspberry Pi & Arduino bauen: Weltweite Sender streamen

Installationsanleitung

Für Raspberry Pi 3 (basierend auf akellyirls Tutorial)

  1. Raspbian auf neueste Pakete aktualisieren:
    $ sudo apt-get update
  2. mpd/mpc installieren:
    $ sudo apt-get install mpc mpd
  3. Arduino-Pakete für nanpy-Firmware installieren:
    $ apt-get install arduino
  4. nanpy-Bibliothek für Python herunterladen und entpacken (in /home/pi):
    $ wget https://pypi.python.org/packages/source/n/nanpy/nanpy-v0.7.tar.gz
    $ tar xvf nanpy-v0.7.tar.gz
  5. setuptools für Python (Abhängigkeit) herunterladen und entpacken:
    $ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e
    $ tar xvf setuptools-0.6c11.tar.gz
  6. pyserial für Python (Abhängigkeit) herunterladen und entpacken:
    $ wget https://pypi.python.org/packages/source/p/pyserial/pyserial-2.6.tar.gz
    $ tar xvf pyserial-2.6.tar.gz
  7. Im setuptools-Verzeichnis Python setuptools installieren:
    $ cd setuptools-0.6c11
    $ sudo python setup.py install
  8. Im nanpy-Verzeichnis Python nanpy-Bibliothek installieren:
    $ cd ../nanpy
    $ sudo python setup.py install
  9. Im serial-Verzeichnis Python serial-Bibliothek installieren:
    $ cd ../pyserial-2.6
    $ sudo python setup.py install

Nun haben wir die nötigen Dateien. Als Nächstes die nanpy-Firmware auf den Arduino laden.

Firmware

nanpy erlaubt einem Python-Programm auf dem Raspberry Pi, den Arduino mit der gewohnten Arduino-Sketch-Syntax zu steuern, z. B.:

int val = Arduino.analogRead(14)

Nanpy besteht aus zwei Komponenten:

Wir haben den Python-Teil installiert und den Arduino-Teil auf dem Pi heruntergeladen. Jetzt muss die Firmware auf den Arduino hochgeladen werden.

Arduino per USB an den Raspberry Pi anschließen.

  1. In das nanpy-Firmware-Verzeichnis wechseln und auf Arduino hochladen:
    $ cd ../nanpy/firmware
    $ export BOARD=uno
    $ make
    $ make upload

Falls der Fehler kommt, dass das Gerät nicht auf /dev/ttyACM0 gefunden wird: Arduino in den anderen USB-Port stecken.

Ich erstellte ein Playlist-Skript und ein Python-Skript (im Code-Reiter veröffentlicht) und machte das Python-Skript zum Autostart beim Booten des Raspberry. Ich fügte auch einen weiteren Taster für Menüoptionen hinzu (IP anzeigen, Audio-Ausgang wählen).

Letztes Update: Ich habe es überarbeitet – Drehencoder für Senderwahl und Lautstärke hinzugefügt und ein 3D-gedrucktes Gehäuse entworfen:

WLAN-Internetradio mit Raspberry Pi & Arduino bauen: Weltweite Sender streamen

Code

piradio (Python)

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]) # LCD-Pins für 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 = []
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'))

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 = get_local_ip_address('10.0.1.1')
    lcd.printString('IP Address:',0,0)
    lcd.printString(ipaddr,0,1)
    sleep(2)

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()]
    output = run_cmd("mpc current")
    station = output[0:16]
    track = output[-17:-1]
    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")
                    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_playlist.sh (Shell)

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

Schaltplan

WLAN-Internetradio mit Raspberry Pi & Arduino bauen: Weltweite Sender streamen

Herstellungsprozess

  1. Professionelle Raspberry Pi Universalfernbedienung mit LIRC bauen
  2. RF zu DC mit Raspberry Pi wandeln: Hüllkurvendetektor bauen & troubleshooten
  3. Cycle Chaser: Fahrrad zur nächtlichen Lichtshow mit Raspberry Pi verwandeln
  4. Raspberry Pi Diebstahlmelder bauen – Schritt-für-Schritt-Anleitung
  5. Raspberry Pi Heimtemperaturmonitor mit MCP9808, InfluxDB & Grafana bauen
  6. Raspberry Pi Home Automation System für Fernsteuerung bauen
  7. MrRobot: Ubuntu-Mobile-gesteuerter Rapiro-Roboter mit Sprache, Touch & Schüttel-Interaktion
  8. DIY Wall-E-inspirierter Raspberry Pi CD-Box-Roboter
  9. Bluetooth-gesteuerter Raspberry Pi Roboter mit Audio-Feedback bauen
  10. Internet-gesteuerter Video-Streaming-Roboter mit Arduino & Raspberry Pi bauen