几乎每个人都使用手机收听音乐、新闻、播客等。但是不久以前,我们都依靠当地的FM广播电台来获取最新的新闻和歌曲,这些广播电台逐渐失去了知名度,但是在互联网出现紧急情况时处于关闭状态时,收音机在将信息传输到用户方面扮演着重要角色。无线电信号始终存在于空中(由电台广播),我们所需要的只是一个FM接收器电路,以捕获这些无线电信号并将其转换为音频信号。
在本篇文章中,我们将制作一个Arduino FM接收器。我们将基于Arduino使用RDA5807 FM接收器IC并对它进行编程,以便播放任何可由用户使用电位计进行调谐的FM广播电台。我们还将使用音频放大器和电路来控制Arduino FM收音机的输出音量,听起来有趣吗?让我们开始吧。
FM调频广播的工作原理
无线电台将电信号转换为无线电信号,并且这些信号在通过天线传输之前必须进行调制。可以调制信号的方法有两种,即AM和FM。顾名思义,调幅(AM)在发送信号之前先对幅度进行调制,而在调频(FM)中,信号的频率要在通过天线发送之前进行调制。在无线电台,它们使用调频来调制信号,然后发送数据。现在,我们需要制作的是一个可以调谐到特定频率的接收器,接收这些信号,然后再将这些电信号转换为音频信号。我们将在本文中使用RDA5807 FM接收器模块,从而简化了电路。
所需组件
● Arduino Nano开发板
● RDA5807接收器
● 音频放大器
● 连接线
● 100K电位器
● 面包板
RDA5807接收器
RDA5807是具有完全集成的合成器的单芯片FM立体声无线电调谐器模块。该模块支持全球范围内的50 – 115MHz频带、音量控制和静音,可编程去加重(50 / 75us),接收信号强度指示器和SNR,32.768KHz晶体振荡器,数字自动增益控制等。下图显示了RDA5807M调谐器的框图。
它具有数字低中频架构,并集成了一个低噪声放大器(LNA),该放大器支持FM广播频段(50至115 MHz)、可编程增益控制(PGA)、高分辨率模数转换器和高保真数模转换器(DAC)。限幅器可防止过载,并限制相邻通道产生的互调产物的数量。 PGA放大混频器输出信号,然后用ADC数字化。 DSP内核管理通道选择、FM解调、立体声MPX解码器和输出音频信号。该IC的RDA5807引脚排列图如下。
该模块工作在1.8 – 3.3V的电源。当进入静止状态并选择了控制接口时,模块会在VIO上电时进行复位,并且还支持通过触发02H地址的0到1中的bit1进行软复位。该模块使用I2C通信与MCU进行通信,并且连接以启动条件、命令字节和数据字节开始。 RDA5807具有13个16位寄存器,每个寄存器执行特定功能。寄存器地址以00H开头,该地址分配给芯片ID,以0FH结尾。在所有13个寄存器中,有些位保留,而有些则是R / W。每个寄存器根据分配给它们的位执行诸如改变音量、改变通道等任务。
将模块连接到电路时,由于模块引脚是焊盘形式,我们无法直接使用该模块。因此,我使用一块洞洞板和一些插针,将模块的每个引脚焊接到插针上,如下图所示。
音频放大器
音频放大器是一种电子设备,可将低功率电子音频信号放大到足以驱动扬声器或耳机的电平。我们使用LM386构建了一个简单的音频放大器,其电路如下所示。
Arduino FM接收器电路图
我们使用了两个电位器来调节FM频段和控制音频放大器的音量。要更改音量,您可以改变电位器,电位器连接在LM386的1至8号引脚之间,也可以改变电位器,其连接在LM386的3号引脚之间。下图显示了Arduino FM收音机的完整电路图。
我在放大器上做的一些微小改动。我没有在放大器中使用两个电位器,而是仅使用一个。我用电阻互换了用来改变增益的电位器。因此,现在我们的项目有两个电位器,一个用于调节,另一个用于改变音量。用于调节通道的电位器与Arduino nano连接。电位器的中心引脚连接到Arduino nano的A0引脚,其余两个引脚中的一个连接到5V,另一个连接到GND。另一个电位器用于控制收音机的音量,并按上图所示进行连接。
Arduino的引脚A4和A5连接到RDA5807M的SDA和SCL引脚。请记住,接收器模块只能在3.3V电压下工作。因此,将Nano的3v3引脚连接到接收器模块的VCC引脚。建立连接后,设置如下所示
Arduino FM收音机代码说明
该代码将初始化接收器模块,然后以预设频率设置频道。当nano在A0引脚上读取的值发生变化(通过改变电位器)时,频率也会发生变化,从而改变通道。完整的代码在页面末尾给出。
我们在程序开始时添加与RDA5807通信所需的wire库。然后,定义变量“channel”,设置频道。每当收音机启动时,它都会自动调谐到该频道。
#include
uint16_t channel = 187;
接下来,我们将字节加载到RDA5807 IC上的每个寄存器以设置我们的初始配置。然后,我们复位接收器。
uint8_t boot_config[] = {
/* register 0x02 */
0b11000001,
0b00000011,
/* register 0x03 */
0b00000000,
0b00000000,
/* register 0x04 */
0b00001010,
0b00000000,
/* register 0x05 */
0b10001000,
0b00001111,
/* register 0x06 */
0b00000000,
0b00000000,
/* register 0x07 */
0b01000010,
0b00000010,
};
复位设备后,我们可以调谐设备。要调整频道,我们只需要编程前4个字节。这部分代码会将频道更改为所需的频率。首先在I2C中,我们开始传输,写入或读取数据,然后结束传输。在该接收器IC中,我们无需指定地址,因为数据表清楚地表明I2C接口具有固定的起始寄存器,即用于写入操作的0x02h和用于读取操作的0x0Ah。
uint8_t tune_config[] = {
/* register 0x02 */
0b11000000,
0b00000001,
/* register 0x03 */
(channel >> 2),
((channel & 0b11) << 6 ) | 0b00010000
};
在setup函数中,我们初始化引导配置,然后通过将调整配置字节写入RDA5807M来调整至通道。
void setup()
{
Serial.begin(9600);
pinMode(A0,INPUT);
/* Conect to RDA5807M FM Tuner: */
Wire.begin();
Wire.beginTransmission(RDA5807M_ADDRESS);
Wire.write(boot_config, BOOT_CONFIG_LEN);
Wire.endTransmission();
Wire.beginTransmission(RDA5807M_ADDRESS);
Wire.write(tune_config, TUNE_CONFIG_LEN);
Wire.endTransmission();
}
当使用电位器调谐到某个频率时,我遇到了一个问题。 A0引脚读取的值不是恒定的。噪声与所需的值成比例。我使用了一个连接在A0和GND之间的0.1uF陶瓷电容器,尽管该噪声已降至最低,但仍未达到所需的水平。因此,我必须对代码进行一些更改。首先,我记下了受噪声影响的读数。我发现噪声的最大值是10。因此,我以这样的方式编写程序,即只有在同一引脚的新值和旧值之间的差大于10时,它才会考虑新值。然后调谐到所需的频道。
void loop()
{
int channel1 =187 ,avg=0, newA;
static int oldA = 0;
int result = 0;
newA = analogRead(A0);
if ((newA - oldA) > 10 || (oldA - newA) > 10){
Serial.println(newA);
if(newA!= oldA){
channel = channel1+(newA/10);
myChangeChannel(channel);
oldA=newA;
}
}
}//loop end
以下函数用于设置tune_config数组的字节,然后使用I2C协议将数据发送到RDA5807M。
void myChangeChannel(int channel){ /* void if nothing is returned else int */
tune_config[2] = (channel >> 2);
tune_config[3] = ((channel & 0b11) << 6 ) | 0b00010000;
Wire.begin();
Wire.beginTransmission(RDA5807M_ADDRESS);
Wire.write(tune_config, TUNE_CONFIG_LEN);
Wire.endTransmission();
}
Arduino FM收音机的工作过程
当模块上电时,我们的代码会复位RDA5807-M并将其设置为所需用户的通道(注意:该频率被视为将增加频率的基准频率)。通过更改电位器(连接到A0),Arduino Nano读取的值会更改。如果新值和旧值之间的差大于10,我们的代码将考虑该新值。根据新值与旧值之间的变化来更改通道。增大或减小音量取决于连接在引脚3和GND之间的电位器。
电路搭建和代码编写完成后,您将拥有自己的FM收音机。希望您喜欢本篇文章并学到一些有用的东西。
编辑:hfy
全部0条评论
快来发表一下你的评论吧 !