不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我
十多年前,收音机电路大多数还是采用分立元件构成的。现在用Arduino Nano和SparkFun Si4703 FM收音调谐模块就可以实现了,还带有炫酷的显示屏,简单方便:
下面就给大家分享如何使用Si4703构建完整的FM收音机,如何使用Arduino通过内置的两线式控制界面控制调谐器功能,以及如何用最少的零件制造出音质出色的单声道音频放大器。
先来说说核心芯片,想要做出完整的FM收音机调谐器,肯定要使用专用的芯片,比如SiliconLaboratories 的Si4703 FM收音机调谐器芯片。在一些购买渠道上有模块售卖,模块引出Si4703的所有引脚,使用起来非常方便。上面视频中使用的Sparkfun模块,提供了一个完整的库,使其易于编程。LOUT和ROUT是左右输出通道,后面就连接到放大器电路。I2C总线接口:SDIO、SCLK,允许通过串行通信从Arduino控制调谐器。Arduino做主机,而Si4703和OLED显示屏做从机。Si4703和I2C总线上的OLED显示屏使用的电压为3.3v。因此,最好使用3.3v 的Arduino,比如Arduino Pro Mini。但是有两个问题:一是它缺少USB连接器并且必须通过FTDI分支进行编程,有点困难。二是Arduino Pro Mini以8 MHz运行,是Arduino Uno或Nano的速度的一半,无法驱动OLED屏幕。因此决定使用Arduino Nano(16 MHz),I2C总线上的信号是5v电平,这时需要使用双向I2C逻辑电平转换器(I2C移位器)连接到3.3v总线信号显示屏和调谐芯片。由于总共需要对三个信号进行电平转换:SDA,SCL和RST,所以使用两个I2C移位器。如果使用具有4个信号的I2C移位器,可以帮助节省一些连接线。接下来,让我们看一下Nano周围的接线以及I2C总线连接的详细信息。收音机可以用三个AA电池(4.5伏)供电。电池输出不经过稳压直接连接到Arduino Nano的5v引脚。也可以通过USB供电,但是在通过USB将Nano连接到计算机之前,务必断开电池连接!否则,计算机的5v电压将与电池短路。Arduino SDA(A4)和SCL(A5)连接到I2C移位器的5v侧。此外,将D2用作RST信号。在I2C移位器的3.3伏v,连接到Si4703的SDIO,SCLK和RST。对于OLED显示器,只需连接到SDA和SCL即可。Arduino IO引脚D5-D12连接到两个键盘,按下按钮会将输入连接到地面。LM386是一款非常经典的运放,专为低压消费类应用而生的功率放大器。内部将增益设置为20,外部零件器件数量较少。可以在pin 1和pin 8之间添加外部电阻和电容器会将增益增加到20至200之间的任何值。如果使用8欧姆扬声器,则20的增益足够高了。
点击放大查看
首先让我们看一下Si4703。左侧显示了与Arduino的I2C信号连接。音频输出通道的连接方式如下:电阻R4连接至LOUT,R5连接至ROUT。然后将这两个信号合并为MONO信号(单声道信号)。Si4703模块的输出端上有电容器,因此我们无需添加电容器。R2和R3组成了一个分压网络,以减小放大器的输入信号电压。当然可以用电位计代替R2和R3并用它来调节音量。但是我们想以数字方式控制音量。Si4703的输出电平可以在I2C上从1逐步增加到15。使用R2 / R3,可以通过试验不同的电阻将其与放大器匹配。例如,如果增加R3,则音量会增加。该电路直接取自数据手册。C2必须至少为220 µF。较小的值会减弱小信号响应。如果要增强小信号输出,请查看数据表。在试验板上建立电路,并尝试添加/删除元件:C3必须放置在靠近芯片的位置。C3和C1是可选的。LM386N-1的最低电压为4 V,输出功率为数百毫瓦。我用3节AA电池(4.5伏)运行,可以在1到10之间改变音量,听起来确实不错。但是,对于如此低的电源电压,使用8欧姆(而非4欧姆)扬声器非常重要。如果我将音量提高到15,则声音开始失真。如果您真的想让收音机的声音大声播放,请将电源电压增加到9伏。先在面包板上完成这个设计。将Arduino,I2C移位器和OLED显示器放在一个面包板上,同时将Si4703模块和音频放大器放在另一个面包板上并紧密放置,以将声音失真降至最低。在我的第一个原型设计中,我使Si4703靠近Arduino,并在音频部分连接了较长的信号电缆(参见图片),这导致了失真。
通过USB给Arduino供电,Arduino输出稳定的3.3伏为显示器和调谐模块供电。用电池(4.5-9伏)为LM386供电。#include<SparkFunSi4703.h>
#include<SPI.h>
#include<Wire.h>
#include<Adafruit_GFX.h>
#include<Adafruit_SSD1306.h>
如果不知道怎么安装库,可以在分享的文件里找到Sparkfun库,该库提供了与Si4703对话的高级功能,而无需关心所有微小的细节。可在此处找到带有教程的Adafruit显示库:https://learn.adafruit.com/monochrome-oled-breakouts/arduino-library-and-examples// Input buttons on radio
#define volDown 9
#define volUp 10
#define channelDown 11
#define channelUp 12
// Si4703 radio chip
#define resetPin 2
#define SDIO A4
#define SCLK A5
Si4703_Breakout radio(resetPin, SDIO, SCLK);
#define SI4703Address 0x10 // Si4703 I2C Address.
#define的使用是使源代码更具可读性的一种方式。一劳永逸地定义了volDown指的是引脚9之后,每次您指D9时都要写volDown。
接下来,我们看设置部分:
// Variables definition
int channel;
int volume;
void setup()
{
// Set internal pull up resistors on inputs
pinMode(volDown, INPUT_PULLUP);
pinMode(volUp, INPUT_PULLUP);
pinMode(channelUp, INPUT_PULLUP);
pinMode(channelDown, INPUT_PULLUP);
// Initialise radio
radio.powerOn();
channel = 882;
radio.setChannel(channel);
volume = 4;
radio.setVolume(volume);
}
引脚9-12定义为输入引脚。参数INPUT_PULLUP将+ 5V的内部上拉电阻(在ATmega芯片内部)连接到输入引脚。因此,除非您按下按钮(按下的按钮= LOW),否则该引脚的信号电平将为HIGH。
Sparkfun库使用主要功能powerOn(),setChannel()和setVolume()使通过I2C轻松控制无线电成为可能。