Radiobasteln
Hier geht es nicht wie man vielleicht vermuten könnte um die Baubeschreibung für ein klassisches Radio mit Schwingkreisen, Drehkondensatoren und NF Demodulatoren. Im Mittelpunkt steht vielmehr ein kleines UKW Empfangsmodul, das mit einem Chip vom Typ RDA5807 bestückt ist. Es beherbergt einen kompletten PLL Synthesizer FM Stereo Tuner mit überraschend guter Klangqualität und hoher Empfangsempfindlichkeit. Die Audio Ausgänge sind mit 32Ω belastbar. Wenn man herkömmliche Lautsprecher über 27Ω Vorwiderstände anschließt, erhält man schon eine brauchbare Zimmerlautstärke. Man muss also nicht unbedingt einen Leistungsverstärker nachschalten.
Solche Module werden im Internet ab ca. 1€ pro Stück angeboten. Um dem Radio Töne zu entlocken, muss man es über die eingebaute I2C (Inter-Integrated Circuit) Schnittstelle ansteuern. Das lässt sich gut mit einem Mikrocontroller bewerkstelligen. Die Erstellung der Firmware war nicht ganz trivial, zumal das englische RDA5807 Datenblatt Lücken bei der Registerbeschreibung aufweist und das ausführlichere Programming Manual z. T. in chinesischer Sprache verfasst ist!
Die Ansteuerung kann je nach verwendeter I2C Adresse in 3 verschiedenen Modi erfolgen:
- Adresse 0x60: TEA5767 Modus (veraltet)
- Adresse 0x10: Modus mit sequenziellem Registerzugriff
- Adresse 0x11: Modus mit wahlfreiem Registerzugriff
Den TEA5767 Modus habe ich zwar auch erprobt, aber die nachfolgenden Ausführungen beziehen sich auf die Betriebsart mit sequenziellem Registerzugriff, die deutlich mehr Funktionen bietet. Es stehen insgesamt 6 Write-Register (ab Adresse 02) und 6 Read-Register (ab Adresse 0A) zur Verfügung. Jedes dieser Register besteht aus 2 Byte. Beim Beschreiben wird zuerst das High Byte, dann das Low Byte erwartet. Es müssen nicht alle Register befüllt werden. I. d. R. reicht es, die 4 Register R02 - R05 mit insgesamt 8 Byte zu initialisieren und dann den I2C Bus wieder freizugeben.
Die RDA5807 Konfiguration erfolgt hier in 2 Stufen:
- Nach dem Anlegen der Speisespannung überbrückt eine Warteschleife von 600ms den gleichzeitig stattfindenden RDA5807 Hardware Reset.
- Danach sendet man eine Bytefolge, bei der in R02 die Grundkonfiguration festgelegt wird, und setzt das Enable Bit. In Register 03 definiert man die Empfangsfrequenz durch Beschreiben der 10 “CHAN“ Bits (Empfangskanal) und setzt noch das “Tune“ Bit.
Die Herleitung der CHAN Bits zur gewünschten Empfangsfrequenz soll an einem Beispiel erläutert werden: Im Register 03 wird der gewünschte Empfangskanal CHAN als 10 Bit Wert linksbündig ab Bit 15 abwärts erwartet (Bits 15 – 06).
Kanal = Empfangsfrequenz * 10 – 870; der Faktor 10 resultiert aus dem bei uns üblichen Kanalraster von 100 kHz. 870 steht für das untere Frequenzlimit von 87,0 MHz. Zusätzlich muss Bit 4 (Tune Bit) gesetzt werden, damit die gewählte Frequenz auch eingestellt wird.
Beispiel für 95,0 MHz:
CHAN = 950 – 870 = 80 = 0001010000 (auf 10 Bit expandiert)
oder als 16 Bit Wert (linksbündig): 0001010000000000 = 0x1400
Also 6x nach links schieben, was einer Multiplikation mit 64 entspricht. Bit 4 (Tune Bit) setzen ergibt dann den endgültigen Registerinhalt von 0001010000010000 = 0x1410.
Die Register 0Ah - 0Fh sind zum Auslesen des RDA5807 u. a. für RDS Daten oder die eingestellte Empfangsfrequenz vorgesehen. Auch hier müssen wie beim Beschreiben keine Register Adressen übermittelt werden, falls der sequenzielle Modus verwendet wird. Das Auslesen beginnt stets bei Register 0Ah (erst High- dann Low Byte). Die Registerbelegung ist tabellarisch im RDA5807 Datenblatt bzw. im Programming Manual beschrieben.
Zur praktischen Umsetzung habe ich eine einfache Hardware mit einem ATtiny44 µC, zwei Tastern und 4 Leuchtdioden entworfen. Mit den Tastern kann man zwischen maximal 16 vorzugebenden Festfrequenzen umschalten, sowie die Lautstärke einstellen. Der zuletzt eingestellte Sender wird im EEPROM gespeichert und steht beim Einschalten wieder zur Verfügung. Die LEDs zeigen im Wechsel den Empfangskanal (3s) und die Lautstärke (1s) als Binärwerte an. Zur Spannungsversorgung ist ein USB Kabel vorgesehen.
Zur Implementierung obiger Funktionen benötigt man nur den schreibenden RDA5807 Registerzugriff über den I2C Bus; dies erfolgt hier per “Bitbanging“ durch direkte Steuerung der µC Pins. Damit lässt sich das Programm leicht auf andere Controller Typen übertragen. Die Assembler Firmware sowie ein Platinenlayout sind hier zum Download verfügbar.
Etwas komfortabler ist eine ATtiny85 Variante mit OLED, die parallel hierzu entwickelt wurde. Sie nutzt die RDA5807 “Seek“ Funktion zur Sender-Einstellung. Die eingestellte Frequenz wird anschließend wieder ausgelesen und auf dem OLED angezeigt. Näheres auf Anfrage.