Audioquelle für AM-Modulatoren
Fertiges Gerät
Spezifikation
Die Audioquelle benötigt eine Stromversorgung 5 V/3ADC und gibt das Audiosignal über 2 Cinch-Buchsen aus. Voreingestellt ist ein Mono-Signal.
Benutzer-Interface
Die Menuesteuerung erfolgt über zwei Tasten vor/zurück. Mit einfachen Klicks navigiert der Nutzer durch das Programm-Menue. Die Tastenaktion und das aktuelle ausgewählte Objekt sind im Display verfolgbar.
Eine im Display angezeigte Auswahl von streams und Ordnern kann durch einen kurzen Klick durchgeblättert werden, die Anzeige (1/5 ... 5/5) wechselt die Stationsnummer entsprechend, wenn vor oder zurück gedrückt wird. Wird von der ersten Station zurück oder von der letzten vor geblättert, wechselt die Anzeige von "Radio" zu "Ordner" und zeigt den Ordnernamen an.
Mit einen langen Klick (halten, push) kann eine Auswahl ausgeführt werden
Die Anzeige springt dann von "Wähle" auf "Live", zeigt den laufenden Stream an und spielt die ausgewählte Quelle ab.
Für den ausgewählten Ordner sieht die Anzeige analog aus und zeigt an, dass die dort enthaltenen mp3-Dateien im Loop abgespielt werden:
Die Ausführung kann durch einen einfachen Klick abgebrochen werden. Das Display zeigt dann wieder die Auswahlmöglichkeiten an.
Das Gerät kann das interne LAN- oder WLAN-Netz nutzen. Kommt eine Netzverbindung nicht zustande, sollen die Ordner weiter genutzt werden können. Netz-streaming soll möglich sein, wenn kein USB-stick gesteckt ist.
Kommt es zu keiner Internet-Verbindung oder bricht diese im Betrieb ab, führt dieser Fehler nicht zum Programmabbruch. Der Fehlerzustand wird dann im Display gezeigt.
Sobald die Verbindung wieder da ist, kann eine ausgewählte Option wieder abgespielt werden.
Ist kein Stick gesteckt, wird die Fehlermeldung "kein Netz/Offline" ausgegeben. Streaming ist dann noch möglich, sofern die (W)LAN-Verbindung besteht.
Die Internetstreams werden zur Anpassung an den AM-Modulator durch ein Filter in ihrer Bandbreite begrenzt. Die historischen Tondokumente aus den Ordnern werden ungefiltert wiedergegeben.
Hardware
Genutzt wird ein Raspberry Pi4B mit LAN, WLAN-Anschluß.
DAC-Wandler
Als DAC wird der HifiBerry Pi Zero+ DAC genutzt, der ein Stereosignal mit hoher Qualität ausgibt und auf die Pin-Leiste aufgesteckt wird. Die Platine muss bei einigem Gegendruck vollständig auf die Pinleiste aufgedrückt werden. HiFiBerry DAC+ Zero nutzt die I2C-Pins auf dem GPIO-Header.
Der korrekte Treiber für diesen DAC heisst hifiberry-dac, wie auf der Platine aufgedruckt. Damit diese Karte richtig angesprochen wird, soll in der config.txt nur der Eintrag dtoverlay=hifiberry-dac enthalten sein, keine anderen Treiber. Außerdem muss der interne Sound des PI4B abgeschaltet werden. Dazu kommentiert man in der config.txt den entsprechenden Eintrag aus: #dtparam=audio=on oder löscht ihn. Der DAC-Treiber ist im Kernel des PI OS bereits enthalten. Durch den dtoverlay-Eintrag lädt das Pi OS beim Starten das Overlay aus dem /boot/-Ordner und aktiviert das passende Sound-Modul aus /lib/modules/. Da der DAC selber keinen Lautstärkesteller besitzt, muss dies per software gemacht werden. Die Lautstärke wird im Aufruf des players mpv als Festwert mitgegeben.
LCD-Display
Als Display kommt ein 20x4 LCD mit i2C backpack zum Einsatz. Der Jumper für die Hintergrundbeleuchtung muss gesetzt sein. Zur Kontrasteinstellung befindet sich ein Potentiometer auf dem I2C-backpack. Die 4 Anschlußpins sind auf der Platine beschriftet und entsprechend mit der Pinleiste des Pi4B zu verbinden.Auch das Display nutzt die I2C-Pins auf dem GPIO-Header. Es kommt aber nicht zum Konflikt, da die I2C-Kommunikation adressbasiert ist.
Die Verdrahtung wird wie folgt vorgenommen:
LCD GND -> Pi Pin 14 (GND - violett)
LCD VCC -> Pi Pin 2 (5V - grau) -> Aktiviert rote Power-LED am I2C-Modul
LCD SDA -> Pi Pin 3 (SDA - blau)
LCD SCL -> Pi Pin 5 (SCL - grün)
Für die Navigation werden 2 Taster eingesetzt, die auf der Frontplatte positioniert sind. Die Taster sind wie folgt zu verbinden (Lötpunkte auf der DAC-Platine):
Taster NEXT -> Pi GPIO 17 / Pin 11 (grün) -> Schaltet gegen GND (Pin 6)
Taster PREV -> Pi GPIO 27 / Pin 13 (orange) -> Schaltet gegen GND (Pin 6)
Entprellung und Initialisierung wird softwareseitig realisiert.
Montage und Verdrahtung
Bibliotheken und Installationen
1. Reine Systempakete über apt installieren:
sudo apt update
sudo apt install -y mpv python3-pip i2c-tools>
2. Die I2C-Schnittstelle muß in raspi-config auf "YES" stehen. Ggf. mit sudo raspi-config -> "3 Interface Options" -> "I5 I2C" auf "Yes" setzen.
3. Mit sudo i2cdetect -y 1 kann die Verbindung zum Display geprüft werden. Im Terminal wird eine Tabelle ausgegeben, in der die Zahl "27" für die I2C-Adresse des Displays erscheint.
4. Lokalen Projektordner anlegen
mkdir -p /home/[raspberry name]/[folder name]
cd /home/[raspberry name]/am-audioplayer
Das script hier als "[name].py" in diesen Ordner speichern
5. Virtuelle Umgebung my-venv einrichten, um die Bibliotheken RPLCD, gpiozero und smbus2 konfliktfrei installieren zu können.
python3 -m venv --system-site-packages my-env
6. Bibliotheken isoliert in die my-venv-Umgebung installieren:
./my-env/bin/pip install RPLCD gpiozero smbus2
Für die LCD mit dem PCF8574 als backpack wird die Lib RPLCD genutzt.
RPLCD.i2C enthält CharLCD (kompatibel mit Adafruit RGB backlight negative LCD 20x4 (HD44780 Display), siehe https://docs.circuitpython.org/projects/charlcd/en/latest/
Das LCD kommuniziert mittels dem Expander-Chip PCF8574 und über die Adresse 0x27 mit dem I2C-Bus. Dazu ist die Bibliothek smbus2 erforderlich.
Für die Tastenaktionen ist Button aus der Bibliothek gpiozero erforderlich.
import os import socket import subprocess import time import math from gpiozero import Button from signal import pause from RPLCD.i2c import CharLCD6. Manueller Programmstart
/home/[raspberry name]/[folder name]/my-env/bin/python3 [name].py
DESIGN
Das Programm ist in Python3 geschrieben und auf GITHUB
zu finden.
Das LCD wird erkannt mit:
lcd = CharLCD(i2c_expander='PCF8574', address=0x27, port=1, cols=20, rows=4)Zunächst werden unter STATIONS die gewünschten streams und die Ordnerstruktur für die auf dem Stick liegenden MP3-Ordner eingetragen:
STATIONS = [
{"type": "radio", "name": "Deutschlandfunk", "url": "https://st01.sslstream.dlf.de/dlf/01/128/mp3/stream.mp3?aggregator=web"},
{"type": "radio", "name": "SWR 3 Kultur", "url": "https://liveradio.swr.de/sw282p3/swr3/play.mp3"},
{"type": "radio", "name": "WDR 4", "url": "https://wdr-wdr4-live.icecastssl.wdr.de/wdr/wdr4/live/mp3/128/stream.mp3"},
{"type": "radio", "name": "SRG Swiss Classic", "url": "https://stream.srg-ssr.ch/srgssr/rsc_de/mp3/128"},
{"type": "radio", "name": "BR Radio Klassik", "url": "https://dispatcher.rndfnk.com/br/brklassik/live/mp3/mid"},
# Die 4 USB-Themenunterordner für den Benutzer 'pi4b'
{"type": "Folder", "name": "Berlin", "url": "/media/pi4b/AUDIO/Berlin"},
{"type": "Folder", "name": "BBC", "url": "/media/pi4b/AUDIO/BBC"},
{"type": "Folder", "name": "Luxemburg", "url": "/media/pi4b/AUDIO/Luxemburg"},
{"type": "Folder", "name": "Hilversum", "url": "/media/pi4b/AUDIO/Hilversum"}
]
Diese Liste kann nach Bedarf geändert oder erweitert werden. Die Pfadnamen /media/pi4b(AUDIO/ sind in jedem Fall anzupassen. In dem Beispiel-Pfad ist "AUDIO" der Name des USB-Sticks. Groß/Kleinschreibung beachten! Wie man erkennen kann, handelt es sich bei den Ordnernamen um frühere Großsender für AM. Sie enthalten historische Aufnahmen dieser Sender.
Dann werden die benötigten Funktionen in der Klasse AMModulatorSource definiert:class AMMOdulatorSource def_handle_klick #Tastennavigation def_handle_halten #Tastennavigation def_show_selection #Display-Darstellung def_update_display #Display-Darstellung def_is_network_connected #Netzwerk def_start_playback #Audioausgabe mpv def_stop_playback #Audioausgabe mpvDie Filterung wird beim Aufruf des players mpv als Liste mitgeben:
"mpv --no-video --audio-channels=mono --af=highpass=f=200,lowpass=f=4000 '" + item["url"] + "'"Die AM-Bandbreite für streams wird damit begrenzt auf ein Frequenzspektrum zwischen 200 Hertz und 4 kHz. Die Werte können angepasst werden.
Die Audioausgabe ist in der Lautstärke per Softwareparameter volume_percent einstellbar. Voreingestellt sind 40% entsprechend -24 dB, der Wert kann auf den Modulatoreingang angepasst werden:
def __init__(self):Im Hauptprogramm wird die Instanz Source erzeugt und die Buttons initialisiert.
self.volume_percent = 40
Das Programm kann am Terminal gestartet werden. Für Testzwecke wird die Ausgabe ins Terminal geleitet:
print(f"DEBUG: Starte MPV mit Befehl: {cmd_string}")
# Keine Stummschaltung, damit wir im Terminal alles sehen
subprocess.Popen(cmd_string, shell=True)
Die Ausgabe kann im Produktivbetrieb unterdrückt werden mit:stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULLKommt es beim Testen zu einem Abbruch, sollte das Programm im Terminal mit Ctrl+c abgebrochen werden, andernfalls kann es beim Neustart zu einem Pin-Konflikt kommen. Beim Regulären Beenden des Programms werden die Ressourcen freigegeben. Für den mobilen Betrieb ist eine Ausführung im Hintergrund empfehlenswert.
Source
Das lauffähige Script AMModulatorSource.py ist über den link auf GITHUB zu finden. Eine Kurzdokumentation ist im script selbst enthalten.