使用 SparkFun 与 Arduino 组件打造可靠的 FM 收音机
元件与物料
| SparkFun FM 调谐器基础扩展板 - Si4703 | ×1 |
| SparkFun 扬声器 - 0.5 瓦 (8 欧姆) | ×1 |
| Adafruit 单色 0.96 英寸 128x64 OLED 图形显示屏 | ×1 |
| Texas Instruments LM386 - 音频放大器 - DIP-8 | ×1 |
| Arduino Nano R3 | ×1 |
| Adafruit 薄膜 1x4 键盘 | ×2 |
| Adafruit 4 通道 I2C 双向逻辑电平转换器 | ×1 |
| 伸缩天线 FM (F 型连接器) | ×1 |
| kenable 面板安装 F 型螺丝座 | ×1 |
项目简介
小时候我常自制 AM 收音机,但 FM 收音机因电路复杂从未成功。如今,硅片上即可集成完整的 FM 调谐器,但这些芯片多为贴片封装,爱好者难以焊接。所幸 SparkFun 推出了基于 Silicon Laboratories Si4703 芯片的 FM 调谐器基础扩展板,引出所有引脚。本文将展示如何围绕该扩展板打造完整 FM 收音机,并利用 Arduino 通过内置双线控制接口控制调谐功能。SparkFun 提供完整库文件,编程极为简便。
同时,项目加入了对比度极高、功耗极低的 OLED 显示屏。最后,我将演示如何用最少元件构建音质出色的单声道音频放大器。成品收音机由三节 5 号电池供电,可持续工作数小时。
SparkFun FM 调谐器基础扩展板与 I2C 串行总线
扩展板使用简单:先焊接排针以便插在面包板上。引脚排布如下图。在 ANT 引脚焊接一米细线即可作为天线。


- LOUT 和 ROUT 为左右声道输出,将接入放大器。
- 若不想自制放大器,可购买评估板直接配合耳机使用。
- 供电电压 Vcc 为 +3.3V。
- GND 为地。
Si4703 采用双线接口,即 I2C(Inter-integrated circuit,读作 I-squared-C 或 I-two-C),仅需两条双向线:串行数据线 (SDA) 和串行时钟线 (SCL),另加复位线 (RST)。Si4703 中 SDA 称为 SDIO,SCL 称为 SCLK。所有 Arduino 均内置 I2C。I2C 总线上,Arduino 作为主设备,Si4703 与 OLED 显示屏作为从设备。
I2C 总线电压与 Arduino 选型
Si4703 与 OLED 显示屏的 I2C 电平为 3.3V,SparkFun 官方指南建议使用 3.3V Arduino(如 Pro Mini),但 Pro Mini 缺 USB 接口,需 FTDI 下载器,且主频仅 8 MHz(Uno/Nano 为 16 MHz),实测驱动 OLED 显示屏速度不足。为保留显示屏,我选择 Arduino Nano (16 MHz,5V 电平),并通过双向 I2C 电平转换器连接 3.3V 总线。需电平转换的信号有 SDA、SCL、RST 共三路,故使用两个双通道转换器(也可用一个四通道转换器简化布线)。
Nano 与 Uno 功能近似但体积更小,均带 USB 接口,配合 Arduino IDE 极易上手。初期测试曾用 Uno。
原理图:Arduino 与收音机、显示屏的连接

系统由三节 5 号电池 (4.5V) 供电,直接接 Nano 的 5V 引脚,绕过板载稳压器。警告:通过 USB 连接电脑前,务必断开电池! 否则电脑 5V 与电池短路。调试阶段建议仅用 USB 供电,不接电池。若求稳妥,可用六节 5 号电池 (9V) 接 VIN 引脚,Nano 电源管理会在插入 USB 时自动切断电池供电(9V 方块电池续航仅数小时)。
Arduino SDA (A4) 与 SCL (A5) 接电平转换器高压侧,D2 作为 RST 信号。低压侧分别接 Si4703 的 SDIO、SCLK、RST。OLED 仅需接 SDA、SCL(我买的两色屏无 RST 引脚)。所有模块供电接 Nano 3.3V 输出与地。电平转换器高压侧需接 5V。D5-D12 接两块薄膜键盘,按键按下将对应输入拉低。
低电压音频放大器 LM386
采用 LM386 构建单声道放大器。LM386 问世于 1970 年代,专为低电压消费类音频设计(数据手册)。内部增益固定为 20,在引脚 1、8 间外接电阻电容可将增益调至 20-200。本项目使用默认增益 20,配合 8 欧姆扬声器已足够。


Si4703 音频输出端:R4 接 LOUT,R5 接 ROUT,两路合并为单声道。扩展板输出端已带电容,无需额外添加。R2、R3 分压降低输入电平,也可改用电位器调节音量,但本项目通过 I2C 数字控制 Si4703 输出电平 (1-15 级),配合 R2/R3 调整匹配放大器灵敏度(增大 R3 可提高音量)。
电路直接参考数据手册典型应用。C2 至少 220 µF,容值过小会削弱低频响应。C3 需贴近芯片放置,C3 与 C1 为可选。网上许多 LM386 项目反映音质差,多因地线布局不当。原理图中输入地与输出地分开,仅在芯片 4 号引脚汇合,这一点至关重要。参考 JohnAudioTech 相关视频可深入了解。
LM386N-1 最低工作电压 4V,输出功率数百毫瓦。本项目用 3 节 5 号电池 (4.5V),音量 1-10 级音质优良,15 级开始失真。若需更大音量,可将供电提升至 9V。低压供电下必须使用 8 欧姆扬声器,不可用 4 欧姆。
面包板原型调试
强烈建议先在两块面包板上搭建完整原型:一块放 Arduino、电平转换器、OLED;另一块放 Si4703 扩展板与音频放大器,两者靠近以减少声学干扰。我初期将 Si4703 靠近 Arduino、音频部分长线连接,导致严重失真。

Arduino 取 USB 供电,其 3.3V 输出供显示屏与收音芯片;LM386 单独用电池供电 (4.5-9V)。
程序代码
需引入以下库:
#include <SparkFunSi4703.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
SparkFun 库提供高层封装,无需处理底层细节;Adafruit 显示库教程见官网。安装库方法参考 官方指南。
关键定义:
// 按键引脚
#define volDown 9
#define volUp 10
#define channelDown 11
#define channelUp 12
// Si4703
#define resetPin 2
#define SDIO A4
#define SCLK A5
Si4703_Breakout radio(resetPin, SDIO, SCLK);
#define SI4703Address 0x10
setup() 中配置按键为上拉输入,初始化收音机,设定初始频率 88.2 MHz、音量 4。
主循环轮询按键,调用库函数 setVolume()、seekUp()、seekDown(),并更新 OLED 显示。完整代码含四个预设台按键、OLED 显示刷新(占用大量 RAM)、电池电压检测(利用 AVR 内部 1.1V 基准)等进阶功能。OLED 库无法自动识别屏幕尺寸,需手动修改 Adafruit_SSD1306.h 中的定义。
从面包板原型到成品收音机
原型验证无误后,将电路迁移至两块万用板并装入项目盒。Adafruit Collin 的教学视频《Breadboards & Perfboards》与《Perfboard Prototyping》极具参考价值。
我将 Nano 与两个电平转换器集成在一块万用板上:


制作万用板的关键在于 步骤 3:制定布线计划! 规划成败的分水岭。经验教训:黑色 22 AWG 导线过粗难操作,建议改用多色 30 AWG 缠绕线;万用板要买大尺寸;用排针与杜邦线连接模块。
第二块万用板集成 Si4703 与音频放大器。参考教程《From Schematics to Veroboard》或 JohnAudioTech 的 LM386 完整项目视频(含地线分离布局)。强烈建议 LM386 使用 IC 底座。
外壳制作参考 Collin 视频,纸胶带标记钻孔位、热熔胶固定组件。最终成品:

外壳略小,显示屏开孔用美工刀从内侧切割避免外观瑕疵,热熔胶固定。扬声器开孔打密集 3mm 小孔,背面粘贴。后加装面板安装 F 型座与伸缩天线,虽仅 50cm 长但接收良好,小喇叭音质惊艳。最神奇的是电池至今未更换,已连续收听数日。
同类项目推荐
最初受 Great Scott 视频启发(后期他也制作木质外壳)。更贴近本项目细节的是 John Owen 的 Si4703 Pocket FM Radio,同样使用 SparkFun 扩展板,代码中单声道合成与电池电压检测参考了他的实现。
代码与原理图资源
- 代码仓库: GitHub - FM-radio
- Fritzing 原理图: 原始文件与图片/PDF
制造工艺
- 无线电技术演进与工程:从马可尼到数字广播
- UnifiedWater v1 — 基于 Arduino MKR GSM 1400 的完整水质监测套件
- 树莓派 + Arduino 联手打造 Wi-Fi 网络收音机,畅听全球电台
- 自制防水淋浴 FM 收音机:Arduino Nano + RDA5807 + Nokia 5110 LCD + PAM8403
- 便携式 GSM 投票箱:基于 Hologram + IFTTT 实现云端数据采集
- DIY 打地鼠街机游戏(按键版)——Arduino Mega 2560 实现
- 构建高性能B类推挽音频放大器——基于TL082运放
- 555滞回振荡器——构建经典RC多谐振荡器
- 晶体管与晶体收音机电路:从基本检波器到集成 AM/FM 接收机
- 无线电基础:电磁波如何产生与传输
- 原子基射频传感器实现信号到达角测量,助力更清洁通信
- 地面无线电波传播:理解其对无线链路的影响