风筝
发表于: 2020-1-13 17:00:50 | 显示全部楼层

今天,几乎每个人都使用手机收听音乐、新闻、播客等。但是不久以前,我们都依靠当地的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),接收信号强度指示器和SN​​R,32.768KHz晶体振荡器,数字自动增益控制等。下图显示了RDA5807M调谐器的框图。

RDA5807M-Tuner-Cicuit-Diagram.jpg


它具有数字低中频架构,并集成了一个低噪声放大器(LNA),该放大器支持FM广播频段(50至115 MHz)、可编程增益控制(PGA)、高分辨率模数转换器和高保真数模转换器(DAC)。限幅器可防止过载,并限制相邻通道产生的互调产物的数量。 PGA放大混频器输出信号,然后用ADC数字化。 DSP内核管理通道选择、FM解调、立体声MPX解码器和输出音频信号。该IC的RDA5807引脚排列图如下。

RDA5807-Pinout.png


该模块工作在1.8 – 3.3V的电源。当进入静止状态并选择了控制接口时,模块会在VIO上电时进行复位,并且还支持通过触发02H地址的0到1中的bit1进行软复位。该模块使用I2C通信与MCU进行通信,并且连接以启动条件、命令字节和数据字节开始。 RDA5807具有13个16位寄存器,每个寄存器执行特定功能。寄存器地址以00H开头,该地址分配给芯片ID,以0FH结尾。在所有13个寄存器中,有些位保留,而有些则是R / W。每个寄存器根据分配给它们的位执行诸如改变音量、改变通道等任务。


将模块连接到电路时,由于模块引脚是焊盘形式,我们无法直接使用该模块。因此,我使用一块洞洞板和一些插针,将模块的每个引脚焊接到插针上,如下图所示。

RDA5807-Receiver-Module.jpg


音频放大器

音频放大器是一种电子设备,可将低功率电子音频信号放大到足以驱动扬声器或耳机的电平。我们使用LM386构建了一个简单的音频放大器,其电路如下所示。

Audio-Amplifier-Circuit-Diagram.png


Arduino FM接收器电路图

我们使用了两个电位器来调节FM频段和控制音频放大器的音量。要更改音量,您可以改变电位器,电位器连接在LM386的1至8号引脚之间,也可以改变电位器,其连接在LM386的3号引脚之间。下图显示了Arduino FM收音机的完整电路图。

Arduino-Based-FM-Radio-using-RDA5807-Circuit-Diagram.png


我在放大器上做的一些微小改动。我没有在放大器中使用两个电位器,而是仅使用一个。我用电阻互换了用来改变增益的电位器。因此,现在我们的项目有两个电位器,一个用于调节,另一个用于改变音量。用于调节通道的电位器与Arduino nano连接。电位器的中心引脚连接到Arduino nano的A0引脚,其余两个引脚中的一个连接到5V,另一个连接到GND。另一个电位器用于控制收音机的音量,并按上图所示进行连接。


Arduino的引脚A4和A5连接到RDA5807M的SDA和SCL引脚。请记住,接收器模块只能在3.3V电压下工作。因此,将Nano的3v3引脚连接到接收器模块的VCC引脚。建立连接后,设置如下所示

Arduino-Based-FM-Radio-using-RDA5807.jpg


Arduino FM收音机代码说明

该代码将初始化接收器模块,然后以预设频率设置频道。当nano在A0引脚上读取的值发生变化(通过改变电位器)时,频率也会发生变化,从而改变通道。完整的代码在页面末尾给出。


我们在程序开始时添加与RDA5807通信所需的wire库。然后,定义变量“channel”,设置频道。每当收音机启动时,它都会自动调谐到该频道。

  1. #include <Wire.h>
  2. uint16_t channel = 187;
复制代码

接下来,我们将字节加载到RDA5807 IC上的每个寄存器以设置我们的初始配置。然后,我们复位接收器。

  1. uint8_t boot_config[] = {
  2.   /* register 0x02 */
  3.   0b11000001,
  4.   0b00000011,
  5.   /* register 0x03 */
  6.   0b00000000,
  7.   0b00000000,
  8.   /* register 0x04 */
  9.   0b00001010,
  10.   0b00000000,
  11.   /* register 0x05 */
  12.   0b10001000,
  13.   0b00001111,
  14.   /* register 0x06 */
  15.   0b00000000,   
  16.   0b00000000,
  17.   /* register 0x07 */
  18.   0b01000010,
  19.   0b00000010,
  20. };
复制代码

复位设备后,我们可以调谐设备。要调整频道,我们只需要编程前4个字节。这部分代码会将频道更改为所需的频率。首先在I2C中,我们开始传输,写入或读取数据,然后结束传输。在该接收器IC中,我们无需指定地址,因为数据表清楚地表明I2C接口具有固定的起始寄存器,即用于写入操作的0x02h和用于读取操作的0x0Ah。

  1. uint8_t tune_config[] = {
  2.   /* register 0x02 */
  3.   0b11000000,
  4.    0b00000001,
  5.    /* register 0x03 */
  6.    (channel >> 2),
  7.    ((channel & 0b11) << 6 ) | 0b00010000
  8. };
复制代码

setup函数中,我们初始化引导配置,然后通过将调整配置字节写入RDA5807M来调整至通道。

  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4.   pinMode(A0,INPUT);
  5.   /* Conect to RDA5807M FM Tuner: */
  6.   Wire.begin();
  7.   Wire.beginTransmission(RDA5807M_ADDRESS);
  8.   Wire.write(boot_config, BOOT_CONFIG_LEN);
  9.   Wire.endTransmission();
  10.   Wire.beginTransmission(RDA5807M_ADDRESS);
  11.   Wire.write(tune_config, TUNE_CONFIG_LEN);
  12.   Wire.endTransmission();
  13. }
复制代码

当使用电位器调谐到某个频率时,我遇到了一个问题。 A0引脚读取的值不是恒定的。噪声与所需的值成比例。我使用了一个连接在A0和GND之间的0.1uF陶瓷电容器,尽管该噪声已降至最低,但仍未达到所需的水平。因此,我必须对代码进行一些更改。首先,我记下了受噪声影响的读数。我发现噪声的最大值是10。因此,我以这样的方式编写程序,即只有在同一引脚的新值和旧值之间的差大于10时,它才会考虑新值。然后调谐到所需的频道。

  1. void loop()
  2. {
  3.   int channel1 =187 ,avg=0, newA;
  4.   static int oldA = 0;
  5.   int result = 0;
  6.   newA = analogRead(A0);
  7.   if ((newA - oldA) > 10 || (oldA - newA) > 10){
  8.    Serial.println(newA);
  9.   if(newA!= oldA){
  10.      channel = channel1+(newA/10);
  11.     myChangeChannel(channel);
  12.     oldA=newA;
  13.   }
  14. }
  15. }//loop end
复制代码

以下函数用于设置tune_config数组的字节,然后使用I2C协议将数据发送到RDA5807M。

  1. void myChangeChannel(int channel){ /* void if nothing is returned else int */
  2.    tune_config[2] = (channel >> 2);
  3.    tune_config[3] = ((channel & 0b11) << 6 ) | 0b00010000;
  4.       Wire.begin();
  5.       Wire.beginTransmission(RDA5807M_ADDRESS);
  6.       Wire.write(tune_config, TUNE_CONFIG_LEN);
  7.       Wire.endTransmission();
  8.   }
复制代码

Arduino FM收音机的工作过程

当模块上电时,我们的代码会复位RDA5807-M并将其设置为所需用户的通道(注意:该频率被视为将增加频率的基准频率)。通过更改电位器(连接到A0),Arduino Nano读取的值会更改。如果新值和旧值之间的差大于10,我们的代码将考虑该新值。根据新值与旧值之间的变化来更改通道。增大或减小音量取决于连接在引脚3和GND之间的电位器。

Arduino-Based-FM-Radio-using-RDA5807M-Receiver.jpg


电路搭建和代码编写完成后,您将拥有自己的FM收音机。希望您喜欢本篇文章并学到一些有用的东西。如果您对此项目有任何疑问,可以在本帖下面进行回复。


代码

以下是本文使用的完整代码: main.rar (2.32 KB, 下载次数: 33)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-12-4 01:16 , Processed in 0.038676 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表