Raspberry Pi YAIR (Yet Another Internet Radio)

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

von Martin Clausen

Einleitung

Ja, es gibt sie: Internetradios. Zum Kaufen. Zum Selbst bauen. Aus Routern. Aus dem Raspberry Pi. Aber schlussendlich gefiel mir keines so gut, dass es mich vom Selbstbau abgehalten hätte ...

Features für den Nutzer

  • Intuitive Bedienung über zwei Drehencoder mit Tastfunktion
    • Dynamische Schrittweitenanpassung für die schnelle und genaue Einstellung der Lautstärke und Sender
  • Fernbedienbar via IR-Fernbedieung oder Netzwerk / WLAN via Smartphone
  • Anzeige mit 4,3" TFT
  • Sehr niedriger Standby-Stromverbrauch
  • Email-Client
  • Update der gespeicherten Musik usw. via Netzwerk oder direkt via USB-Stick

Technische Eigenschaften

  • Basis Raspberry Pi, 512MB, Ethernet, 2x USB
  • Audio
    • Ausgabe via USB oder internem Wandler
    • Stereo Brücken-Verstärker TDA7374B mit 2*12W Ausgangsleistung und Standby
  • Spannungsversorgung
    • Phihong, PSAA 20R-120 (20W, 12V)
    • Niedrige Standby-Leistung von 0,5W (auf 230V Seite, 32mW auf 12V Seite)
    • Leistungsaufnahme im Betrieb bei geringer Lautstärke: 10W
    • Abschaltbarer Step-Down Regler für Raspberry Pi auf Basis des LM2676
    • Linearer Regler für MCU: LM2951
  • MCU
    • NXP 89LPC922 oder 89LPC93X, 8051 mit 2-Takt Kern
    • 3,3 Volt, niedriger Stromverbrauch
    • 6 MHz Takt mittels Resonator, 18 MHz maximal
  • Display
    • Anzeige zu Rückfahrkamera
    • Preis ca. 20,-€ (ebay)
    • 4,3" mit 640*480 Pixel
    • Anschlüsse
      • Video via Composite-Signal
      • Stromversorgung mit 12V
  • Kommunikation
    • WLAN oder LAN
    • Empfängt IR-Signale gemäß RC5-Protokoll mittels MCU
    • RS232 mit 3,3V Pegel zwischen MCU und Raspberry Pi bei 57600 Baud/s
  • Nichtflüchtiger Speicher
    • OS: 8GB SD-Karte
    • Musik: 64GB USB-Stick (nach belieben)
  • Optional: RTC für Raspberry Pi: RV 3029-C2 mit integriertem Quarz
  • USB
    • entstörter USB-Hub
    • optische Maus
    • USB-Stick
  • Struktur
    • Träger mit Raspberry Pi
    • Leistungsplatine 80x100mm², zweiseitig und durchkontaktiert
    • Verbindung über 20 pol. Flachbandkabel
    • Stromversorgung über Steckernetzteil
  • Mechanik
    • Konstruktion aus eloxierten Aluminium Profilgehäuse
  • Software Raspberry Pi
    • OS: Debian Derivat
    • Musik Wiedergabe: mpd + mpc + gmpc
    • Email Client: Claws (bei Bedarf)
    • Samba Fileserver
    • Diverse Konfigurations-Dateien
    • C Programm zur Dekodierung der Daten von der MCU
  • Software MCU
    • C für SDCC 3.3
    • Verwendet Stromsparmodi der MCU
    • State-Machines für Drehencoder und RC5-Dekodierung

Bilder

  • Front- und Rückseite

I-Radio Front.jpg I-Radio Back.jpg

  • Innenansicht

I-Radio Innen.jpg

alte Platinen-Version, ohne Zusatz-Kondensator über C6 der Raspberry Pi

  • Im Einsatz in der Küche

I-Radio Kueche.jpg]

Design

Die ursprüngliche Idee zur Software und Konfiguration ist hier zu finden. Grundlage bildet ein Raspberry Pi mit MPC/MPD zur Musikwiedergabe. Die Benutzerinteraktion findet mit einem kleinen 4,3"-TFT-Monitor, eine optische Maus, über zwei Drehencoder mit Tastfunktion sowie per Infrarot-Fernbedienung statt. Konfiguration und Upload von Musik geschehen per Netzwerk. Die Drehencoder und die Fernbedienung werden von einem MCU ausgewertet und erlauben so einen sehr stromsparenden Standby-Modus. Maus und Monitor sind ausreichend für weitergehende Anwendungen wie Email und Wetteranzeige, ohne die Notwendigkeit weitere Software selbst zu schreiben. Z.B. existieren auch Clienten für MPD für Streaming zu oder Steuerung durch Smartphones per Netzwerk.

Beschreibung

Software & Konfiguration

Raspberry Pi

Wie anderswo beschrieben aktuelles Image der Debian Variante (Raspbian) für den Raspberry Pi von der Homepage des Projektes (Download / Raw Images) laden und mit Win32DiskImager oder DD auf eine 4 GB oder gar 8GB SD-Karte ziehen. Die Programme machen sich auch später nützlich, um Images von der getanen Arbeit zu ziehen.

Hier sei nochmal auf den Ideengeber verwiesen: Raspberry PI: Internetradio

Die Konfiguration erfolgt später via putty über Netzwerk mit dem Editor nano. Je nach Verzeichnis und Aktion ist sudo zu benutzen. Zunächst muss der Raspberry Pi jedoch an eine "richtige" Tastatur, einen Monitor und das Internet via Kabel angeschlossen werden.

Es gibt nur einen kleinen Fetzen C-Code. Der Rest sind "nur" Konfigurationseinstellungen.

Diese Anleitung ist etwas stückhaft, bietet aber hoffentlich die richtigen Ansatzpunkte mit eigenem Wissen oder google die eigene Konfiguration zu erstellen, die natürlich auch von der hier präsentierten abweichen kann.

Die Konfiguration mit

raspi-config

beginnen. Lokalisierung einstellen, Partition expandieren und neu starten.

Update der Software:

apt-get update
apt-get upgrade

Der erste Befehl holt Informationen über neue Pakete, der zweite installiert sie. Dann neu starten.

Ergänzen der Software:

apt-get install gcc
apt-get install mpd mpc
apt-get install gmpc
apt-get install samba
apt-get install claws-mail
apt-get install ntfsprogs

WLAN konfigurieren, Claws und Samba-Server einrichten.

Eine Liste mit urls der gewünschten Radiosender wird unter

/var/lib/mpd/playlists/radio.m3u

angelegt:

http://mp3stream1.apasf.apa.at:8000

Und zugänglich gemacht:

chmod 644 /var/lib/mpd/playlists/radio.m3u

Nun MPD konfigurieren:

/etc/mpd.conf

Meine Änderungen:

  • log_file auskomentieren, belastet Speicherkarte
  • state_file auskomentieren, nach jedem Einschalten beginnt MPD gleich
  • bind_to_address "localhost" auskommentieren, MPD wird dadurch im Netzwerk verfügbar
  • password "geheim@read,add,control,admin" einkommentieren und Passwort geheim ersetzen
  • default_permissions "read" setzen
  • Audio-Ausgabe für externe USB-Soundkarte konfigurieren:
audio_output {
       type            "alsa"
       name            "My ALSA Device"
       device          "hw:1,0"        # optional für Headphone-Anschluss: "hw:0,0"
       format          "44100:16:2"    # optional
       mixer_device    "default"       # optional
       mixer_control   "PCM"           # optional
       mixer_index     "0"             # optional
}
  • mixer_type "software" einkommentieren

Image erstellen.

Um den UART für den MCU freizugeben wird die Datei

/boot/cmdline.txt

zu:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Konsole auf dem UART durch auskommentieren der letzten Zeile (#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100) mit # in

/etc/inittab

schließen.

Anfangs hatte ich noch Probleme mit dem exzessives Loggen von Fehlermeldungen durch verzögerte Datenpakete an die USB-Soundkarte. Als Folge dessen wurde das System aufgrund überquellender Speicherkarte instabil und langsam. Zunächst habe ich die Fehlermeldung aus dem Log-File exkludiert, aber das Problem war vermutlich eine Folge der Kaskadierung von externem und internem USB-Hub und konnte somit durch den direkten Anschluss der Soundkarte an den USB-Port des Raspberry Pi ursächlich behoben werden.

Einbinden des USB-Sticks über:

/etc/fstab

Der Einhängepunkt wird mittels der Laufwerks ID (hier UUID=0751-8E45) zugewiesen, damit der USB-Stick immer gleichartig eingebunden wird unabhängig von anderen Speichermedien und USB-Ports.

Die ID verrät einem der Befehl:

sudo blkid

Durch das oben nachinstallierte Paket ntfsprogs sind auch NTFS formatierte Datenträger verwendbar.

Beispiel:

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
UUID=0751-8E45	/mnt/usbflash	vfat	auto,users,rw,noatime,sync,gid=pi,uid=pi 	0	  0

Unter

/var/lib/mpd/music

liegt dann ein Link auf:

/mnt/usbflash

Nun noch die Netzwerk-Freigabe mittels Samba-Server auf den USB-Stick erweitern:

An \\RASPBERRYPI\etc\samba\smb.conf folgende Zeilen anbhängen:

[public]
 comment = Public Storage
 path = /mnt/usbflash
 valid users = @users
 force group = users
 create mask = 0660
 directory mask = 0771
 read only = no
receiver.c

Zerlegt die Daten vom MCU und führt die entsprechenden Befehle aus.

Ort: \\RASPBERRYPI\var\skripte

Die Datei (siehe Downloads) wird mit gcc kompiliert und dann als ausführbar markiert:

gcc /var/scripte/quellcodedatei.c -o /var/scripte/exedatei

autostart

Diese Datei bestimmt das (Start-)Verhalten des Window-Managers, hier lxde.

Ort: \\RASPBERRYPI\pi\.config\lxsession\LXDE

@claws-mail 
@gmpc
@xset s off         # don't activate screensaver
@xset -dpms         # disable DPMS (Energy Star) features.
@xset s noblank     # don't blank the video device
.bash_profile

Diese Datei im Home-Verzeichnis des users pi wird beim System-Start ausgeführt und initialisiert mpc, ruft die Software zum Empfang der Befehle vom MCU (receiver) auf und startet dann die grafische Oberfläche. Aber nur wenn man sich lokal und nicht remote via putty o.ä. einloggt! Das Passwort geheim muss zu dem Pasword im mpd.conf passen.

Ort: \\RASPBERRYPI\pi

#!/bin/bash
#
# Autostart
#
#
export MPD_HOST=geheim@localhost

if [ -z "$DISPLAY" ] && [ $(tty) = /dev/tty1 ]; then

# configure sound
mpc -q clear
mpc -q load radio
mpc -q volume 40 

# run in backgorund and avoid measages
nice -1 /var/skripte/receiver &

mpc -q play 1
startx

fi

Wird kein Bildschirm angeschlossen, braucht man keine graphische Oberfläche und

startx

entfällt.

Image erstellen.

Smartphone

Es sind viele vierschiedene Clients zur Steuerung des MPD verfügbar. Ein Auswahl findet sich hier. Wer hier nichts passendes findet, dem kann nicht geholfen werden.

Droid MPD Client

Zur Fernsteuerung via Android-Smartphone verwende ich den Droid MPD Client. Die App wird via Google Play Store installiert und dann wie folgt konfiguriert:

  • Server Adresse: lokale IP des Raspberry Pi angeben, bei meinem Router kann ich für einzelne Geräte eine feste IP per DHCP vergeben.
  • Server Port: bleibt auf 6600, entsprechend default in mpd.conf
  • Server Passwort: wie in mpd.conf angegeben

App ganz schließen und neustarten(!).

MCU

Die Software (siehe Downloads) besteht aus folgenden Teilen:

  • Hauptschleife
    • Setzt Zustände der State-Machines in Befehle, die über den UART gesendet werden, um
    • Steuert die Stromversorgung von Raspberry Pi, Monitor und Audio-Verstärker
  • Interrupt-Routinen
    • RC5 Decoder, ausgelöst durch Timer 0 bei 4,5kHz, jeden 9. Aufruf wird auch der Drehencoder ausgewertet
    • Einlesen der Tasten, ausgelöst durch Timer aus RTC der MCU bei 10Hz
  • Initialisierung der MCU
    • Core Funktionen, hauptsächliche Stromsparfunktionen
    • I/O Pins
    • Interne RTC als 10Hz Taktgeber: 6*10^6/4/128/10
    • UART: 57600 Bit/s Mode 1
    • Watchdog wird abgeschaltet
    • Interrupts freischalten
  • Auswertung Drehencoder
  • RC5 Decoder

Der RC5 Decoder beruht auf einer State-Machine, die schrittweise die einzelnen Bits erkennt und dann in Adresse und Daten zerlegt. Nach der Erkennung eines kompletten Kommandos wird steht rCounter auf dem Wert 12 und das Hauptprogramm beginnt mit der Decodierung (Aufruf "DecodeRemote()").

Die Software kann per #define in Quellcode für LPC922 oder LPC93X kompiliert werden. Die zusätzlichen Funktionsblöcke der LPC93X werden nicht verwendet.

Bei Bedarf könnte ich MCUs programmieren. Alternativ ist der Code sicher leicht auf einen AVR zu portieren.

Elektronik

Die Elektronik gliedert sich in zwei Teile:

  • Leistungsteil
  • Steuerung

Die zweiseitige Leiterplatte kann weitestgehend in SMD aufgebaut werden. Wo möglich wurde die Bauform 1206 verwendet. Große Masseflächen dienen auch zur Verteilung der Wärme.

Die Schaltung und das Layout wurden mit Eagle 6.4 erstellt (siehe Downloads) und der Datei:I-Radio Schaltplan.pdf exportiert.

Der Leistungsteil entspricht im wesentlichen den Applikationsvorschlägen der Hersteller. Um Wechselwirkungen zwischen den einzelnen Komponenten zu reduzieren wurden in den Stromzuführungen PI-Filter mit Feriten und Keramikkondensatoren eingesetzt und die gemeinsame Versorgung über einen größeren schaltfesten Elko abgeblockt. Ein experimentell optimiertes Snubber-Glied an der Freilauf-Diode des LM2676 reduziert hochfrequente Störungen beim Schalten. Die Reste davon werden im Ferrit R6 weiter gedämpft. Der Ausgangskondensator von IC5 darf für die Modelle von National Semiconductor und Texas Instruments nur mit einem Tantal-Elko bestückt werden, da diese bei Keramikkondensatoren am Ausgang durch deren geringe ESR zu Schwingungen neigen. Zur Erhöhung der Betriebssicherheit sind ferner eine Suppressor-Diode und ein Verpolschutz vorgesehen. Die niedrige Standby-Stromaufnahme wird erreicht, indem alle Komponenten außer der MCU abgeschaltet werden können. Der Monitor wird über den "intelligenten" Halbleiterschalter BTS462 bei Bedarf mit 12V versorgt. T1 dient als Ansteuerung des Standby-Pins des Audio-Verstärkers. Auch die 5V-Stromversorgung ist schaltbar ausgelegt. Über Jumper gewählt kann die Steuerung von Verstärker- und Monitor-Stromversorgung auch durch den Raspberry Pi erfolgen. Der Audio-Verstärker enthält am Eingang einen Signal-Abschwächer und mit Tiefpass. Dies dämpft Störungen auf dem Audio-Signal. Die Elkos im Signalweg sind vom Typ Panasonic FC.

Die Steuerung gruppiert sich um eine MCU von NXP der 8051 Serie. Das kärgliche On-Chip der klassischen 8051 hat NXP um 512 Byte aufgebessert, was die Programmierung mit dem SDCC erleichtert. Ein Resonator sorgt für einen genaueren Takt als der interne RC-Oszilator und eine "bequeme, glatte" Frequenz von 6MHz. Die Kommunikation per IR erfordert nur das entsprechende Empfangsmodul. RC-Glieder schützen die MCU vor Störeinstrahlung- und leitung durch die Kabel zu den Drehencodern.

Die notwendigen Masseflächen erfordern eine doppelseitige Platine. Die Masseflächen wurden durch eine Vielzahl von vergrößerten und verteilten Vias verbunden. Die Entstörkondensatoren an den Halbleitern sind mit 1µF recht groß gewählt. Ob die Störfestigkeit unter der gegenüber 100nF reduzierten Resonanzfrequenz der Kondensatoren geringer ist, wurde nicht untersucht. (Es funktioniert.) Ein keramischer 1nF Kondensator hält Störungen vom Reset-Pin der MCU fern.

Die Steuerplatine trägt eine 5*2 polige Pfostenleisten. Die eine dient primär zur Programmierung der MCU, kann aber auch für Erweiterungen mit I2C-Anschluss verwendet werden. Eine weitere stellt die Anschlüsse für Drehencoder und Taster zur Verfügung. Dieser ist durch RC-Glieder entstört.

Die MCU wird mit der kostenlosen Software FlashMagic und einer Schaltung von Keil über RS232 geflasht. Bei der Inbetriebnahme müssen folgende Punkte beachtet werden:

  • Die Kondensatoren auf der Steuerungsplatine müssen schnell genug entladen werden können, damit die MCU beim Start in den Programmiermodus gebracht werden kann. Eine zusätzliche Last von z.B. 100 Ohm über die Betriebsspannung hilft.
  • Es muss keine "echte" RS232 Schnittstelle sein. Ein USB-RS232 Adapter mit FTDI-Chip funktioniert bei mir auch.
  • Die Jumper JP5, JP6 müssen auf Prog gesetzt werden (Pin 2,3).
  • Einstellungen Flash Magic:
    • Select: 89LPC936 oder welche MCU gerade verwendet wird
    • Baud Rate: 7200
    • Interface: None (ISP)
    • Oscillator (MHz): 7,373
    • Erase block used by Hex File
  • Unter ISP, Device Configuration wird die MCU konfiguriert:
    • Statt des internen Oszillators muss ein externer High-Speed Oszillator gewählt werden. Die in FlashMagic einzustellende Frequenz ändert sich dann von 7.373 MHz auf 6 MHz
  • Nach der Programmierung müssen die Jumper JP5, JP6 wieder auf Pi gesetzt werden (Pin 1,2).

Alternativer Leistungsteil ohne Monitor und Verstärker

Werden kein Verstärker integriert und kein Monitor angeschlossen, kann das Internetradio auch direkt mit 5V versorgt werden. Dazu wird direkt auf die Buchsenleiste des Raspberry Pi eine Schaltung mit IR-Empfänger, MCU (hier 89LPC922), LM2950-3,0 und einem IRLML6402 als Leistungsschalter aufgesteckt. Gate des IRLM6402 wird über einen 10k Pull-Up auf 5V gezogen und vom 5-Volt toleranten Open-Source Ausgang Pi_Off des MCU angesteuert. Auf der Platine des Raspberry Pi wird die Eingangssicherung entfernt und die Eingangsspannung wird über ein Kabel auf die Zusatzplatine geführt. Der MOSFET verbindet dann diese mit den +5V auf der Steckerleiste, wenn der Raspberry Pi in Betrieb ist.

USB Komponenten

USB Komponenten erweitern den Raspberry Pi wie folgt:

  • Delock Soundkarte 61645 oder LogiLink Soundkarte UA0053
  • LogiLink UA139 USB 2.0 vierfach Hub (nicht erforderlich mit neuem Raspberry B+)
    • Edimax EW-7811UN oder TP-Link TL-WN821N (falls kein Kabel möglich)
    • 64GB USB Stick für MP3
    • optische Maus (falls gewünscht)

Wichtig ist, dass die Soundkarte direkt und ohne zusätzlichen Hub an einem der USB-Ports des Raspberry Pis hängt. Der Raspberry Pi enthält selbst schon einen Hub. Bei der Kaskadierung gab es z.T. Störungen im Audio-Signal durch verzögerte Datenpakete für die Soundkarte.

EMV bei USB und Raspberry Pi

Die große Anzahl schnell-schaltender Komponenten birgt im Zusammenhang mit empfindlichen Audio-Signalen einige Herausforderungen. In der ersten Version konnte man sehr schön Rechenarbeit, optische Maus, USB-Stick und WLAN hören.

Unter anderem werden die kurzen Stromspitzen der Komponenten vom LM2676 nicht perfekt ausgeregelt. Statt dessen bricht die 5V Betriebsspannung für einige 10µs um 10 bis 30mV ein, was dann auf den Audioausgang der USB-Soundkarte durchschlägt. Nach der Installation des 3300µF/10V Elkos treten diese Störungen nicht mehr auf. Er sollte wegen der längeren Zuleitung nicht auf die Schaltregler-Platine wandern.

Darauf hin habe ich sowohl meine eigene Platine (sieh oben) als auch die gekauften Komponenten modifiziert:

  • Raspberry Pi: Parallel zu C6 ein Elko Panasonic FR 3300µF/10V (wichtig)
  • USB-Hub: Einbau 3x Elko Panasonic FR 220µF/16V, mehrer Keramik-Kondensatoren 1µ/25V X7R

I-Radio USB-Hub.jpg

  • USB-Soundkarte: Erweiterung des LC-Gliedes zur Filterung der Versorgungsspannung zum PI-Glied mit 2* 1µ/25V X7R und 2* 10nF/50V NP0

I-Radio Sound Front.jpg I-Radio Sound Back.jpg

Grundsätzlich sind die langen Wege durch die externe Soundkarte kritisch zu sehen, jedoch bietet der Raspberry Pi leider weder einen brauchbaren internen Audio-Ausgang noch einen internen USB-Anschluss.

Downloads

Datei:Raspberry Pi Software.zip C-Quellcode für Übernahme der Daten vom MCU auf den Raspberry Pi

Datei:MCU Software.zip C-Quellcode und HEX-Files für MCU in den Varianten 89LPC922 und 89LPC93X

Datei:Platine.zip Eagle 7.0 Layouts in den Varianten 89LPC922 (TSSOP, in production und DIP, obsolete) und 89LPC93X (PLCC, obsolete)

Siehe auch