今天,几乎每个人都使用手机收听音乐,新闻,播客等。但是不久前,我们都依靠当地的FM广播电台来获取最新的新闻和歌曲,这些广播电台逐渐失去了流行,但在互联网出现紧急情况时停机后,收音机在向用户传输信息方面扮演着重要角色。无线电信号始终存在于空中(由电台广播),我们所需要的只是一个FM接收器电路,以捕获那些无线电信号并将其转换为音频信号。在以前的教程中,我们还构建了以下列出的其他几个FM发射器和接收器。
- Raspberry Pi FM发射器
- Raspberry Pi FM接收器收音机
- FM发射电路
- FM发射器电路,无电感器
在本教程中,我们将构建一个Arduino FM Receiver,并将其添加到我们的项目库中。我们将使用带有Arduino的RDA5807 FM接收器IC并对它进行编程,以便播放用户可以使用电位计调谐的任何FM广播电台。我们还将使用音频放大器和电路来控制Arduino FM收音机的输出音量,听起来有趣吗?因此,让我们开始吧。
调频广播一般工作
无线电台将电信号转换为无线电信号,并且这些信号在通过天线传输之前必须进行调制。可以调制信号的方法有两种,即AM和FM。顾名思义,调幅(AM)在发送信号之前先对幅度进行调制,而在调频(FM)中,信号的频率要在通过天线发送之前进行调制。在无线电台,它们使用频率调制来调制信号,然后发送数据。现在,我们需要构建的是一个可以调谐到特定频率的接收器,接收这些信号,然后将这些电信号转换为音频信号。我们将使用本项目中的RDA5807 FM接收器模块,简化了我们的电路。
所需组件
- Arduino纳米
- 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 Radio的完整电路图。
我在放大器上做的改动很小。我没有在放大器中使用两个电位器,而是只使用了一个。我用电阻互换了用来改变增益的电位器。因此,现在我们的项目有两个电位器,一个用于调节,另一个用于改变音量。用于调节通道的电位器与Arduino nano连接。电位器的中心引脚连接到Arduino nano的A0引脚,其余两个引脚中的一个连接到5V,另一个连接到GND。另一个电位器用于控制收音机的音量,并按上图所示进行连接。
Arduino的引脚A4和A5连接到RDA5807M的SDA和SCL引脚。请记住,接收器模块只能在3.3V电压下工作。因此,将Nano的3v3引脚连接到接收器模块的VCC引脚。建立连接后,我的设置如下所示
Arduino FM无线电代码说明
该代码将初始化接收器模块,然后以预设频率设置频道。当nano在A0引脚上读取的值发生变化(通过更改电位计)时,频率也会发生变化,从而改变通道。完整的代码在页面末尾给出。
我们通过添加与RDA5807通信所需的线库开始我们的程序。然后,在变量“通道”中,设置通道的值。每当收音机启动时,它都会自动调谐到该频道。
#包括
接下来,我们将字节加载到RDA5807 IC上的每个寄存器以设置我们的初始配置。至此,我们正在重置接收器。
uint8_t boot_config = {/ *寄存器0x02 * / 0b11000001,0b00000011,/ *寄存器0x03 * / 0b00000000,0b00000000,/ *寄存器0x04 * / 0b00001010,0b00000000,/ *寄存器0x05 * / 0b10001000,0b00001111,/ *寄存器0x06 * / 0b00000000,0b00000000,/ *寄存器0x07 * / 0b01000010,0b00000010,};
重置设备后,我们可以调整设备。要调整频道,我们只需要编程前4个字节。这部分代码会将频道更改为所需的频率。首先在I2C中,我们开始传输,写入或读取数据,然后结束传输。在该接收器IC中,我们无需指定地址,因为数据表清楚地表明I2C接口具有固定的起始寄存器,即写操作为0x02h,读操作为0x0Ah。
uint8_t tune_config = {/ *寄存器0x02 * / 0b11000000,0b00000001,/ *寄存器0x03 * /(通道>> 2),(((通道&0b11)<< 6)-0b00010000};
在设置中,我们初始化引导配置(复位),然后通过将调整配置字节写入RDA5807M来调整至通道。
void setup(){Serial.begin(9600); pinMode(A0,INPUT); / *与RDA5807M FM调谐器连接:* / 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结果= 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; }}} //循环结束
该功能用于设置 tune_config 阵列的字节,然后使用I2C协议将数据发送到RDA5807M IC。
void myChangeChannel(int channel){/ *如果没有返回任何内容,则返回void int * / tune_config =(channel >> 2); tune_config =((频道&0b11)<< 6)-0b00010000; Wire.begin(); Wire.beginTransmission(RDA5807M_ADDRESS); Wire.write(tune_config,TUNE_CONFIG_LEN); Wire.endTransmission(); }
Arduino FM收音机的工作
当模块加电时,我们的代码会重置RDA5807-M IC并将其设置为所需用户的通道(注意:该频率被视为将增加频率的基准频率)。通过更改电位器(连接到A0),Arduino Nano读取的值会更改。如果新值和旧值之间的差大于10,我们的代码将考虑该新值。根据新值与旧值之间的变化来更改通道。增大或减小音量取决于电位计,电位计连接在引脚3和GND之间。
在构建和编码结束时,您将拥有自己的FM收音机。调频收音机的完整功能可以在本页底部的视频链接中找到。希望您喜欢这个项目并学到一些有用的东西。如果您对执行此项目有任何疑问,可以将其留在评论部分,或使用我们的论坛寻求其他技术帮助。