Drahtfunk

Wer die Superhit-Endlosschleifen der einschlägigen Rundfunksender leid ist, hat vielleicht schon einen MP3-Streaming-Server aufgesetzt, um dezentral eigenen Musikkonserven lauschen zu können. Doch ein kompletter PC ist völlig unterfordert, wenn es nur darum geht, ein vorhandenes Audio-Signal irgendwo ins Netz zu speisen. Unser MP3-Streaming-Encoder erledigt dies völlig autark mit minimalem Hardware- und Energieaufwand. Einen passenden Empfänger liefert unser Projekt gleich mit dazu.

In Pocket speichern vorlesen Druckansicht 52 Kommentare lesen
Lesezeit: 15 Min.
Von
  • Prof. Dr. Francesco P. Volpe
  • Bernd Wegmann
Inhaltsverzeichnis

Lösungen, einen Computer als Musik-Zentrale, Player oder als Streaming-Encoder einzusetzen, gibt es inzwischen für jedes Betriebssystem und jede Anforderung. Will man lediglich ein vorhandenes Musiksignal in einen MP3-Stream umsetzen, etwa um den örtlichen Radioempfang oder ein Live-Event ins (private) LAN zu stellen, ist ein extra dafür abgestellter, dauerlaufender und stromfressender PC nicht die glücklichste Wahl. Ein kleines, eigenständiges Encoder/Decoder-Pärchen mit dem Stromverbrauch einer Backofenlampe und dem Platzbedarf eines Taschenbuchs kommt dem Wunsch der Netzwerk-Musikübertragung deutlich näher und scheitert nicht am WAF (Woman Acceptance Factor).

Die Idee hinter diesem Projekt ist eine kleine und kostengünstige Lösung zum Kodieren und Dekodieren von Audio-Signalen aller Art. Dabei soll ein „Broadcaster“ (Sender) Musik in Echtzeit in MP3 umwandeln und über ein Netzwerk senden. Die angeschlossenen Clients (Empfänger) haben die Aufgabe, diesen MP3- zu dekodieren und wiederzugeben. Die Clients lassen sich im gesamten Haus verteilen und geben alle den gleichen MP3- wieder. Als Musikquelle können CD-Player, Fernseher oder Radio dienen - selbst ein Mikrofon für Durchsagen wäre denkbar. Zusätzlich zum analogen Eingang haben wir noch einen SPDIF-Eingang für Digital-Audio vorgesehen.

Wer will, kann die Encoder- oder Decoder-Aufgabe natürlich auch alternativ einem PC überlassen, so dass eine ausgesprochen flexible Lösung entsteht. Und schließlich ist man auch nicht auf eine fest verlegte Ethernet-Verkabelung angewiesen, eine Übertragung per Funk oder per Stromnetz ist mit geeigneten Umsetzern (WLAN-Router, Powerline-Modem) ebenso möglich. Zur Integration der vorgestellten Lösung in ein heimisches PC-Netzwerk lässt sie sich beispielsweise mit dem kostenlosen Programm VLC des Open-Source-Projekts VideoLAN (Downloads siehe Soft-Link) als MP3-ing-Server und dem MP3-Player der Firma Audioactive kombinieren; dazu später.

Unser „Embedded“-Projekt ließ sich erst mit aktuellen Bautei-len preiswert und überschaubar realisieren. Darunter sind die pfiffigen Lantronix-XPort-Transceiver, die in unscheinbaren RJ-45-Buchsen die komplette Sende-/Empfangselektronik nebst Mini-Webserver für Twisted-Pair-Ethernet integrieren. Natürlich gehört auch ein kompletter MP3-Einchip-Encoder/Decoder dazu, der von Micronas gefertigte MAS3587F. Länger bekannt dürfte der eingesetzte RISC-Microcontroller sein, ein PIC16F877 von Microchip; PICs werden wegen ihrer preiswerten Entwicklungswerkzeuge besonders gern für Selbstbauprojekte verwendet.

Für das MP3-Broadcasting ist ein einfaches Netzwerkprotokoll wie das User Datagram Protocol (UDP) das Mittel der Wahl, da es nur einen sehr kleinen Header aufweist; demzufolge ist der Verwaltungsaufwand seitens des Controllers gering. Im Header müssen lediglich Source Port, Destination Port, Länge und Prüfsumme eines Pakets angegeben werden. Zur Vereinfachung kann die Prüfsumme sogar entfallen. UDP sieht im Falle von Paketverlusten keine Wiederholung dieser Pakete vor - das hat in der hier beschriebenen Anwendung auch keinen Sinn, da alle Clients wie Radioempfänger dem gleichen Musik- lauschen. Eine Störung muss ein Client genauso hinnehmen wie ein radiohörender Autofahrer, der in einen Tunnel fährt. Der gesicherte Paket-Transport, wie ihn TCP vorsieht, scheitert an der Echtzeit-MP3-Codierung, die XPort-Bausteine wären sehr wohl dazu in der Lage. Als Erweiterung wäre es denkbar, dass mehrere „Broadcaster“ im selben Netzwerk an unterschiedliche Destination Ports senden. Die Clients könnten sich dann über die Port-Nummer auf den gewünschten Musikkanal schalten.

Der MP3-ing-Server bezieht seine Musik direkt von einer Audio-Quelle wie CD-Player, Radio oder Fernseher in unkomprimierter Form. Dabei stehen ihm zwei Eingänge zur Verfügung: An dem ersten kann ein analoges Stereo-Signal über einen 3,5-mm-Klinkenstecker, am zweiten ein digitales S/PDIF-Signal über einen optischen „TOSLink“-Eingang (wie man ihn auch an neuzeitlichen Receivern und CD-Playern findet) zugeführt werden. Die Auswahl der Signalquelle erfolgt über den Jumper JP1.

Neben dem klassischen Netzwerk mit CAT-Verkabelung haben wir die Übertragung der MP3-Audio-s erfolgreich auch im WLAN ausprobiert. Dazu genügt es, den MP3-Streaming-Server an einen WLAN-Access-Point anzuschließen, der dann die MP3-Konserven in den Äther funkt. Wer in seinem Haus oder Wohnung keine CAT-Verkabelung hat und die Wände nicht aufschlitzen möchte, kann alternativ seine digitalen Audio-Daten über das 230-V-Stromnetz mit Hilfe von Powerline-Modems (z. B. von Netgear oder Asus) von Steckdose zu Steckdose verteilen. Natürlich lassen sich alle diese Möglichkeiten miteinander kombinieren, sodass für jeden Anwendungsfall das günstige Medium gewählt werden kann. Selbst die Integration in ein heterogenes PC-Netzwerk ist ohne weiteres möglich. Im einfachsten Fall, der direkten Point-to-Point-Verbindung von Sender und Empfänger, muss natürlich ein gekreuztes Patch-Kabel verwendet werden.

Der MP3-Stream-Decoder wurde bewusst so entworfen, dass einige Bauteile aus unserem (inzwischen obsoleten) Projekt „Mucken statt Drucken - MP3-Decoder am Druckerport“ [1] recycelt werden können: Der Micronas MAS3507D nebst D/A-Wandler CS4331 von Cirrus. Der MAS3507D ist ab Lager noch in begrenzter Stückzahl verfügbar, wurde aber seitens des Herstellers für Mitte des Jahres abgekündigt. Bei ausreichendem Interesse will die Firma Segor einen preiswerten Ersatz mit dafür angepasster Platine beschaffen.

Der Hardware-Aufbau des Empfängers gestaltet sich recht einfach. Die Platine (Layout siehe Soft-Link, geliefert von eMedia und Segor) ist einseitig gehalten, was das Selberätzen möglich, aber den Einbau von Drahtbrücken (0-Ohm-„Widerstände“ R21 und R22) erforderlich macht. Vorsicht ist beim Einlöten des Digital/Analog-Wandlers CS4331 geboten, da dieser im winzigen achtpoligen SO-Gehäuse geliefert wird. Ein handelsübliches Steckernetzteil mit 8 bis 12 V und mindestens 300 mA stellt die Stromversorgung sicher. Zwei auf der Platine montierte Festspannungsregler erzeugen daraus 5 V und 3,3 V; bei Eingangsspannungen ab 9 V ist ein Kühlkörper (gemeinsamer kleiner Alu-Winkel oder dgl.) erforderlich. Die Pegelanpassung zwischen den 5-V-Bauteilen wie PIC16F877 und MAX232 einerseits und den 3,3-V-Bauteilen wie XPort und MP3-Decoder MAS3507D andererseits erfolgt sehr einfach über Widerstands-Spannungsteiler.

Der speziell programmierte Mikrocontroller PIC16F877 (ebenfalls eMedia) übernimmt die Steuerung der Schaltung: Er konfiguriert den MP3-Decoder MAS3507D über seinen I2C-Bus, holt die Daten seriell asynchron mit Hardware-Handshake vom XPort ab und bereitet sie für den MAS3507D seriell synchron (SPI-Bus) auf. Den dekodierten digitalen I2C-Datenstrom wandelt wiederum der Digital-/Analog-Wandler CS4331 in analoge Audio-Signale. Im Betrieb müssen die zwei Jumper so gesetzt werden, dass der XPort mit dem PIC16F877 verbunden ist. Möchte man den XPort-Transceiver alternativ mit einem Terminalprogramm konfigurieren, stellt man mit diesen Jumpern eine Verbindung zum MAX232 her; für diesen Zweck ist auf der Platine eine 9polige D-Sub-Buchse vorgesehen. In dieser Betriebsart verhält sich die Schaltung wie unsere Ethernet-RS-232-Brücke aus [2]. Eine ruhige Löthand verlangt lediglich die Bestückung des D/A-Wandlers CS4331 auf der Lötseite der Platine. Für die Widerstände sind die Rastermaße 7,5 und 10 mm vorgesehen, die mit dem engeren Abstand bestückt man am besten mit einer 1/10-Watt-Miniaturausführung.

Beim Aufbau des MP3-Servers muss man trotz einseitiger Platine etwas mehr Sorgfalt walten lassen, da der hochintegrierte MP3-Encoder-Chip (ein kompletter Signalprozessor mit diverser Peripherie) nur in einem QFP-64-Fine-Pitch-Gehäuse lieferbar ist. Der Abstand der Beinchen beträgt hier gerade mal 0,5 mm. Dieser Chip muss mit größter Vorsicht auf die Unterseite des Boards gelötet werden, was wir nur erfahrenen SMD-Bastlern raten können; bei segor wird es deshalb eine mit diesem Bauteil vorbestückte Platine geben. Neben 5 und 3,3 V benötigt der Encoder-Chip noch eine 3,6V-Versorgung. Diese wird unkonventionell über zwei Dioden-Strecken aus der 5-V-Spannung gewonnen. Auch die Encoder-Schaltung verwendet einen PIC16F877, allerdings mit anderer Firmware - bitte nicht verwechseln!

Auf der Encoder-Platine ist ein Reset-Generator-IC vom Typ MCP120 vorgesehen, der alternativ (!) zum Reset-Kondensator C27 eingesetzt werden kann; mit ihm ist man auch gegen eine kurz absinkende Versorgungsspannung (Brown-Out) gefeit. Bei geringeren Zuverlässigkeits-Anforderungen genügt auch das RC-Glied R9/C27 (bzw. R8/C16 auf der Decoder-Platine). Bei Reset-Problemen (z. B. bei sich nur langsam aufbauender Versorgungsspannung) kann man den Wert des Widerstands R9 (bzw. R8) ohne weiteres auf 33 kOhm erhöhen.

Die Wahl der Audio-Quelle erfolgt über eine Steckbrücke am „/Digital“-Eingang des PIC16F877 (Pin 1 und 2 im Jumper-Feld JP1). Ist der Jumper gesteckt, wird nach dem Einschalten der Digitaleingang gewählt. Der Jumper „Quality“ entscheidet über die Bitrate, mit der komprimiert werden. Dabei stehen zwei Qualitäten (siehe Kasten „Stellwerk”) zur Auswahl. Über den I2C-Bus erledigt der PIC16F877 die umfangreiche Konfiguration des MAS3587F. Die komprimierten Daten holt der Mikrocontroller über seinen Parallel-Slave-Port vom Encoder-Chip ab, wobei das Timing des MAS3587F genau einzuhalten ist. Dieser liefert die MP3-Daten in Paketen von 30 Bytes, die der PIC16F877 dem XPort über eine serielle asynchrone Schnittstelle mit 230 400 Baud und Hardware-Handshaking anliefert.

Sowohl der MP3-Streaming-Server (Encoder) als auch der Client (Decoder) bedienen sich jeweils eines XPort-Bausteins als Netzwerk-Interface. Beide XPorts müssen bei der ersten Inbetriebnahme mit einer IP-Adresse konfiguriert werden; das Verfahren ist in [2] ausführlich beschrieben. Auf Encoder-Seite wird der serielle Port (RS-232) auf die Parameter 230 400 Bit/s, 8 Datenbits, keine Parität, ein Stoppbit und Handshake mit CTS/RTS eingestellt. Das UDP muss per Enable eingeschaltet und der Typ „01“ gewählt werden. Als „Remote IP Address“ wird eine freie Broadcast-Adresse im eigenen Netzwerk angegeben, zum Beispiel 192.168.0.255, als Remote Port etwa 2020. Da der XPort-Baustein für das Senden und Empfangen von Daten-Paketen lediglich einen kleinen Puffer hat, muss man dafür sorgen, dass der Server auch nur kleine Pakete verschickt. Dies geschieht im Abschnitt „Packing Algorithm“, der mit „Enable“ eingeschaltet wird. Ein im Buffer des XPort aufgelaufenes Datenpaket muss spätestens mit dem Eintreffen des nächsten auf die Reise geschickt werden. Dazu trägt man als „Send Character“ 01 und 02 die Werte „FF“ und „FA“ ein, den Beginn eines MP3-Frames. Mittels „Idle Time“ zwingt man den XPort dazu, spätestens nach 250 ms sein letzterhaltenes Datenpaket zu senden, falls überraschenderweise keine MP3-Daten mehr eintreffen.

Die Einstellung des XPort als Client ist etwas einfacher: Der serielle Port wird wie beim Server eingestellt und als Protokoll ebenfalls UDP gewählt, „Remote IP Address“ und „Remote Port“ bleiben dagegen leer. Der „Remote Port“ des Servers wird beim Client als „Local Port“ eingestellt; das stellt sicher, dass der Client sich automatisch auf den Port des Servers schaltet. Ein „Packing Algorithm“ ist beim Client nicht erforderlich.

Wie eingangs erwähnt, ist es auch möglich, mit einem PC seine Musik-MP3s zu streamen und diese mit den MP3-Clients wieder abzuspielen. Dazu ist das kostenlose und für so gut wie alle Betriebssysteme kompilierte Programm „VLC media player“ [3] bestens geeignet. Aufgrund der relativ kleinen Puffer des XPorts muss VLC entsprechend konfiguriert werden:

Im Fenster „Stream-Ausgabe“ wählt man UDP an und gibt die Zieladresse und -Port ein. Anschließend muss man kurz RTP anklicken und wieder auf UDP wechseln. Nur so wird die Wahl der Verkapselungsmethode freigegeben (wahrscheinlich ein kleiner Softwarefehler in VLC). Hier muss RAW gewählt werden. Als Audiocodec gibt man MP3 mit 128 kBit/s und 2 Kanälen an und bestätigt das Ganze mit OK. Anschließend wechselt man in das Menü „Einstellungen“ und klickt „Erweiterte Optionen“ an. Im linken Verzeichnisbaum sucht man in Module erst „sout access“ und dann „access_output_udp“. Nun kann man rechts im Fenster „Roh schreiben“ auswählen.

In der anderen Richtung, mit dem MP3-Encoder-Board auf der einen und dem PC auf der anderen Seite, können wir Ihnen sogar zwei Lösungen anbieten: Das Winamp-UDP-Plugin der russischen Firma PIT Engineering und den ebenfalls kostenlosen MP3-Netzwerk-Player der Firma Audioactive. Bei Letzterem handelt es sich um einen simplen MP3-Player ohne unnötigen Schnickschnack, der sowohl MP3-Dateien als auch MP3-Streams abspielen kann. Als Quelle wird zum Beispiel über udps://193.174.127.255:2020 die IP- und Portadresse des Streaming-Servers angegeben. Interessant ist auch ein anderes Utility aus gleichem Hause, der Audioactive Recorder. Das Programm speichert einen empfangenen MP3-Stream wieder als Datei auf der Festplatte ab. Angesichts der stringenten Rechtslage bei kopiergeschützten „Un-CDs“ dürfen Sie das Programm nur bei der Aufnahme von CDs ohne Kopierschutz anwenden, wenn der Encoder sein Audio-Signal über den Digitaleingang empfängt; das Kopierschutz-Bit lässt sich ja nicht MP3-kodieren.

[1] Althoff/Kemper/Santo/Schwatke/Verse, Mucken statt drucken, MP3-Decoder am Druckerport, (Teil 1) und (Teil 2)

[2] Benjamin Benz, Thorsten Thiele, Brücken bauen, Umsetzer von Ethernet nach RS-232 im Eigenbau, c't 13/04, S. 200

[3] Video, Sound und mehr, Software-Kollektion: Multimedia-Programme, c't 9/03, S. 166

[4] Datenblätter MAS3507D und MAS3587F

[5] Datenblatt PIC16F877

[6] Datenblatt CS4331

http://ct.de/0508184

Der Jumper JP1 „Quality“ des Encoders entscheidet über die per Firmware voreingestellte Bitrate der MP3-Kodierung. Dabei bedeutet eine gesteckte Brücke, dass das Audio-Signal mit der höheren Bitrate und Qualität (laut Datenblatt MAS3587F) kodiert wird, durchschnittlich 160 kBit/s bei 44,1 kHz Abtastrate (VBR). Lässt man diese Brücke offen, wird mit der niedrigeren Bitrate encodiert, in diesem Fall 120 kBit/s bei 44,1 kHz Abtastrate. Der MP3-Encoder MAS3587F lässt hierfür im Register „Encoder Control“ die Werte 0 bis 7 zu, wobei 7 der Einstellung 170 kBit/s entspricht. Diese Einstellungen lassen sich nötigenfalls im Sourcecode des PIC-Programms (siehe Soft-Link) an die eigenen Wünsche anpassen (siehe dazu Tabelle 3-13 im Datenblatt des MAS3587F). Über die JP1-Brücke „Digital“ wählt man den optischen Eingang als Audio-Quelle aus. Ist die Brücke nicht gesteckt, wird ein analoges Audio-Signal an der 3,5mm-Klickenbuchse erwartet. Beide Einstellungen werden nur nach einem Reset des Mikrocontrollers wirksam.

Die Anschaltung des XPort an die serielle Schnittstelle zur Konfiguration oder an den PIC erfolgt über den Stecker JP2. Im normalen Betrieb ist der XPort am PIC angeschlossen. Da beim Streamer nur Daten vom PIC zum XPort gesendet werden, wäre eigentlich ein Jumper ausreichend. Beim Client gilt für die XPort-Anschaltung das Gleiche, nur das Jumperfeld sieht hier etwas anders aus.

Stückliste Empfänger/Decoder
Bauteil Wert
IC1 CS4331
IC2 MAS3507D (siehe Text)
IC3 PIC16F877P
IC4 LF33
IC5 7805
IC6 MAX232
IC7 XPORT XP1001000
D1 1N4004
C1 220µ 25V
C2-C7,C16,C20 100n ker. 2,5mm
C8,C9 10µ 35V
C10-C12,C19 1µ5 oder 2µ2 35V
C13 22µ 16 V
C14,C15 680p ker. 2,5mm
C17,C18 18p ker. 2,5mm
L1 100µH Min. Drossel
Q1 Quarz 18,432 MHz
Q2 Oszillator 14.7456 MHz
R1, R3-R8 10k
R9,R10 4k7
R11,R12 2k2
R13,R14 56k
R2, R15-R19 15k
R21,R22 0R (Brücke)
BU1 Koax-Stromversorgungsbuchse
SUB1 D-Sub-Buchse 9pol. W
SV1 Jumperblock 2x4
X1 Klinkenbuchse PG203J
Stückliste Sender/Encoder
Bauteil Wert
IC1 MAS3587F
IC2 PIC16F877P
IC3 7805
IC4 LF33
IC5 MCP120 (siehe Text)
IC6 MAX232
IC7 TORX178B
IC8 XPORT XP1001000
D1-D3 1N4004
L1-L3 4,7µH Min. Drossel
Q1-Q2 Quarz 18,432 MHz
C1 220µF 25V
C2-C4,C9-C13,C27,C31,C32 100n ker. 2,5mm
C5,C8 18p ker. 2,5mm
C14 22µ 16 V
C15,C30 10n ker. 2,5mm
C16 220p ker. 2,5mm
C17,C18 1n ker. 2,5mm
C19-C21,C24-C26 1µ5 oder 2µ2 35V
C22 3µ3 35V
C23 3n3 ker. 2,5mm
C28,C29 470p
R1, R5, R6, R9, R11, R17, R20, R21, R23 10k
R2,R18,R22 15k
R3,R12 470
R4,R10 4K7
R8,R13-R19 0R (Brücke)
JP1 Jumper 2x2
JP2 Jumper 2x3
BU1 Koax-Stromversorgungsbuchse
SUB1 D-Sub-Buchse 9pol. W
X1 Klinkenbuchse PG203J

(cm)