控制方式
常见 Arduino 模块使用 I2C,UNO/Nano 一般连接 SDA=A4、SCL=A5。
淘宝 SKU:O27
Overview
TEA5767 是常见的 FM 收音机模块,Arduino 通过 I2C 控制频率、搜索、静音等功能。模块通常带音频输出口和天线接口,适合 Arduino 入门、I2C 演示和收音机小制作。
常见 Arduino 模块使用 I2C,UNO/Nano 一般连接 SDA=A4、SCL=A5。
音频从模块耳机座或 L/R 输出端接耳机、功放模块或有源音箱。
没有天线或天线接触不好,会表现为杂音大、搜不到台或信号弱。
Wiring
这张图是自绘无水印示意图,适合放进网站和客服说明。
/// Arduino FM receiver with TEA5767
/// 资料包原始 Arduino 例程,已把旧版 Wire.send / Wire.receive
/// 改成新版 Arduino IDE 可用的 Wire.write / Wire.read。
#include <Wire.h>
#include <LiquidCrystal.h>
#define Button_next 6
#define Button_prev 7
unsigned char search_mode = 0;
unsigned char frequencyH = 0;
unsigned char frequencyL = 0;
unsigned int frequencyB;
double frequency = 87.5;
double freq_available = 0;
int b = 0;
int c = 0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
Wire.begin();
lcd.begin(16, 2);
pinMode(Button_next, INPUT);
digitalWrite(Button_next, HIGH);
pinMode(Button_prev, INPUT);
digitalWrite(Button_prev, HIGH);
frequencyB = 4 * (frequency * 1000000 + 225000) / 32768;
frequencyH = frequencyB >> 8;
frequencyL = frequencyB & 0XFF;
Wire.beginTransmission(0x60);
Wire.write(frequencyH);
Wire.write(frequencyL);
Wire.write(0xB0);
Wire.write(0x10);
Wire.write(0x00);
Wire.endTransmission();
}
void loop() {
unsigned char buffer[5];
lcd.setCursor(0, 0);
Wire.requestFrom(0x60, 5);
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));
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");
}
}
下载完整 Arduino 例程
/// Arduino FM receiver with TEA5767
/// Source: local TEA5767 Arduino package example.
/// Compatibility note: old Wire.send()/Wire.receive() calls were updated to
/// Wire.write()/Wire.read() for current Arduino IDE versions.
#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);
pinMode(Button_next, INPUT);
digitalWrite(Button_next, HIGH);
pinMode(Button_prev, INPUT);
digitalWrite(Button_prev, HIGH);
frequency = 87.5;
frequencyB = 4 * (frequency * 1000000 + 225000) / 32768;
frequencyH = frequencyB >> 8;
frequencyL = frequencyB & 0XFF;
delay(100);
Wire.beginTransmission(0x60);
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);
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 ");
}
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) {
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--;
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) {
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--;
}
| TEA5767 模块 | Arduino UNO / Nano | 说明 |
|---|---|---|
| VCC | 5V | 常见模块接 5V 更稳定;具体仍以手里模块标识为准。 |
| GND | GND | 必须共地。 |
| SDA | A4 | I2C 数据线。 |
| SCL | A5 | I2C 时钟线。 |
| Audio / Earphone | 耳机 / 功放 / 有源音箱 | 音频输出,不接 Arduino IO。 |
| ANT | 天线 | 建议接好拉杆天线或导线天线。 |
Arduino Code
这里使用本地资料包里的 Arduino TEA5767 收音机源码,不再使用临时演示程序。原例程年代较早,新版 Arduino IDE 需要把 Wire.send() / Wire.receive() 改为 Wire.write() / Wire.read()。
FAQ
先确认耳机/功放接在模块音频输出口,不是接 Arduino;再确认频率设置为当地有台的 FM 频率,并接好天线。
优先检查天线、供电和音频线。天线太短、供电不稳、音频线接触不好都会导致杂音明显。
常见 UNO/Nano 的 I2C 都是 SDA=A4、SCL=A5。Mega、Leonardo、ESP32 等板子需要按对应开发板的 I2C 引脚连接。
模块输出通常是小信号音频,建议接耳机、有源音箱或功放模块,不建议直接推动大功率喇叭。