Einfaches FM-Stereo Radio mit dem TEA5767 und einem Arduino

Um auch beim Basteln nebenbei noch ein wenig unterhalten zu werden, bauen wir uns heute ein kleines FM-Stereo-Radio – auch als UKW-Radio bekannt – mit Hilfe eines etwas älteren, aber dafür äußerst preiswerten, TEA5767-Breakoutboards. Allerdings wird es diesmal doch ein wenig  komplizierter, da wir ein klein wenig herumlöten müssen.

FM-Stereo-Radio TEA5767-Modul und ein Arduino - blog.simtronyx.de

FM-Stereo-Radio TEA5767-Modul und ein Arduino

Als erstes bauen wir uns einen Adapter für den TEA5767. Dazu nehmen wir eine Lochrasterplatine, die wir mit einem Dremel und einer Trennscheibe (oder einer Säge) zurechtschneiden:

Lochrasterplatine vorne - FM-Radio TEA5767 Lochrasterplatine hinten - FM-Radio TEA5767

Danach bearbeiten wir zwei 5 polige Stiftleisten bei denen wir die Stifte soweit reindrücken, dass diese etwa 1mm oben überstehen und verzinnen selbige mit Lötzinn um das spätere Auflöten des Chips zu vereinfachen (die mir vorliegenden waren zum Glück schon verzinnt):

DSCF3318

Nun stecken wir die Stiftleisten auf die fertige Lochrasterplatine und löten sie fest:

DSCF3339 DSCF3327 DSCF3349

Anschließend nehmen wir uns etwas Schaltdraht, entfernen die Isolierung und schneiden uns 10 etwa 1cm lange Stückchen zurecht. (Alternativ kann man natürlich auch die Beinchen von beispielsweise Widerständen, LEDs o.ä. nehmen.)

DSCF3354

Dann verzinnen wir die Drähte und wenden uns nun dem Anlöten der Drähte an das Radio-Board zu:

DSCF3383 DSCF3384

Ist dies geschehen legen wir das Board auf unseren vorbereiteten Lochrasteradapter (am besten auf ein Breadboard gesteckt) und löten nun alles fest, wobei wir allerdings relativ schnell vorgehen müssen, da sich sonst eventuell die Drähte vom FM-Modul lösen. (Eventuell noch einmal nachlöten.) Jetzt noch die überstehenden Drähte abkappen und schon ist unser TEA5767-Breadboard-Adaptermodul fertig:

DSCF3389 DSCF3407 Fertiges Adapterboard - FM-Radio TEA5767

Da das Radiomodul über einen Line-out Ausgang verfügt, bereiten wir nun noch ein Breadboard-Kabeladapter vor. Dies kann natürlich auch auf Cinch, oder auf eine Klinkenbuchse gehen. Dazu wird wieder eine Stiftleiste, diesmal 3-polig, verwendet und ein Audiokabel nach Wahl angelötet. Im Allgemeinen ist weiß der linke Kanal, rot der rechte Kanal und die Masse ist schwarz.

Line-out Breadboard-Adaperkabel - blog.simtronyx.de Line-out Breadboard-Adaperkabel - Detail - blog.simtronyx.de

Nun werden der TEA5767, das Display, der Arduino und die Stromversorgung nach folgender Tabelle verdrahtet:

Arduino
(Pro Mini 3,3V, Olimexino-32U4 im 3,3V Modus)
TEA5767-Modul Nokia 5110 LCD Stromversorgung
(Breadboard power module)
ANT Antenne RF
LEFT Audio line out links
RIGHT Audio line out rechts
GND BUSMODE für I²C-Mode auf GND
A4 (SDA) DATA
A5 (SCL) CLOCK
D3  RST
D4  CE
D5  DC
D6  DIN
D7  CLK
VCC VCC VCC VCC 3,3V
GND GND GND GND
LIGHT optional VCC 3,3V

TEA5767 Pinout - blog.simtronyx.de Nokia 5110 LCD-Display (Anschlussbelegung Rückseite)

Achtung, bei der Verdrahtung des LCD-Displays, eventuell können einige Module eine andere Anschlussbelegung haben!

Genaue Informationen über das Anschliessen des Displays gibt es in diesem Beitrag: Nokia 5110 LCD-Display, ein Arduino Pro Mini mit 3,3V und 8MHz Taktfrequenz (hier im Blog).

Ebenfalls wird noch die Audio-Adpaterkabel-Stiftleiste eingesteckt (Audio line-out laut Tabelle oben) und dann verbinden wir noch die Taster und die 10KOhm-Widerstände zur Steuerung wie folgt mit dem Arduino:

Schaltplangröße:

1afbgchdie1j5510101515202025253030353540404545505055556060afbgchdiej-+-+5V OFF 3.35V OFF 3.31818TEA5767 Breakoutboard - http://blog.simtronyx.de - SVG created by Ronny Simon - All rights reserved.
Für weitere Informationen (z.B. Pinbelegungen von Bauteilen oder genaue Kabelverbindungen)
mit der Maus über Elemente fahren (oder im Touch-Modus: Elemente antippen)...

Als Antenne kann ein ca. 1m langer Draht verwendet werden, bei mir ging es auch ohne und war sogar besser, da die Antenne merkwürdigerweise Störgeräusche fabriziert hat.

Programmcode:

Für das Display müssen noch 2 zusätzliche Bibliotheken installiert werden:

Nun noch den Sketch auf den Arduino laden und schon kann es losgehen:

// TEA5767 und Nokia 5110 LCD Display

#include <SPI.h>

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// D7 - Serial clock out (CLK oder SCLK)
// D6 - Serial data out (DIN)
// D5 - Data/Command select (DC oder D/C)
// D4 - LCD chip select (CE oder CS)
// D3 - LCD reset (RST)
Adafruit_PCD8544 lcd = Adafruit_PCD8544(7, 6, 5, 4, 3);

#include <Wire.h>

#define button_frequency_up     13
#define button_frequency_down   12
#define button_mute             11

#define TEA5767_mute_left_right  0x06
#define TEA5767_MUTE_FULL        0x80
#define TEA5767_ADC_LEVEL_MASK   0xF0
#define TEA5767_STEREO_MASK      0x80


int old_frequency=-1;
int frequency=10260;

byte old_stereo=0;
byte stereo=1;

byte old_mute=1;
byte mute=0;

byte old_signal_level=1;
byte signal_level=0;

unsigned long last_pressed;

void setup(void) {
  
  pinMode(button_frequency_up, INPUT);
  pinMode(button_frequency_down, INPUT);
  pinMode(button_mute, INPUT);
  
  Wire.begin();
  
  TEA5767_set_frequency();

  lcd.begin();
  lcd.setContrast(60);
  lcd.clearDisplay();
   
  set_text(1,2,"FM Radio",BLACK,1);  
  //set_text(14,147,"blog.simtronyx.de",BLACK,1);
  
}


void loop() {

    if(frequency!=old_frequency){
      set_text(old_frequency>=10000?6:14,17,value_to_string(old_frequency),WHITE,2);
      set_text(frequency>=10000?6:14,17,value_to_string(frequency),BLACK,2);
      old_frequency=frequency;
    }
    
    TEA5767_read_data();
      
    if(old_stereo!=stereo){ 
        set_text(old_stereo?22:28,39,old_stereo?"Stereo":"Mono",WHITE,1);
        set_text(stereo?22:28,39,stereo?"Stereo":"Mono",BLACK,1);
        old_stereo=stereo;
    }
    
    if(old_signal_level!=signal_level){
        set_text(old_signal_level<10?76:70,39,String((int)old_signal_level),WHITE,1);
        set_text(signal_level<10?76:70,39,String((int)signal_level),BLACK,1);
        old_signal_level=signal_level;
        show_signal_level(signal_level);
    }
    
    if(old_mute!=mute){
        set_text(1,39,old_mute?"M":"S",WHITE,1);
        set_text(1,39,mute?"M":"S",BLACK,1);
        old_mute=mute;
    }
      
    delay(50);
    
  
  if(digitalRead(button_frequency_down)==HIGH){
    
    frequency=frequency-5;
    if(frequency<8750)frequency=10800;
    TEA5767_set_frequency();
  }
  if(digitalRead(button_frequency_up)==HIGH){
    
    frequency=frequency+5;
    if(frequency>10800)frequency=8750;
    TEA5767_set_frequency();
  }

  if(digitalRead(button_mute)==HIGH){
    
    TEA5767_mute();
  }
  
  delay(50);
  
}

unsigned char frequencyH = 0;
unsigned char frequencyL = 0;

unsigned int frequencyB;

unsigned char TEA5767_buffer[5]={0x00,0x00,0xB0,0x10,0x00};

void TEA5767_write_data(byte data_size){
   
  delay(50);
  
  Wire.beginTransmission(0x60);
  
  for(byte i=0;i<data_size;i++)
    Wire.write(TEA5767_buffer[i]);
  
  Wire.endTransmission();
  
  delay(50);
}

void TEA5767_mute(){ 
  
  if(!mute){   
    mute = 1;   
    TEA5767_buffer[0] |= TEA5767_MUTE_FULL;
    TEA5767_write_data(2);
//    TEA5767_buffer[0] &= ~TEA5767_mute;
//    TEA5767_buffer[2] |= TEA5767_mute_left_right;
  }   
  else{
    mute = 0;   
    TEA5767_buffer[0] &= ~TEA5767_MUTE_FULL;
    TEA5767_write_data(2);
//    TEA5767_buffer[0] |= TEA5767_mute;
//    TEA5767_buffer[2] &= ~TEA5767_mute_left_right;
  }
    
//  TEA5767_write_data(3);
}

void TEA5767_set_frequency()
{
  frequencyB = 4 * (frequency * 10000 + 225000) / 32768;
  TEA5767_buffer[0] = frequencyB >> 8;
  if(mute)TEA5767_buffer[0] |= TEA5767_MUTE_FULL;
  TEA5767_buffer[1] = frequencyB & 0XFF;
  
  TEA5767_write_data(5);
}

int TEA5767_read_data() {
  
  unsigned char buf[5];
  memset (buf, 0, 5);
  
  Wire.requestFrom (0x60, 5); 

  if (Wire.available ()) {
    for (int i = 0; i < 5; i++) {
      buf[i] = Wire.read ();
    }
        
    stereo = (buf[2] & TEA5767_STEREO_MASK)?1:0;
    signal_level = ((buf[3] & TEA5767_ADC_LEVEL_MASK) >> 4);
    
    return 1;
  } 
  else return 0;
}

void show_signal_level(int level){
  
  byte xs=68;
  byte ys=8;
  for(int i=0;i<15;i++){
    if(i%2!=0)lcd.drawLine(xs+i,ys,xs+i,ys-i/2,level>=i?BLACK:WHITE);
  }
}

void set_text(int x,int y,String text,int color,int textsize){
  
  lcd.setTextSize(textsize);
  lcd.setTextColor(color); 
  lcd.setCursor(x,y);     
  lcd.println(text);      
  lcd.display();         
}


String value_to_string(int value){
  
  String value_string = String(value / 100);
  value_string = value_string + '.' + ((value%100<10)?"0":"") + (value % 100);
  return value_string;
}

Download Source Code

Die Funktionen der Taster sind von links nach rechts:

  • Mute – Ton an oder aus
  • Frequenz nach unten um 0.05 MHz
  • Frequenz nach oben um 0.05 MHz

Die Mono/Stereo-Anzeige erfolgt automatisch, ist aber leider bei “Ton aus” immer Mono. Unten links gibt es zwei Modi, “S” ist “Ton an” und “M” ist “Ton aus”. Unten rechts ist die Empfangsstärke als Zahl (0-15), diese wird oben rechts noch grafisch angezeigt und in der Mitte des Displays steht natürlich die aktuelle Frequenz.

Viel Spaß beim Radiohören!

Bauteile (Bezugsquellen):

eBay: Arduino Pro Mini 3.3V 8MHz
Breadboard
Breadboard Kabel
Breadboard Power Modul
Lochrasterplatine
Nokia 5110 Display
Taster
TEA5767
Amazon: Arduino Pro Mini 3.3V 8MHz
Breadboard
Breadboard Kabel
Breadboard Power Modul
Lochrasterplatine
Nokia 5110 Display
Taster
TEA5767

Gut?

Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail