Introduction: Use TEA5767 FM Module to Create an Arduino Based FM Radio
In this project, we show how to use LinkSprite TEA5767 FM module to create an Arduono based FM radio.
Step 1: Parts List
We will need the following parts:
1 x TEA5767 FM Radio Breakout
1 x Arduino Uno
1 x Linker Base Shield
2 x Linker Button
2 x Linker cable
several male to female jumper wires
1 x TEA5767 FM Radio Breakout
1 x Arduino Uno
1 x Linker Base Shield
2 x Linker Button
2 x Linker cable
several male to female jumper wires
Step 2: Wiring Diagram
We will first install the Linker base shield on top of Arduino Uno.
Install one Linker button to GPIO 6, and the other Linker button to GPIO 7.
Connect TEA 5767 to Arduino Uno in the following way:
SDA of TEA5767 breakout board to A4 of Arduino.
SCL of TEA5767 breakout board to A5 of Arduino.
GND of TEA5767 breakout board to GND of Arduino
VCC of TEA5767 breakout board to VCC of Arduino.
The following are the interfaces of TEA5767 breakout board and Arduino:
Install one Linker button to GPIO 6, and the other Linker button to GPIO 7.
Connect TEA 5767 to Arduino Uno in the following way:
SDA of TEA5767 breakout board to A4 of Arduino.
SCL of TEA5767 breakout board to A5 of Arduino.
GND of TEA5767 breakout board to GND of Arduino
VCC of TEA5767 breakout board to VCC of Arduino.
The following are the interfaces of TEA5767 breakout board and Arduino:
Step 3: Code
The Arduino code is as below:
/// Original from Arduino FM receiver with TEA5767 http://www.electronicsblog.net
// Modified by Jingfeng Liu
// LinkSprite.com
//
#include <Wire.h>
#include <LiquidCrystal.h>
unsigned char search_mode=0;
int b=0;
int c=0;
#define Button_next 6
#define Button_prev 7
unsigned char frequencyH=0;
unsigned char frequencyL=0;
unsigned int frequencyB;
double frequency=0;
double freq_available=0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
Wire.begin();
lcd.begin(16, 2);
/// buttons
pinMode(Button_next, INPUT);
digitalWrite(Button_next, HIGH); //pull up resistor
pinMode(Button_prev, INPUT);
digitalWrite(Button_prev, HIGH); //pull up resistor
frequency=87.5; //starting frequency
frequencyB=4*(frequency*1000000+225000)/32768; //calculating PLL word
frequencyH=frequencyB>>8;
frequencyL=frequencyB&0XFF;
delay(100);
Wire.beginTransmission(0x60); //writing TEA5767
Wire.write(frequencyH);
Wire.write(frequencyL);
Wire.write(0xB0);
Wire.write(0x10);
Wire.write(0x00);
Wire.endTransmission();
delay(100);
}
void loop()
{
unsigned char buffer[5];
lcd.setCursor(0, 0);
Wire.requestFrom(0x60,5); //reading TEA5767
if (Wire.available())
{
for (int i=0; i<5; i++) {
buffer[i]= Wire.read();
}
freq_available=(((buffer[0]&0x3F)<<8)+buffer[1])*32768/4-225000;
lcd.print("FM ");
lcd.print((freq_available/1000000));
frequencyH=((buffer[0]&0x3F));
frequencyL=buffer[1];
if (search_mode) {
if(buffer[0]&0x80) search_mode=0;
}
if (search_mode==1) lcd.print(" SCAN");
else {
lcd.print(" ");
}
lcd.setCursor(0, 1);
lcd.print("Level: ");
lcd.print((buffer[3]>>4));
lcd.print("/16 ");
if (buffer[2]&0x80) lcd.print("STEREO ");
else lcd.print("MONO ");
}
///// buttons read
//////////// button_next//////////
if (!digitalRead(Button_next)&&!b) {
frequency=(freq_available/1000000)+0.05;
frequencyB=4*(frequency*1000000+225000)/32768+1;
frequencyH=frequencyB>>8;
frequencyL=frequencyB&0XFF;
Wire.beginTransmission(0x60);
Wire.write(frequencyH);
Wire.write(frequencyL);
Wire.write(0xB0);
Wire.write(0x1F);
Wire.write(0x00);
Wire.endTransmission();
//////////////////////
b=100;
};
if (!digitalRead(Button_next)&&b==1) {
///scannnn UP
search_mode=1;
Wire.beginTransmission(0x60);
Wire.write(frequencyH+0x40);
Wire.write(frequencyL);
Wire.write(0xD0);
Wire.write(0x1F);
Wire.write(0x00);
Wire.endTransmission();
/////////////////
b=100;
};
if (!b==0) b--;
//////////// button_prev//////////
if (!digitalRead(Button_prev)&&!c) {
frequency=(freq_available/1000000)-0.05;
frequencyB=4*(frequency*1000000+225000)/32768+1;
frequencyH=frequencyB>>8;
frequencyL=frequencyB&0XFF;
Wire.beginTransmission(0x60);
Wire.write(frequencyH);
Wire.write(frequencyL);
Wire.write(0xB0);
Wire.write(0x1F);
Wire.write(0x00);
Wire.endTransmission();
c=100;
};
if (!digitalRead(Button_prev)&&c==1) {
///scannnn DOWN
search_mode=1;
Wire.beginTransmission(0x60);
Wire.write(frequencyH+0x40);
Wire.write(frequencyL);
Wire.write(0x50);
Wire.write(0x1F);
Wire.write(0x00);
Wire.endTransmission();
c=100;
};
if (!c==0) c--;
////////////////////
}
After we download the code to Arduino, we can press the two buttons to scan up and scan down the channels to search for stations.
/// Original from Arduino FM receiver with TEA5767 http://www.electronicsblog.net
// Modified by Jingfeng Liu
// LinkSprite.com
//
#include <Wire.h>
#include <LiquidCrystal.h>
unsigned char search_mode=0;
int b=0;
int c=0;
#define Button_next 6
#define Button_prev 7
unsigned char frequencyH=0;
unsigned char frequencyL=0;
unsigned int frequencyB;
double frequency=0;
double freq_available=0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
Wire.begin();
lcd.begin(16, 2);
/// buttons
pinMode(Button_next, INPUT);
digitalWrite(Button_next, HIGH); //pull up resistor
pinMode(Button_prev, INPUT);
digitalWrite(Button_prev, HIGH); //pull up resistor
frequency=87.5; //starting frequency
frequencyB=4*(frequency*1000000+225000)/32768; //calculating PLL word
frequencyH=frequencyB>>8;
frequencyL=frequencyB&0XFF;
delay(100);
Wire.beginTransmission(0x60); //writing TEA5767
Wire.write(frequencyH);
Wire.write(frequencyL);
Wire.write(0xB0);
Wire.write(0x10);
Wire.write(0x00);
Wire.endTransmission();
delay(100);
}
void loop()
{
unsigned char buffer[5];
lcd.setCursor(0, 0);
Wire.requestFrom(0x60,5); //reading TEA5767
if (Wire.available())
{
for (int i=0; i<5; i++) {
buffer[i]= Wire.read();
}
freq_available=(((buffer[0]&0x3F)<<8)+buffer[1])*32768/4-225000;
lcd.print("FM ");
lcd.print((freq_available/1000000));
frequencyH=((buffer[0]&0x3F));
frequencyL=buffer[1];
if (search_mode) {
if(buffer[0]&0x80) search_mode=0;
}
if (search_mode==1) lcd.print(" SCAN");
else {
lcd.print(" ");
}
lcd.setCursor(0, 1);
lcd.print("Level: ");
lcd.print((buffer[3]>>4));
lcd.print("/16 ");
if (buffer[2]&0x80) lcd.print("STEREO ");
else lcd.print("MONO ");
}
///// buttons read
//////////// button_next//////////
if (!digitalRead(Button_next)&&!b) {
frequency=(freq_available/1000000)+0.05;
frequencyB=4*(frequency*1000000+225000)/32768+1;
frequencyH=frequencyB>>8;
frequencyL=frequencyB&0XFF;
Wire.beginTransmission(0x60);
Wire.write(frequencyH);
Wire.write(frequencyL);
Wire.write(0xB0);
Wire.write(0x1F);
Wire.write(0x00);
Wire.endTransmission();
//////////////////////
b=100;
};
if (!digitalRead(Button_next)&&b==1) {
///scannnn UP
search_mode=1;
Wire.beginTransmission(0x60);
Wire.write(frequencyH+0x40);
Wire.write(frequencyL);
Wire.write(0xD0);
Wire.write(0x1F);
Wire.write(0x00);
Wire.endTransmission();
/////////////////
b=100;
};
if (!b==0) b--;
//////////// button_prev//////////
if (!digitalRead(Button_prev)&&!c) {
frequency=(freq_available/1000000)-0.05;
frequencyB=4*(frequency*1000000+225000)/32768+1;
frequencyH=frequencyB>>8;
frequencyL=frequencyB&0XFF;
Wire.beginTransmission(0x60);
Wire.write(frequencyH);
Wire.write(frequencyL);
Wire.write(0xB0);
Wire.write(0x1F);
Wire.write(0x00);
Wire.endTransmission();
c=100;
};
if (!digitalRead(Button_prev)&&c==1) {
///scannnn DOWN
search_mode=1;
Wire.beginTransmission(0x60);
Wire.write(frequencyH+0x40);
Wire.write(frequencyL);
Wire.write(0x50);
Wire.write(0x1F);
Wire.write(0x00);
Wire.endTransmission();
c=100;
};
if (!c==0) c--;
////////////////////
}
After we download the code to Arduino, we can press the two buttons to scan up and scan down the channels to search for stations.