项目分享| 致敬经典收音机,围观制作过程

不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我

十多年前,收音机电路大多数还是采用分立元件构成的。现在用Arduino NanoSparkFun Si4703 FM收音调谐模块就可以实现了,还带有炫酷的显示屏,简单方便:

项目来源:hackster.io
编译:王同学

下面就给大家分享如何使用Si4703构建完整的FM收音机,如何使用Arduino通过内置的两线式控制界面控制调谐器功能,以及如何用最少的零件制造出音质出色的单声道音频放大器。

硬件组成
先来说说核心芯片,想要做出完整的FM收音机调谐器,肯定要使用专用的芯片,比如SiliconLaboratories 的Si4703 FM收音机调谐器芯片。在一些购买渠道上有模块售卖,模块引出Si4703的所有引脚,使用起来非常方便。上面视频中使用的Sparkfun模块,提供了一个完整的库,使其易于编程。
FM调谐模块的主要引脚功能:
LOUT和ROUT是左右输出通道,后面就连接到放大器电路。
电源电压Vcc为3.3v。
I2C总线接口:SDIO、SCLK,允许通过串行通信从Arduino控制调谐器。
RST为复位接口。
Arduino做主机,而Si4703和OLED显示屏做从机。
I2C总线电压和Arduino的选择 
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移位器,可以帮助节省一些连接线。
Arduino与调谐模块和OLED的原理图连接
接下来,让我们看一下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构建单声道放大器
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 A5Si4703_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轻松控制无线电成为可能。

(0)

相关推荐