Stereo FM Modul TEA5767 für den Arduino

In diesem Beitrag möchte ich das Radio FM Stereo Modul TEA5767 für den Arduino vorstellen.

Bezug des Modules TEA5767

Das FM Stereo Modul TEA5756 habe ich für knapp 3€ inkl. Versandkosten bei aliexpress.com erstanden. Du findest dieses Radio Modul aber auch bei ebay.de für einen Preis zwischen 4 und 10€ zzgl. Versandkosten je nach Artikelstandort.

Lieferumfang

Zum Lieferumfang gehört neben dem Modul noch zusätzlich eine kleine Antenne welche auf 24 cm ausgezogen werden kann und über einen 3,5 mm Klinkenstecker an das Modul angeschlossen wird.

Verpackung des FM Stereo Moduls TEA5767
Verpackung des FM Stereo Moduls TEA5767

technische Daten des FM Stereo Moduls TEA5767

  • Betriebsspannung – 5V
  • Frequenzbereich – 76 MHz bis 108 MHz
  • Anschluss – I²C
  • Abmaße (BxL) – 31mm x 30mm

Anschluss des Modules an einen Arduino

Durch den I²C Bus werden nur 4 Kabel benötigt, um das Modul mit dem Arduino zu verbinden.

FM Stereo Modul TEA5767Arduino UNO R3
+5V5V
SDAanaloger Pin A4
SCLanaloger Pin A5
GNDGND

Pinbelegung

Das Modul verfügt über eine 4 Stiftleiste wobei die Pins jeweils mit +5V, SDA, SCL und GND beschriftet sind. Des Weiteren sind zwei 3,5 mm Klinkenbuchsen angebracht wobei eine für die Antenne und einer für den Kopfhörer dient.

Pinout des FM Stereo Moduls TEA5767 für den Arduino
Pinout des FM Stereo Moduls TEA5767 für den Arduino

Aufbau der Schaltung

Wie bereits erwähnt möchte, ich dir zunächst zeigen wie du das Modul an den Arduino UNO anschließen kannst. Wobei durch die I²C Schnittstelle der Aufbau recht einfach ist.

FM Stereo Modul TEA5767 am Arduino UNO R3
FM Stereo Modul TEA5767 am Arduino UNO R3

Die Pinleiste am FM Stereo Modul ist im 90° Winkel von der Platine, wenn man nun diese auf ein Breadboard stecken möchte, wäre diese recht ungünstig positioniert, daher nutze ich eine 4 facht Pinleiste und biege die Kontakte um 90°.

4fach Pinleiste, einmal gebogen und einmal gerade
4fach Pinleiste, einmal gebogen und einmal gerade

Für den Aufbau der Schaltung verwende ich den Keyestudio UNO welcher den gleichen Chip hat wie der Arduino UNO R3 aber zusätzliche Stiftleisten und somit ist dies Ideal für den schnellen Aufbau. Aber du kannst das Modul natürlich auch an einen kleinen Arduino Nano anschließen und programmieren.

Programmieren des FM Stereo Moduls

Zunächst möchte ich dir zeigen wie du das Modul am Arduino programmieren kannst und den Sender per seriellem Monitor einstellen kannst.

Auf der Seite https://playground.arduino.cc/Main/TEA5767Radio/ findest du eine Bibliothek für den Arduino, mit welcher du ganz einfach eine Frequenz an das Modul übertragen kannst und somit den Sender einstellst. Es ist also nicht notwendig, die I²C Kommunikation kompliziert selber aufzubauen.

Zunächst müssen wir also die Bibliothek in die Arduino IDE einbinden. Dieses können wir entweder mit der *. zip Datei erledigen oder aber auch über den Bibliotheksverwalter der Arduino IDE.

Installieren der Bibliothek für das FM Stereo Modul TEA5767 in der Arduino IDE

Ich wähle hier den Weg über den Bibliotheksverwalter der Arduino IDE!

Beispiel 1 – das beigefügte Beispiel aus der Bibliothek

In dem beigefügten Beispiel zur Bibliothek von Simon Monk wird die Frequenz statisch d.h. in der setup Funktion fest gesetzt und auf den Mikrocontroller gespielt. Aber schauen wir uns den Sketch einfach mal in kleinen Blöcken an.

einbinden der Bibliotheken

Für den betrieb des FM Stereo Radio TEA5767 benötigst du die I²C Bibliothek Wire.h sowie eine extra Bibliothek mit den Funktionen um eine Sendefrequenz zu setzen.

#include <Wire.h>
#include <TEA5767Radio.h>

eine Objektinstanz erzeugen

Damit wir Funktionen bzw. in diesem Fall nur eine Funktion an unserem FM Radio ausführen können, müssen wir zunächst eine Objektinstanz vom Typ TEA5767Radio erzeugen.

TEA5767Radio radio = TEA5767Radio();

Es gibt zusätzlich die Möglichkeit auch eine I²C Adresse zu übergeben und somit ggf. die Bibliothek für andere Module zu verwenden.

TEA5767Radio radio = TEA5767Radio(0x70);

Da die meisten Module aus China oder zumindest aus dem asiatischen Raum stammen sind die unter Umständen von minderer Qualität und somit kann es auch mal vorkommen dass, das Modul eine andere Adresse hat. Auf der Seite https://playground.arduino.cc/Main/I2cScanner/ findest du einen I²C Scanner, um an deinem Arduino nach I²C Adresse zu suchen.

initialisieren der Kommunikation mit dem FM Radio in der Funktion „setup“

Für die Kommunikation per I²C muss die Wire Bibliothek einmalig initialisiert werden.

void setup(){
  //begin der Kommunikation
  Wire.begin();

Auch dieser Funktion können wir die I²C Adresse unseres Modules übergeben, aber dieses ist ein optionaler Parameter.

setzen der Frequenz am Modul TEA5767

An unserer zuvor erzeugten Objektinstanz rufen wir die Funktion „setFrequency“ auf und übergeben dieser den Wert für die Radiofrequenz, welche wir empfangen wollen.

  //setzen der Frequenz für den Radio Sender 89.0 RTL
  radio.setFrequency(89.0);
}

In diesem Fall habe ich den Radiosender 89.0 RTL gewählt.

Die Funktion „loop“ bleibt in diesem kleinen Beispiel leer.

//in diesem Beispiel bleibt die Loop Funktion leer
void loop(){}

Hier nun der komplette Sketch:

//einbinden der Bibliotheken für den FM Stereo Empfänger TEA5767
#include <Wire.h>
#include <TEA5767Radio.h>

//erzeugen einer Instanz
TEA5767Radio radio = TEA5767Radio();

void setup(){
  //begin der Kommunikation
  Wire.begin();
  //setzen der Frequenz für den Radio Sender 89.0 RTL
  radio.setFrequency(89.0);
}

//in diesem Beispiel bleibt die Loop Funktion leer
void loop(){}

Beispiel 2 – setzen des Senders mit einem Drehpotentiometer

In diesem erweiterten Beispiel möchte ich dir zeigen, wie du den Sender per Hand über ein Drehpotentiometer einstellen kannst.

Zum Drehpotentiometer habe ich dir bereits einen passenden Beitrag Bauteile: 50kOhm Drehpotentiometer geschrieben.

erweitern der bestehenden Schaltung

Zunächst müssen wir die bestehende Schaltung um ein besagtes Drehpotentiometer erweitern.

Der Drehpotentiometer verfügt über 3 Pins, wobei der mittlere mit einem analogen Pin und die beiden äußeren mit der Spannung versorgt werden. Im vorliegenden Beispiel verwende ich ein 50 kOhm Drehpotentiometer mit Kappe.

Quellcode

Wenn wir das Drehpotentiometer mit der Funktion „analogRead“ auslesen, erhalten wir einen Wert zwischen 0 und 1023. Diese Range müssen wir nun auf den gültigen Frequenzbereich von 76 MHz und 108 MHz mappen. Da wir aber Gleitkommazahlen erhalten möchten, müssen wir diese Range der Frequenz * 10 nehmen und später wieder durch 10 teilen.

Die kleine Pause von 125ms dient dazu das sich der Sender „einpegeln“ kann.

definieren des Pins für den Drehpotentiometer

Der Drehpotentiometer ist am analogen Pin A0 angeschlossen und wird auch so im Code definiert.

//Drehpotentiometer am analogen Pin A0 angeschlossen
#define poti A0

lesen des Wertes vom Drehpotentiometer

Ein gelesener analoger Wert liegt zwischen 0 und 1023. Je nach Stellung des Drehpotentiometers kann somit dieser Wert variieren.

//lesen des aktuellen Wertes 
int value = analogRead(poti);

mappen des Wertes vom Drehpoti auf eine Frequenz

An dem FM Stereo Modul TEA5767 kann eine Frequenz zwischen 76 MHz und 108 MHz eingestellt werden. Da es auch Radiofrequenzen mit Nachkommastellen gibt, wie „NDR1 Niedersachsen“ welcher auf der Frequenz 88,2 MHz liegt, müssen wir auch Gleitkommazahlen erhalten können. Wir müssen also „nur“ die Range von 76 bis 108 auf 760 auf 1080 erweitern, also quasi mit der Potenz von 10. Wenn wir nun den Wert mappen erhalten wir eine Zahl zwischen 760 bis 1080.

float frequenz = map(value, 0, 1023, 760, 1080) / 10.0f;

setzen der Frequenz

Im vorletzten Schritt setzen wir nun die neue Frequenz an das Radio Modul.

//setzen der Frequenz
radio.setFrequency(frequenz);

eine kleine Pause

Damit sich diese Frequenz „einpendeln“ kann legen wir nun eine Pause von 125ms. ein.

delay(125);

Hier nun der komplette Sketch für das Beispiel „TEA5767 FM Stereo Modul mit Drehpotentiometer“.

//einbinden der Bibliotheken für den FM Stereo Empfänger TEA5767
#include <Wire.h>
#include <TEA5767Radio.h>

//Drehpotentiometer am analogen Pin A0 angeschlossen
#define poti A0

//erzeugen einer Instanz
TEA5767Radio radio = TEA5767Radio();

void setup(){
  //begin der Kommunikation
  Wire.begin();
}

void loop(){
  //lesen des aktuellen Wertes 
  int value = analogRead(poti);
  //mappen des Wertes auf einen gültigen Frequenzwert zwischen 760 und 1080
  //und danach dur 10 teilen um so einen Gleitkommawert erhält.
  float frequenz = map(value, 0, 1023, 760, 1080) / 10.0f;
  //setzen der Frequenz
  radio.setFrequency(frequenz);
  delay(125);
}

Download des Beispiels

Beispiel 3 – 0,91″ OLED Display, Drehpotentiometer und FM Stereo Modul

Für das korrekte Einstellen eines Senders ist es von Vorteil zu sehen wie die aktuelle Frequenz ist, in diesem Beispiel möchte ich dir nun zeigen wie du zusätzlich ein kleines OLED Display implementierst.

0,91 Zoll OLED Display
0,91 Zoll OLED Display

Das gezeigte OLED Display habe ich dir bereits im Beitrag Arduino Lektion 76: 0,91 Zoll OLED Display ausführlich vorgestellt.

Aufbau der Schaltung

Zunächst möchte ich dir zeigen wie du das OLED Display in die bestehende Schaltung integrierst. Da auch dieses Modul über die Schnittstelle I²C kommuniziert müssen bzw. können wir die Pins SDA & SCL mit dem bestehenden Radio Modul verbinden. Das klappt auch deshalb, weil jedes Modul mit seiner eigenen Adresse ansprechbar ist.

Quellcode

Da wir unsere Schaltung lediglich um ein OLED Display erweitert haben möchte gerne auf diese Neuerung in unserem Sketch eingehen.

benötigte Bibliotheken für das OLED Display

Für die Ansteuerung des Displays benötigen wir 2 zusätzliche Bibliotheken. Ich verwende hier diese von Adafruit.

Wie man eine zusätzliche Bibliothek in die Arduino IDE installierst erfährst du im Beitrag Arduino IDE, Einbinden einer Bibliothek.

//Bibliotheken für den betrieb des Displays
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Objektinstanz für das Display erzeugen

Für das Ansteuern des Displays also das Schreiben von Text auf dem Display benötigen wir eine Objektinstanz vom Typ Adafruit_SSD1306.

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

Initialisieren des Displays

Bevor das Display verwendet werden kann, muss dieses initialisiert werden. Dazu müssen wir die I²C Adresse kennen. In meinem Fall lautet diese 0x3C. Bedenke jedoch, dass diese Adresse sich ändern kann.

Da das Display mit einem Schriftzug von Adafruit initialisiert, wird müssen wir dieses zunächst einmal löschen bevor man dieses verwenden kann. Solltest du dieses nicht machen, so wird dein zusätzlicher Text über die Grafik geschrieben.

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(1000);
display.clearDisplay();

schreiben neuer Werte auf das Display

Bevor wir einen neuen Wert in der Funktion „loop“ auf das Display schreiben, müssen wir dieses leeren. Nachdem die Schriftgröße und Farbe eingestellt wurde kann der Cursor auf dem Display positioniert werden. Das Format für den Cursor ist „Spalte, Zeile“.

Den Text schreibt man ähnlich wie beim Schreiben von seriellen Daten mit der Funktion „println“, in dieser Funktion fügen wir unseren String zusammen, wobei die Gleitkommazahl für die Frequenz zunächst in ein String umgewandelt werden muss (in diesem Beispiel mit 2 Nachkommastellen).

display.clearDisplay();
...
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Frequenz: "+String(frequenz,2)+" MHz");

Anzeigen des Radiosenders

Das Anzeigen eines Radiosenders ist in diesem Fall nur möglich, indem man die einzelnen Radiosender inkl. Frequenz einprogrammiert. Anders als wie bei einem DAB+ Radio kann dieses keine zusätzlichen Informationen empfangen und ist somit nur ein recht einfaches analoges Radio.

const int ANZAHL_SENDER = 5;

String sender[]={"89.0 RTL", "hr3", "NDR1 Niedersachsen", "N-JOY", "MDR Jump"};
float senderfrequenzen[]={89.00f,89.50f,90.90f,91.30f,91.50f}; 

In der Funktion „loop“ müssen wir, nachdem der Sender über das Drehpotentiometer eingestellt wurde, das Array mit den „senderfrequenzen“ durchlaufen und prüfen, ob diese Frequenz enthalten ist, wenn „ja“, dann nutzen wir den aktuellen Index der Schleife um den Namen des Senders aus dem Array „sender“ zu holen.

Diesen Namen schreiben wir in eine neue Zeile im Abstand von 15 Pixel zur ersten auf dem Display.

for(int i=0;i<ANZAHL_SENDER;i++){
    if(frequenz == senderfrequenzen[i]){
      display.setCursor(0,15);
      display.println(sender[i]);
      break;
    }
  } 

Hier nun der gesamte Quellcode:

//einbinden der Bibliotheken für den FM Stereo Empfänger TEA5767
#include <Wire.h>
#include <TEA5767Radio.h>

//Bibliotheken für den betrieb des Displays
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//Drehpotentiometer am analogen Pin A0 angeschlossen
#define poti A0

//erzeugen einer Instanz
TEA5767Radio radio = TEA5767Radio();

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

const int ANZAHL_SENDER = 5;

String sender[]={"89.0 RTL", "hr3", "NDR1 Niedersachsen", "N-JOY", "MDR Jump"};
float senderfrequenzen[]={89.00f,89.50f,90.90f,91.30f,91.50f};

void setup(){  
  //begin der Kommunikation
  Wire.begin();
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(1000);
  display.clearDisplay();
}

void loop(){
  display.clearDisplay();
  
  //lesen des aktuellen Wertes 
  int value = analogRead(poti);
  //mappen des Wertes auf einen gültigen Frequenzwert zwischen 760 und 1080
  //und danach dur 10 teilen um so einen Gleitkommawert erhält.
  double tempFrequenz = map(value, 0, 1023, 760, 1080);
  double frequenz = tempFrequenz / 10.0f;
    
  //setzen der Frequenz
  radio.setFrequency(frequenz);

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Frequenz: "+String(frequenz,2)+" MHz");

  for(int i=0;i<ANZAHL_SENDER;i++){
    if(frequenz == senderfrequenzen[i]){
      display.setCursor(0,15);
      display.println(sender[i]);
      break;
    }
  }  
  
  display.display();
    
  delay(125);
}

Download des Beispiels

Video

Da die Aufnahmen von einem „normalen“ Radiosender Urheberrechtlich geschützt sind, habe ich mir einen FM Transmitter für das Auto bei ebay.de gekauft.

Ich spiele in diesem Video Musik von der Plattform YouTube Audio Library, ab welche für YouTube Video frei zur Verfügung stehen.

Hörprobe zum FM Stereo Radio TEA5767 am Keyestudio UNO

Man hört doch recht gut, dass ein leichtes Knacken und rauschen zu hören ist. Dieses ist auch bei dem Betrieb für normale Radiosender so. Ich werde mal schauen, ob man mit einer größeren Antenne etwas mehr Empfangsqualität bekommt.

8 Kommentare

  1. Hallo!

    Ich habe ein sehr ähnlichen Sketch zu dem gleichen Projekt, habe aber auch das Problem knacken im Ton. Haben Sie das in den Griff bekommen oder können Sie mir sagen wie ich dieses Störgeräusch beseitigen kann?

    Viele Grüße
    Binnewerg

    1. Hi,

      vielen Dank für deinen Kommantar.
      Ich habe die genannten Störgeräusche leider nicht unterbunden bekommen, ich denke es wird ein Mix aus Spannungsversorgung und der günstigen bauart des Modules sein.
      (Obwohl auch manchmal ein Sender kurzzeitig recht klar reingekommen ist.)

      Gruß,

      Stefan Draeger

  2. Sehr geehrter Herr Draeger,
    ich bitte Sie folgendes zu prüfen. Während bei dem Versuch TEA+Poti der grüne Draht
    ( hier SDA ) zum A4 des Arduino uno führt, ist bei dem zweiten Versuch TEA+OLED+Poti
    der grüne Draht auf einmal SCL ? . Somit wurden hier beim TEA5767 im zweiten
    Versuch die Anschlüsse ( SDA+SCL) vertauscht.
    Mein praktischer Versuch hat dies auch bestätigt.
    Mit freundlichen Grüßen Klaus Wellmann

    1. Hi,

      ich habe das geprüft und muss Ihnen recht geben. In der Grafik habe ich die beiden Pins vertauscht.
      Das wird sofort gefixt.

      Vielen Dank für den Hinweis.

      Gruß

      Stefan Draeger

  3. Ich denke, irgendetwas stimmt nicht
    das 50K Potentiometer regelt bei mir nicht gut!
    der Wert sollte *glaube ich* auf … 10K sinken

    Gesunde freundliche Grüße aus den Niederlanden!
    Rob
    ( Ich benutze den Empfänger für das Lowband 84…87MHz WFM
    das ist hier und Piratenband )

    1. Hi,

      wie definierst du „regelt nicht gut“?
      Bei mir funktioniert ein 50 kOhm Drehpoti am Arduino recht gut.
      Diesen habe ich auch in diversen anderen Schaltungen bereits erfolgreich eingesetzt.

      Gruß,

      Stefan

  4. Hallo herr Stefan,
    Ich habe Rob geholfen und sein Problem ist nun aufgelöst.
    Er könnte nur dem ganzzahlen Frequenzen erreichen, wie 88.0, 89.0, 90.0 MHz uzw.
    Ich glaube daß es ein Konsequenz einer Fehler im Beispiel im „zip“ file ist:
    float frequenz = map(value, 0, 1023, 760, 1080) / 10;
    Der ’10‘ soll 10.0 sein, also ein Float, genau wie im alle andere Code auf diesem Blog.
    Vielleicht könnte der Zip aktualisiert werden?
    Herzliche Grüßen.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert