- RDA5807M集成电路
- 集成电路PT2258
- 原理图
- 所需组件
- 我们如何从Google Assistant获取数据?
- 设置一个Adafruit帐户进行交流
- 为FM广播设置IFTTT经纪人
- Arduino代码和说明
- 使用Arduino测试语音控制FM收音机
- 进一步增强
如今,我们大多数人都喜欢通过智能手机听音乐。但是几年前,情况并非如此,那时,FM收音机是收听音乐,播客,新闻和其他内容的首选。如今,没有人听广播中的音乐,新闻和其他新闻,奶奶和爷爷是一个例外。
因此,为了稍微恢复FM广播的旧荣耀,在这个项目中,我将使用Google Assistance 和流行的RDA5870M Superheterodyne接收器IC来构建语音控制FM广播。
另外,请检查我们以前的FM广播电路:
- 基于Arduino的FM收音机
- 使用Arduino的智能手机控制FM收音机
- 简单的FM发射器电路
- 如何建立FM发射电路
RDA5807M集成电路
RDA5807M是一款非常现代的单芯片FM立体声无线电调谐器,具有完全集成的合成器,IF选择性,RDS / RBDS和MPX解码器,支持50MHz至115MHz的频率范围。这是一种非常便宜的单芯片FM接收器IC,只需很少的外部组件即可运行。该IC使用I2C接口与任何主设备进行通信,因此所有这些功能使其非常适合便携式设备。
该IC具有内部音频处理器,这是其出色的音频质量的原因。
一些基本功能包括-
- 支持全球频段
- 支持RDS / RBDS
- 数字低中频调谐器
- 完全集成的数字频率合成器
- 数字自动增益控制(AGC)
- 低音增强
- 直接支持32Ω电阻负载
- 集成LDO稳压器等
您可以通过使用RDA5807进行基于Arduino的FM Radio项目来了解有关此IC的更多信息。
集成电路PT2258
PT2258是用作6通道电子音量控制器的IC ,该IC使用专门为多通道音频视频应用设计的CMOS技术。
该IC提供I2C控制接口,衰减范围为0至-79dB,步长为1dB,采用20引脚DIP或SOP封装。
一些基本功能包括-
- 6输入和输出通道(用于5.1家庭音频系统)
- 可选的I2C地址(用于菊花链应用)
- 高通道分离度(用于低噪声应用)
- 信噪比> 100dB
- 工作电压为5至9V
先前我们在PT2258数字音频音量控制项目中对此IC进行了解释。如果您想进一步了解该IC,可以检查该项目。
原理图
Google Assistant控制的FM收音机的电路图如下:
所需组件
- NodeMCU微控制器– 1
- PT2258数字音量控制器– 1
- RDA5807 FM收音机模块– 1
- SPDT继电器6V – 1
- 1n4007二极管– 1
- 螺丝端子5mmx2 – 1
- 3.5毫米耳机插孔– 1
- 逻辑电平转换器– 1
- 10K电阻器,5%-4
- 150K电阻器,5%-4
- 100K电阻器,5%-2
- 10uF电容器– 6
- 0.1uF电容器– 1
- 跳线-10
我们如何从Google Assistant获取数据?
上图为您提供了Google Assistant和NodeMCU之间通信过程的基本概念。
Google助理有权修改Adafruit IO服务器中的数据,以使使用MQTT的IFTTT充当代理。
如果服务器端(Adafruit IO)发生任何数据更改,则这反映在NodeMCU端。为此,您需要按照以下说明进行操作-
设置一个Adafruit帐户进行交流
首先,创建一个Adafruit IO帐户。使用您的凭据登录到Adafruit IO,或者如果没有帐户,请注册。我们以前使用Adafruit IO来构建Alexa控制的LED,Raspberry Pi家庭自动化以及许多其他基于IoT的项目。
登录到Adafruit帐户后,
单击仪表板,然后单击 操作>创建新仪表板 。
接下来,我们将为新仪表板添加一个新名称和简短描述。
创建仪表板后,您需要从帐户中获取用户名和活动密钥,这是Arduino代码中所要求的。您可以通过单击KEY图标来获得。
之后,做三个方块;一个切换块,一个量块,一个文本块。
这些块非常重要,因为这些块负责Google协助和NodeMCU之间的通信。
要进行屏蔽,您需要单击右上角的+号。
接下来,我们将做块。
接下来,您需要设置每个块,为此,您需要在特定块上打钩并单击“下一步”。
对于此项目,除了切换按钮外,无需更改任何设置。
切换按钮中的文本为大写字母,您需要将其设置为小写字母并更新更改。
就是这样,这是您在adafruit IO中设置所需的所有内容。
我的最终屏幕看起来像这样-
为FM广播设置IFTTT经纪人
与往常一样,注册,如果你没有一个帐户,或登录如果您已经拥有一个帐户。
现在,您需要创建一个Applet。为此,请按照以下步骤操作:
要制作小程序,请单击您的帐户图标,然后单击创建。
在创建屏幕中,如果之后单击+图标。
之后,您需要允许访问您的Google帐户。
为此,您需要在搜索栏中搜索Google Assistant,然后单击Google Assistant图标。
在下一屏中,我们必须选择一个触发器,
记住,我们在Adafruit IO Server中创建了三个模块,我们需要为这三个模块创建触发器。
首先,为此,我们需要选择 说出带有文字成分的短语 。
在下一个屏幕中,我们必须输入 您想说的 内容以及Google助手应该回复您的内容。
然后单击创建触发器按钮。
接下来的屏幕看起来是这样的,因为你已经完成了 。如果 一部分,它的时间 ,然后 部分,点击+后标志 则 。
将显示如下图所示的屏幕,搜索Adafruit,然后单击Adafruit图标。
接下来,使用IFTTT授权您的Adafruit帐户,然后单击“连接”。
接下来,您必须单击“将数据发送到Adafruit IO”。
然后,您将看到您之前在Adafruit帐户中创建的Feed的下拉菜单。
选择任何一个,然后单击“创建动作”,这三个步骤都需要执行。
这样,标志着IFTTT流程的结束,我的小程序最终屏幕如下所示,
Arduino代码和说明
那里有Arduino代码来管理IC之间以及Adafruit IO IFTTT和WIFI之间的所有通信。本教程末尾提供了此Arduino Nano FM收音机的完整代码。代码有点冗长和复杂,这里我们逐行解释了完整的代码。
首先,我们需要包括所有必需的库,它们是:
#包括
然后,为WI-FI定义SSID和密码,这是路由器的SSID和PASSWORD。
const char * ssid =“ Android”; //路由器的SSID const char * password =“ 12345678”; //路由器的密码
然后,我们定义两个布尔值和一个变量,布尔值用于保存IC的通信状态,而volume变量用于设置音量。
bool potStatus; //当MCU与IC bool radioStatus之间建立通信时为1;//当MCU与IC之间的通信建立时int = 15;否则为1;// IC的默认音量级别以
然后,我们设置一个名为 Relay_Pin 的GPIO引脚来打开或关闭放大器。
#define Relay_Pin D7 //此引脚用于打开和关闭无线电
接下来,我们需要定义所有与Adafruit IO通信的必要定义。
#define AIO_SERVER“ io.adafruit.com” #define AIO_SERVERPORT 1883 //为SSL使用8883 #define AIO_USERNAME“ debashis13” //用您的用户名替换#define AIO_KEY“ aio_Qyal47xo1fYhc55QB1lEPEirnoFp” //用您的项目Auth密钥替换
以下定义 FIX_BAND 是该库使用的专有定义。
下一条已定义的语句设置模块的内部容量。
#define FIX_BAND RADIO_BAND_FM // <该草图将调谐的波段是FM。#define FIX_RADIO_VOLUME 6 /// <模块的默认体积。
接下来,为PT2258,RDA5807M和 WiFiClient 创建所需的对象 。
PT2258 digitalPot; // PT2258对象RDA5807M无线电; // RDA5807M对象WiFiClient客户端; // WiFiClient对象
然后通过传入WiFi客户端和MQTT服务器以及登录详细信息来设置MQTT客户端类。
Adafruit_MQTT_Client mqtt(&client,AIO_SERVER,AIO_SERVERPORT,AIO_USERNAME,AIO_KEY);
//通过传入WiFi客户端和MQTT服务器以及登录详细信息来设置MQTT客户端类。
然后,我们需要订阅一个提要。 您可能会问什么?
如果某些值,某些参数在Adafruit服务器中发生更改,则更改将在此处反映出来。
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe(&mqtt,AIO_USERNAME“ / feeds / Radio_Station”); //用于订阅Feed的方法Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe(&mqtt,AIO_USERNAME“ / feeds / Toggle_FM”); //订阅Feed的方法Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe(&mqtt,AIO_USERNAME“ / feeds / Volume”); //用于订阅Feed的方法
下面是 MQTT_connect() 函数的函数原型。
void MQTT_connect(); // MQTT Connect的函数原型
然后,我们开始设置过程。首先,我们使用begin方法开始UART通信。
Serial.begin(9600); // UART开始Serial.println(); //添加额外的行以隔开Serial.println(); //添加额外的行以隔开接下来,我们完成所有与WiFI相连的常规操作**************** WiFi连接所需的所有常用功能*********************** / Serial.print(“ connecting to”); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid,密码);而(WiFi.status()!= WL_CONNECTED){delay(500); Serial.print(“。”); } Serial.println(“”); Serial.println(“ WiFi已连接”); Serial.println(“ IP地址:”); Serial.println(WiFi.localIP()); / **************** WiFi连接所需的所有常用物品*********************** /
接下来,调用 Wire.begin() 方法实例化I2C连接,我们调用 Wire.setClock() 方法将I2C频率固定为100KHz,因为这是PT2258 IC的全速。
Wire.begin(); //开始I2C启动序列Wire.setClock(100000); //将I2C时钟设置为100KHz
接下来,为PT2258和RDA5807 IC调用 init() 方法,并将返回状态保存为先前定义的布尔值。
potStatus = digitalPot.init(); radioStatus = radio.init();
接下来,检查MCU是否能够与IC通信。我们使用两个 if else 语句执行此操作。
如果(potStatus){Serial.println(“找到PT2258设备!”); } else {Serial.println(“无法启动PT2258”); } if(radioStatus){Serial.println(“ Found RDA5807M Device!”); } else {Serial.println(“无法启动RDA5807M”); }
接下来,从MQTT库中调用subscription方法。如果我们订阅的提要中发生任何更改,MQTT服务器将通知我们。
mqtt.subscribe(&Radio_Station); //为Radio_Station feed mqtt.subscribe(&Toggle_FM);设置MQTT订阅 //为Toggle_FM feed mqtt.subscribe(&Volume);设置MQTT订阅 //为批量供稿设置MQTT订阅
接下来,我们将中继引脚设置为输出,并将引脚状态设置为低电平
pinMode(D7,输出); digitalWrite(D7,LOW);
接下来,设置一个预定的无线电音量,此参数设置RDA5807 IC的内部音量,这标志着我们设置过程的结束。
radio.setVolume(FIX_RADIO_VOLUME); //接下来,我们设置标准化广播音量radio.setMono(false); //我们不希望芯片提供单声道输出radio.setMute(false); //我们不希望芯片在开始时静音
我们通过调用 MQTT_connect() 函数开始循环,该函数建立与MQTT服务器的连接。
在MQTT连接功能中,我们尝试进行三次以建立与MQTT服务器的连接。
如果成功,则会收到一条成功消息,否则会收到一条错误消息。
无效的MQTT_connect(){int8_t ret; // 8位整数,用于存储重试//如果已连接,则停止。如果(mqtt.connected()){返回;} Serial.print(“正在连接到MQTT…”); uint8_t重试= 3; while((ret = mqtt.connect())!= 0){// connect将为连接的Serial.println(mqtt.connectErrorString(ret))返回0。Serial.println(“正在5秒钟内重试MQTT连接…”); mqtt.disconnect(); 延迟(5000); //等待5秒钟重试-; if(retries == 0){//基本上死了,等待WDT在(1)时将我重置;}} Serial.println(“ MQTT已连接!”); }
接下来,首先创建一个指向 Adafruit_MQTT_Subscribe 对象的指针。我们将使用它来确定接收到哪个订阅。
Adafruit_MQTT_Subscribe *订阅;
接下来,我们等待订阅消息。
对于来自MQTT服务器的任何消息, mqtt.readSubscription(timeInMilliseconds) 将侦听特定时间。
如果在超时之前收到消息,它将用指向订阅的指针进行回复,或者只是超时并返回0。在这种情况下,它将等待2秒。
而((subscription = mqtt.readSubscription(20000)))
如果发生超时,则 while 循环填充将失败。如果没有,我们将比较哪些订阅,并将获得我们的已知订阅。
在此代码中,我们对所有三个订阅的提要进行此操作。
if(订阅==&Toggle_FM)if(订阅==&Radio_Station)if(订阅==&Volume)
这些是您需要在循环部分中理解的主要三个参数。
代码的此部分用于监视和设置 Toggle_FM 提要。
if(subscription ==&Toggle_FM)//是否是来自Toggle_FM Feed的消息{Serial.print(F(“ Got:”)); Serial.println((char *)Toggle_FM.lastread); //打印Feed数据仅用于调试,如果(String((char *)Toggle_FM.lastread)== String(“ on”))//我们将接收到的数据与已知参数进行比较,在这种情况下,我们期望“ on “是来自服务器{//,但是在此之前,我们必须将其设置为字符串,从而使comparisin超级简单digitalWrite(D7,HIGH); //如果我们从服务器上获得“ on”字符串, D7引脚HIGH} if(String((char *)Toggle_FM.lastread)== String(“ off”))// //我们再次检查字符串off {digitalWrite(D7,LOW); //如果得到一个来自服务器的“关闭”字符串,我们将D7引脚设为LOW}}
代码的此部分用于监视和设置 Radio_Station 提要。
如果(订阅==&Radio_Station){Serial.print(F(“ Got:”)); Serial.println((char *)Radio_Station.lastread); if(String((char *)Radio_Station.lastread)== String(“ Big FM”))//听到我们正在检查字符串Big FM {radio.setBandFrequency(FIX_BAND,9270); //如果上述条件为真,则将radoi通道设置为92.7MHz} //上述过程在if(String((char *)Radio_Station.lastread)== String(“ Red FM”)){ radio.setBandFrequency(FIX_BAND,9350); } if(String((char *)Radio_Station.lastread)== String(“ Radio Mirchi”)){radio.setBandFrequency(FIX_BAND,9830); }}
代码的此部分用于监视和设置音量Feed。
if(subscription ==&Volume)// //听到我们正在检查字符串Volume,它是字符串格式的整数值//我们必须将其转换回整数以借助PT2258更改音量IC Serial.print(F(“ Got:”)); Serial.println((char *)Volume.lastread);体积= atoi((char *)Volume.lastread); //我们正在使用atoi()方法将字符指针转换为整数volume = map(volume,0,100,79,0); // map(value(fromLow,fromHigh,toLow,toHigh)// //因为pt2258仅了解以dB为单位的整数值// //我们将0dB-79dB的值映射到0%-100%。 digitalPot.setChannelVolume(volume,0); //毕竟,我们要设置PT2258 IC digitalPot.setChannelVolume(volume,1)的通道0的音量; //毕竟,我们要为PT2258 IC的通道1设置音量}}
使用Arduino测试语音控制FM收音机
为了测试电路,使用了以下设备-
- 具有13-0-13抽头的变压器
- 两个4Ω20W扬声器作为负载。
- 电话以使用Google助手。
在上一篇文章中,我向您展示了如何使用TDA2050 IC制作一个简单的2x32瓦音频放大器,我还将在演示中使用它。
我弄乱了机械电位计,并用两条小的跨接电缆将两条引线短路了。现在,借助两个按钮,我能够更改放大器的音量。
进一步增强
可以对该电路进行许多进一步的增强。
- 由于音频源在NodeMCU旁边工作,因此存在各种噪声问题,因此我们需要实现额外的屏蔽以提高抗扰性。
- 将整个电路构建到PCB上将提高抗扰性。
- 可以在该IC上添加其他滤波器以消除噪声。
希望您喜欢本文并从中学到新东西。如有任何疑问,可以在下面的评论中提问,也可以使用我们的论坛进行详细讨论。