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.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
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.
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 TEA5767 | Arduino UNO R3 |
---|---|
+5V | 5V |
SDA | analoger Pin A4 |
SCL | analoger Pin A5 |
GND | GND |
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.
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.
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°.
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.
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.
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.
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.
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
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
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
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
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 )
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
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.
Danke,
habe das ZIP-File aktualisiert.
Gruß
Stefan