Stereo-Radio für 1,50 Euro

Hier können Sie ihre eigenen Projekte vorstellen
Antworten
Heinrichs
Beiträge: 185
Registriert: Do 21. Okt 2010, 18:31

Stereo-Radio für 1,50 Euro

Beitrag von Heinrichs » Fr 13. Jun 2014, 19:57

Zugegeben, die Überschrift stimmt nicht ganz; denn für 1,50 Euro erhält man nicht ein vollständiges Radio, sondern nur das Radiomodul TEA5767.

tea5767.jpg
tea5767-Modul
tea5767.jpg (16.8 KiB) 26368 mal betrachtet

Die Anschluss-Belegung dieses Moduls ist einfach: Bei A wird eine Antenne angeschlossen. Der Stereo-Kopfhörer wird an die Ausgänge L(inks) und R(echts) sowie GND angeschlossen. Die Anschlüsse auf der linken Seite müssen mit einem Mikrocontroller verbunden werden (Vcc = 5 V).

tea5767_anschluesse.jpg
Anschlussbelegung des TEA5767-Moduls
tea5767_anschluesse.jpg (12.28 KiB) 26368 mal betrachtet

Um damit wirklich Radiosendungen zu hören, benötigt man zusätzlich:

- eine Mikrocontroller-Platine, z. B. unsere Attiny-Platine,
- ein Stück Antennendraht (ca. 80 cm)
- einen hochohmigen(!) Kopfhörer
- optional ein LCDisplay

Wir haben das Modul zusammen mit einer Kopfhörer-Buchse auf eine Lochstreifenraster-Platine mit einer Winkelsteckerleiste montiert; diese kann dann ganz einfach an unsere Attiny-Platine angeschlossen werden.

radioplatine.jpg
Radio-Platine
radioplatine.jpg (34.79 KiB) 26368 mal betrachtet

Der Mikrocontroller kommuniziert mit dem Radiomodul über das I2C-Protokoll. So kann der Mikrocontroller z. B. einen Sendersuchlauf einleiten oder die Stärke des empfangenen Radiosignals ermitteln. Die I2C-Adresse ist $C0 (Schreiben) bzw. $C1 (Lesen). Grundsätzlich werden immer Pakete von 5 Bytes ausgetauscht. Beim Schreiben sind es:

1. Byte: Frequenz (Highbyte); Bit 6 und 7 haben Steuerfunktion
2. Byte: Frequenz (Lowbyte)
3. Byte - 5. Byte: Steuer- und Kontrollbits

Beim Lesen ist es ganz ähnlich: Auch hier haben Bit 6 und 7 des ersten Bytes Kontrollfunktionen. Näheres findet man auf den Seiten 14ff des Datenblatts und den Kommentaren des Beispielprogramms weiter unten. Zu beachten ist ferner, dass die im 1. und 2. Byte stehenden Zahlen die Frequenz nicht direkt, sondern in kodierter Form anzeigen.

Das Programm ist bewusst einfach gehalten; es hat folgende Struktur:

Startfrequenz 87,5 MHz einstellen
Suchlauf nach oben
kurz warten
Status auf Display anzeigen (Frequenz in MHz, Mono/Stereo, Signalstärke)
Schleife:
Wenn Ta0 betätigt, dann Frequenz etwas höher, Suchlauf nach oben, kurz warten, Status
Wenn Ta1 betätigt, dann Frequenz etwas niedriger, Suchlauf nach unten, kurz warten, Status
Schleifenende

Zu Beginn wird also beginnend mit der Frequenz 87,5 MHz ein erster Sendersuchlauf (nach oben) vorgenommen. Sobald das Radiomodul einen Sender gefunden hat, behält es die zugehörige Frequenz bei. Mit den Tasten Ta0 und Ta1 kann man weitere Suchläufe nach oben bzw. Unten herbeiführen. Wenn kein Taster betätigt ist, dann wird die Schleife ohne Aktivität durchlaufen und das Radiomodul setzt seinen Empfang ungestört fort.

Code: Alles auswählen

' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Radio mit TEA5767-Baustein
' up/down-Suche über Ta0 und Ta1
' Frequenz-Anzeige über LCD
' zusätzlich Anzeige S)tereo / M)ono und Signalstärke "S=..." in zweiter Zeile
'----------------------------------------------------------------------------

$regfile = "attiny2313.dat"
$crystal = 4000000

'**********************************************************
'******************* Deklarationen ************************

Dim I As Byte
Dim I2cadresse_w As Byte
Dim I2cadresse_r As Byte
Dim R As Byte
Dim F_low As Byte
Dim F_high As Byte
Dim Frequenz As Word
Dim Frequenz_mhz As Word
Dim S As Byte
Dim Stereo As Byte
Dim Signalstaerke As Byte
Dim Statuswerte(5) As Byte
Declare Sub Suche(richtung As Byte)
Declare Sub Frequenz_berechnen
Declare Sub Frequenz_anzeigen
Declare Sub Status_anzeigen
Declare Sub Status_lesen
Declare Sub Status

'****************** Initialisierung ***********************

Ddrb = &B11111111
Ddrd = &B01110000
Portd = &B10001111
Waitms 50

Config Lcd = 16 * 2                                         'LCD konfigurieren
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.6
Cursor Off

Config Sda = Portb.5
Config Scl = Portb.7

I2cadresse_w = &HC0
I2cadresse_r = &HC1

Const Zeit = 500
Const Offset = 6                                            '6

'**********************************************************
'******************** Hauptprogramm ***********************

R = 1                                                       'Suchrichtung aufwärts
Frequenz = 10709                                            'Startfrequenz 87,5 MHz
Call Suche(r)
Waitms Zeit
Call Status
Do
  If Pind.2 = 0 Then
    R = 1                                                   'Suche aufwärts
    Frequenz = Frequenz + Offset
    Call Suche(r)
    Waitms Zeit
    Call Status
  End If
  If Pind.3 = 0 Then
    R = 0                                                   'Suche abwärts
    Frequenz = Frequenz - Offset
    Call Suche(r)
    Waitms Zeit
    Call Status
  End If
Loop


'**********************************************************
'******************* Unterprogramme ***********************

Sub Suche(richtung As Byte)
  F_low = Low(frequenz)
  F_high = High(frequenz)
  F_high = F_high Or &B01000000                             'Search-Modus, kein Mute
  I2cstart
  I2cwbyte I2cadresse_w
  I2cwbyte F_high
  I2cwbyte F_low
  If Richtung = 1 Then I2cwbyte &B11000000 Else I2cwbyte &B00100000       'bit 7 -> up/down; bit 5 und 6 Empfindlichkeit, vgl. S. 14 vom Manual
  I2cwbyte &H10                                             'Standardeinstellung nach Manual
  I2cwbyte &H0                                              'Standardeinstellung nach Manual
  I2cstop
End Sub

Sub Frequenz_berechnen
  Frequenz = Statuswerte(1) And &B00111111
  Shift Frequenz , Left , 8
  Frequenz = Frequenz + Statuswerte(2)
  Frequenz_mhz = Frequenz / 100
  Frequenz_mhz = Frequenz_mhz * 82                          '82/100 ungefähr gleich 32768/(4*10000) ; Ergebnis in der Einheit 10 kHz
  Frequenz_mhz = Frequenz_mhz + 23                          'Zwischenfrequenz 22,5 mal 10 kHz
  Frequenz_mhz = Frequenz_mhz + 50                          'Abschneiden -> Runden beim nächsten Schritt
  Frequenz_mhz = Frequenz_mhz / 100                         'Ergebnis in der Einheit MHz
End Sub

Sub Frequenz_anzeigen                                       'Näherungswert auf MHz gerundet
  Locate 1 , 1
  Lcd Frequenz_mhz : Lcd " MHz "
End Sub

Sub Status_lesen
  I2cstart
  I2cwbyte I2cadresse_r
  For I = 1 To 4
    I2crbyte S , Ack
    Statuswerte(i) = S
  Next I
  I2crbyte S , Nack
  Statuswerte(5) = S
  I2cstop
End Sub

Sub Status_anzeigen
  S = Statuswerte(3)
  Stereo = S.7
  Signalstaerke = Statuswerte(4)
  Shift Signalstaerke , Right , 4
  Locate 2 , 1
  If Stereo = 1 Then Lcd "Ste" Else Lcd "Mon"
  Lcd " S="
  Lcd Signalstaerke
End Sub

Sub Status
  Call Status_lesen
  Call Frequenz_berechnen
  Cls
  Call Frequenz_anzeigen
  Call Status_anzeigen
End Sub

Übrigens: Für ein paar Euro mehr kann man im Internet auch eine auf dem TEA5767-Modul basierende fertig montierte Platine inklusive einem kleinen Verstärker finden; damit können dann auch niederohmige Kopfhörer zum Tönen gebracht werden.

radioplatine_mit_verstaerker.jpg
Radio-Platine mit Verstärker
radioplatine_mit_verstaerker.jpg (48.63 KiB) 26364 mal betrachtet

Antworten