1984297

Nostalgisches FM-Stereo-Radio bauen

26.08.2014 | 09:25 Uhr |

Nostalgisches Radiobasteln kann sehr entspannend sein - und die fertigen Geräte können einen echten Blickfang darstellen. Lesen Sie hier, wie Sie zu einem funktionsfähigen FM-Stereo-Empfänger kommen.

Elektronik-Bastel-Erfahrungen reichen bei Stephan Laage-Witt zurück bis in die Schulzeit. Heute beschäftigt er sich immer mal wieder mit nostalgischem Radiobasteln - zur Entspannung und einfach, weil es Freude macht. Auch wenn der Weg von der ursprünglichen Idee bis zum fertigen Gerät oft länger ist als gedacht. Diesmal wird es ein UKW-Stereo-Radio.

UKW hatte es in meiner Bastelgeschichte schon öfter gegeben, aber Stereo und „richtig brauchbar“ war vor diesem Projekt noch  nicht dabei.

Was sollte es also werden? Natürlich ein praxistauglicher FM-Stereo-Empfänger. Und wie schon bei anderen Projekten wollte ich die Elektronik in einem Plexiglas-Gehäuse als freie Verdrahtung unterbringen.

Bei dieser Bauweise wird keine Platine verwendet. Stattdessen wird die Schaltung so aufgebaut, dass die Bauteile über ihre Anschlussdrähte und einige Lötösen auf der durchsichtigen Grundplatte Halt finden. Das ist nun eigentlich gar nicht für Hochfrequenz geeignet. Aber zum Glück machen Philips-Bausteine (TDA7021) die Sache einfach, da die ICs die hohen Frequenzen weitgehend intern verarbeiten. Das sollte auch mit einem Drahtverhau funktionieren. 

Die Bedienung für Senderwahl und Lautstärke sollte wie früher über Drehknöpfe erfolgen. Wo ich schon einmal dabei war, habe ich  auch eine Frequenzskala mit beweglicher Markierung via Skalenseil in das Pflichtenheft aufgenommen. Und schließlich sollte noch eine Leuchtbandanzeige in Anlehnung an ein „magisches Auge“ die Empfangsstärke anzeigen und bei der manuellen Abstimmung helfen.

Die Schaltung

Für die Schaltung habe ich den etwas älteren Philips-Baustein TDA7021 verwendet, weil er an Pin 9 die Empfangs-Feldstärke als Spannungswert zur Verfügung stellt und für kontinuierliche, manuelle Abstimmung über einen Drehknopf gut geeignet ist. Als Stereo-Dekoder sollte ein TDA7040 dazu kommen, der sehr gut mit dem 7021 harmoniert.

Die Chips waren nicht so einfach zu bekommen. Aber letztendlich findet man ja alles im Internet. Für wenige Euro wurden sie über Ebay angeboten, Versand aus Hongkong. Das ging ja einfacher als ich dachte. 

Schaltplan UKW-Stereo-Radio
Vergrößern Schaltplan UKW-Stereo-Radio
© Stephan Laage-Witt

Aber der Reihe nach. Die Schaltung wird über eine 9-Volt-Batterie versorgt, was gut für den NF-Verstärker, aber deutlich zu viel für die TDA-Chips ist. Deshalb sorgt ein 78L03 für stabile 3 Volt auf der HF-Seite. Die Schaltung folgt fast vollständig der Anwendung, die im Philips-Datenblatt gezeigt ist. Der frequenz-bestimmende Oszillatorkreis besteht aus einer Spule (Luftspule aus vier  Windungen mit 5 mm Durchmesser) und einer Kapazitätsdiode 1SV101. Die Abstimmung erfolgt über ein 47-k-Potentiometer. Mit dem Spannungsbereich von 0 bis 3 Volt lässt sich das UKW-Band sehr gut überstreichen. Die Widerstände links und rechts vom Abstimm-Poti begrenzen den Empfangsbereich auf das nutzbare Radioband. Als Antenne wird ein Drahtstück von 1 m Länge am Eingangskreis angeschlossen. Die Induktivität L3 in der Stromversorgung des TDA7021 ist übrigens in der Philips-Applikation nicht zu finden. Bei meinem Aufbau eliminierte sie Zwitschergeräusche, die andernfalls ab und zu zu hören waren.

Der Stereo-Dekoder übernimmt das MPX-Signal und liefert die Niederfrequenz an das Stereo-Poti zu Lautstärke-Einstellung.

Für die NF-Verstärkung konnte ich zwei LM386 zur Mitarbeit überreden, die sich in der Bastelkiste langweilten. Sie arbeiten hier mit niedriger Verstärkung und treiben zwei kleine Lautsprecher. Die Schaltung hat noch einige Elkos und 100 nF Blockkondensatoren zur Stabilisierung und Vermeidung von ungewollten Schwingungen. 

Für das „magische Auge“ musste wieder die Bastelkiste herhalten. Die Messungen an Pin 9 des TDA7021 zeigten, dass ohne Sender etwa 2.7 Volt anlagen. Je stärker der Sender, desto geringer war die Spannung bis herunter auf minimal etwa 0.3 Volt. Das Signal hätte man mit Komparator, Inverter und LED-Treiber aufbereiten können. Ein Blick in meine Vorräte brachte mich aber auf eine andere Idee.

Ich hatte noch einen Satz ATtiny44. Dieser AVR-Controller ist dem ATtiny13 sehr ähnlich, verfügt aber über wesentlich mehr Ausgänge - ideal für meinen Zweck. Der ADC des Mikrocontrollers übernimmt den Spannungswert an PA7 und steuert die Leuchtdioden an PA0 bis PA6. Die Pegelanpassung wurde komplett per Software gemacht, was den Aufbau natürlich sehr vereinfachte. Die Anzahl von sieben LEDs erschien mir als guter Kompromiss zwischen Auflösung und Stromverbrauch. Tatsächlich arbeitet das Programm mit einer Auflösung von 14 statt 7 Stufen. Bei allen ungeraden Werten wird die jeweils nächsthöhere LED im Pulsweiten-Modus mit 25 % betrieben, was etwa die halbe Helligkeit ergibt. Dadurch erscheinen die Übergänge „weicher“, schon beinahe wie mit analoger Elektronik. Der Controller läuft mit dem internen 1 MHz-Oszillator und hat nicht wirklich viel zu tun. Er darf deshalb den größten Teil der Zeit im Sleep-Modus entspannen. Das Programm ist in C geschrieben und recht einfach. Die Details sind den Kommentaren im C-Programm zu entnehmen.

/*
 * Magic Eye - field strength indicator for TDA7021 FM radio
 *
 * 2.7 V => all LEDs off, 0.3 V => all LEDs on
 *
 * The algorithm takes the average of 4 ADC measurement and drives a 7 LED array. It maps
 * 14 voltage steps to 7 LEDs. Even step-values are mapped to half the number of LEDs.
 * Odd values are mapped to half the number LEDs + the next LED at 25% (1 out of 4 cycles)
 *
 * Port A, Bit 0 ... 6: LED array, output
 * Port A, Bit 7: ADC, input
 *
 * for Attiny44. Fuses: internal oscillator at 1 MHz, div128 off
 *
 * Created: 23.04.2013 21:11:17
 * Author: Stephan Laage-Witt
*/
  
#define F_CPU 1000000
#define ADC_UPPER_LIMIT 231                   // corresponds to 2,70 V (reference = Vcc = 3.0 V)
  
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
  
volatile uint16_t adc_result;                 // sum of 4 conversions
volatile uint8_t job_counter = 0;
  
  
/* Interrupt Service Handler ---------------------------------------------------------------------*/
/* Runs approx. 240 times per second, reads ADC value, counts job_counter through from 0 to 3     */
  
ISR(TIM0_COMPA_vect) {
        adc_result += ADCH;                   // read ADC value, use upper 8 bits only
        ADCSRA |= (1<<ADSC);                  // kick off new conversion
        if (++job_counter == 4)                       // increase job_counter
        job_counter = 0;
}      
  
  
/* MAIN ------------------------------------------------------------------------------------------*/
int main(void)
{
        const uint8_t led_array[8] = {0b01111111,             // 7 LED array, 0 = on
                                       0b01111110,             // highest bit always 0
                                       0b01111100,
                                       0b01111000,
                                       0b01110000,
                                       0b01100000,
                                       0b01000000,
                                       0b00000000,
                                       };
        uint8_t step = 0;
        uint8_t odd_flag = 0;
                                                                     
        // I/O ports
        DDRA = 0b01111111;                    // bits 0 to 6 drive LED array, bit 7 used for ADC input
  
        // Initializing ADC
        ADMUX  = (1<<MUX2) | (1<<MUX1) | (1<<MUX0);           // Vcc is reference, channel PDA7                         
        ADCSRA = (1<<ADEN) | (1<<ADPS0);                      // ADC enabled, pre-scaler division factor = 2
        ADCSRB = (1<<ADLAR);                                  // result is left adjusted in ADCH
        ADCSRA |= (1<<ADSC);                                  // kick off first conversion
  
        // Configuring timer 0 for interrupt at (approx) 240 Hz
        TCCR0A |= (1<<WGM01);                                 // CTC mode
        TCCR0B |= (1<<CS02) | (0<<CS01) | (0<<CS00);          // prescale = clock rate / 256
        OCR0A = (16 - 1);                                     // compare value = 16 * 256 usec -> 244 Hz
        TIMSK0 |= (1<<OCIE0A);                                // enable timer compare interrupt
        sei();                                                // off we go ...
       
        // set sleep mode to idle: interrupts and adc kept running
        set_sleep_mode(SLEEP_MODE_IDLE);
       
    while(1) {
                if (job_counter == 3) {                               // every 4th cycle:
                        adc_result = adc_result / 4;          // take the average across 4 measurements
                        if (adc_result > ADC_UPPER_LIMIT) {   // anything above 2.7 V counts as "all LEDs off"
                                step = 0;
                        } else {                             
                                step = ADC_UPPER_LIMIT - adc_result;          // invert value
                                step /= 15;                                   // one step is approx. 0.18 V
                                if (step > 14) step = 14;                     // anything below 0.3 V counts as "all LEDs on
                                if (step & 0b00000001)                        // check odd (bit 0 = 1) or even (bit 0 = 0)
                                       odd_flag = 1; 
                                else
                                       odd_flag = 0;
                                step = step / 2;                              // reduce scale to 0 ... 7
                                adc_result = 0;                               // reset adc_result for the next round
                        };                    
                };
               
                if ((job_counter == 0) && (odd_flag))         // only for 1 out of 4 cycles:
                        PORTA   = led_array[step + 1];        // if result is odd then toggle
                else                                          //    highest LED between on and off
                        PORTA = led_array[step];              // set LED array according to ADC value
  
        sleep_mode();                                        // good night - wake up via interrupt                            
        }
}      
  
  

Ein paar Experimente vorab

Bevor ich mich an den Aufbau des Radios im Plexiglasgehäuse machen konnte, musste ich etwas Forschungsarbeit betreiben. Die erste Frage war: Wie bekomme ich SMD-Bausteine in eine frei-fliegende Verdrahtung? Ich habe einige Varianten probiert und bin dann mit der Montage auf einer IC-Fassung am besten zurechtgekommen. Die SMD-Chips habe ich mit einem kleinen Stück Holz etwas erhöht auf die IC-Fassung geklebt und dann Pin für Pin verdrahtet. Ein spitzer Lötkolben, eine ruhige Hand (!) und eine kräftige Lesebrille machten es möglich. Die SMD-Chips mit 1,27 mm Pin-Abstand machen keinen Ärger, und nach ein bisschen Übung geht das Löten zügig von der Hand. Die montierten ICs sind mechanisch sehr robust und können vielseitig verwendet werden. 

Montage des SMD-Chips auf einer IC-Fassung
Vergrößern Montage des SMD-Chips auf einer IC-Fassung
© Stephan Laage-Witt

Der nächste Schritt war ein Probeaufbau auf einem Holzbrett. Ich hatte verschiedene Varianten der Anordnung ausprobiert, um Leitungslängen klein zu halten. Als Draht kam versilberter Kupferdraht mit 1 mm Durchmesser zum Einsatz, der einerseits gute, mechanische Stabilität bietet und andererseits hübsch anzuschauen ist. Die Schaltung war erstaunlich unproblematisch und robust.

Testaufbau auf einer Holzplatte
Vergrößern Testaufbau auf einer Holzplatte
© Stephan Laage-Witt

Der dritte Versuchsaufbau beschäftigte sich mit dem Skalentrieb. Das Seilrad am Abstimmpoti sollte einen Durchmesser von 5 cm Durchmesser bekommen. Das ergab bei einem nutzbaren Drehwinkel von 270 Grad eine Skalenlänge von etwa 11 cm, was dann auch die wesentlichen Gehäusemaße bestimmte. Aus Platzgründen wurde das Abstimmpoti um 90 Grad verdreht angeordnet. Das Seil ließ sich gut über Umlenkrollen führen. Als Gegenstück arbeitete ein kleines Seilrad mit 2 cm Durchmesser, das auf einer freien Achse (eine M6-Schraube) mit Drehknopf montiert war. Die Abstimmung hat also eine Untersetzung von 2 auf 5, ein guter Wert für feinfühliges Abstimmen. Das Seil ist übrigens Teil einer Nylon-Drachenschnur und wurde mit einer kleinen Feder gespannt.

Skalentrieb mit einem Nylon-Seil
Vergrößern Skalentrieb mit einem Nylon-Seil
© Stephan Laage-Witt

Aufbau und Abgleich

Nachdem meine Forschung erfolgreich abgeschlossen war, konnte ich mit dem Zusammenbau beginnen. Als Material habe ich  durchgängig Plexiglas und Aluminium eingesetzt. Die Plexiglasplatten sind leider sehr empfindlich wenn die Schutzfolie erst einmal entfernt ist. Deshalb hatte ich die Schaltung komplett auf einem Holzbrett aufgebaut und erst dann auf die fertig bearbeitete und gebohrte Plexiglasplatte übertragen. Das ging ganz gut, weil die aufgebaute Schaltung auch ohne Grundplatte einigermaßen stabil war.

Die Schaltung an ihrem Arbeitsplatz
Vergrößern Die Schaltung an ihrem Arbeitsplatz
© Stephan Laage-Witt

Der Abgleich war sehr einfach. Erster Punkt war das Auseinanderziehen oder Zusammendrücken der Oszillatorspule, bis der Frequenzbereich mit dem UKW-Band übereinstimmte. Das brauchte ein bisschen Geduld und Fingerspitzengefühl.

Zum Abgleich von P2 und P3 schweigt sich das Philips-Datenblatt leider aus. Im Internet fand ich dann ein paar Tipps, die zu folgender Methode führten:

Zuerst habe ich den PLL-Oszillator des Stereo-Dekoders mit P3 abgeglichen. Dazu habe ich die Abstimmung in einen Bereich ohne Sender gedreht, so dass der Oszillator frei lief. Jetzt habe ich den 100-nF-Kondensator an Pin 7 des TDA7040 gelöst und Pin 7 über einen 10-kOhm-Widerstand an die Spannungsversorgung (3 V) gelegt. Mit einem Oszilloskop oder Frequenzzähler konnte ich an Pin 7 die Frequenz des Oszillators abnehmen. Sie wurde möglichst exakt auf 19 kHz eingestellt. Damit hat der Oszillator die optimalen Voraussetzungen, auf das Pilot-Signal eines Senders einzurasten. Zum Schluss musste ich den Umbau natürlich wieder rückgängig machen. Besonders der 100-nF-Kondensator an Pin 7 nach Masse war wichtig, weil sonst die Klangqualität leidet.  

P2 an Pin 15 des TDA7021 habe ich schließlich so eingestellt, dass auch ein schwacher Sender mit deutlich erkennbarem Stereo-Sound übertragen wurde. Die Einstellung war aber unkritisch. Ein mittlerer Wert wird meistens gut passen.

Zum Schluss kam noch die Frequenzskala. Um die Positionen der Frequenzen zu finden, habe ich mit Hilfe meines Reiseempfängers die Frequenzen des Oszillators am TDA7021 ermittelt. Das klappte prima, weil die Zwischenfrequenz mit 70 kHz quasi vernachlässigbar ist. Den Empfänger stellte ich mit eingeschobener Antenne so dicht wie möglich neben mein Radio. Die gesuchte Frequenz wurde am Reiseempfänger eingestellt, beispielsweise 90 MHz. Jetzt war der Oszillator beim Durchdrehen der Abstimmung einwandfrei im Reiseempfänger zu finden, so dass ich die 90-MHz-Position auf der Skala übernehmen konnte. Das habe ich schrittweise für mehrere Frequenzen wiederholt, bis die Skala komplett war. Die Skala habe ich dann mit dem Computer auf transparente Folie gedruckt und mit Tesafilm auf den durchsichtigen Skalenträger montiert. Fertig.

Frequenzskala mit Zeiger
Vergrößern Frequenzskala mit Zeiger
© Stephan Laage-Witt

Es funktioniert und sieht gut aus!

Und dann war es soweit: Das Radio funktionierte. Die Empfindlichkeit hat mich von Anfang an überrascht. Der TDA7021 kommt auch mit schwachen Sendern gut zurecht und ist sicherlich mit dem UKW-Band meines Reiseempfängers auf Augenhöhe. Beim Durchdrehen des Abstimmknopfes erscheinen die Sender dicht gepackt auf der Skala. Die LED-Anzeige ist flink und beim Abstimmen hilfreich. Auch die Klangqualität ist gut, und der Stereo-Effekt ist durch den relativ großen Abstand der beiden Lautsprecher im breiten Gehäuse schön zu hören. Der Empfang ist absolut klar, zumindest so lange die Sender mit ausreichender Feldstärke hereinkommen. Wenn der Empfang schwächer ist (3 oder 4 LEDs), dann sind die Sender von ausgeprägtem Stereo-Rauschen begleitet. Aber das kann man der kleinen Schaltung nicht übelnehmen.

Hinweis für alle Bastler:

Wenn auch Sie ein kreatives Projekt entwickelt haben, schreiben Sie uns. Wir würden Ihre Konstruktionen, nützlich oder einfach nur schräg, gern im Hacks-Bereich auf www.pcwelt.de vorstellen. Schreiben Sie an Birgit Götz - bgoetz@pcwelt.de.

0 Kommentare zu diesem Artikel

PC-WELT Hacks - Technik zum Selbermachen?

Raspberry Pi erfreut sich gerade unter Bastlern einer großen Beliebtheit. Kein Wunder, denn mit der 35-Euro-Platine lassen sich viele spannende Projekte realisieren. Vom Mediacenter, Netzwerkspeicher, Fotomaschine bis hin zum Überwachungssystem ist alles möglich. Dieser Bereich ist aber nicht nur dem Raspberry Pi gewidmet, sondern bietet auch viele Tipps, Tricks und Anleitungen für andere spannende Bastelprojekte.

1984297