Raspberry Pi YAIR (Yet Another Internet Radio)
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
- Innenansicht
alte Platinen-Version, ohne Zusatz-Kondensator über C6 der Raspberry Pi
- Im Einsatz in der Küche
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
- USB-Soundkarte: Erweiterung des LC-Gliedes zur Filterung der Versorgungsspannung zum PI-Glied mit 2* 1µ/25V X7R und 2* 10nF/50V NP0
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
- Raspberry-Webradio
- Diskussion zu diesem Projekt: TBA