基于Arduino Nano与TEA5767模块的FM收音机DIY全流程解析 1. 项目概述从零打造一台属于自己的FM收音机作为一个玩了十多年嵌入式开发的老鸟我始终觉得最能体现硬件与软件结合魅力的项目往往不是那些最复杂的而是那些能让你亲手“造”出一个日常用品的。今天要分享的这个项目——用Arduino Nano和TEA5767模块制作一台FM收音机就完美符合这个标准。它不像智能家居网关那样需要复杂的网络协议栈也不像机器人那样需要精密的运动控制但它麻雀虽小五脏俱全涵盖了从电路设计、模块选型、I2C通信到状态指示、人机交互的完整嵌入式开发流程。这个项目的核心目标很简单制作一台能稳定接收87.7MHz到108.0MHz频段FM广播信号的收音机。听起来像是上个世纪的产品恰恰相反通过自己动手你能深入理解数字调谐收音机的工作原理掌握如何用微控制器通过I2C总线与专用射频芯片“对话”并设计出带有频道切换、状态指示的完整用户界面。无论是对于刚接触Arduino的新手想通过一个有趣的项目入门硬件编程还是对于有一定经验的开发者希望深入理解I2C通信和射频前端这个项目都是一个绝佳的练手选择。2. 核心硬件选型与电路设计思路2.1 主控与射频模块为什么是Arduino Nano和TEA5767在项目启动时硬件选型是第一步也是最关键的一步。我的选择是Arduino Nano作为大脑TEA5767作为收音机核心。Arduino Nano的优势在于其极佳的平衡性。它基于ATmega328P微控制器拥有足够的GPIO引脚本例中我们只需要用到少数几个、硬件I2C接口这对稳定控制TEA5767至关重要以及通过USB串口编程的便利性。相较于UNONano体积更小更适合嵌入到最终的作品外壳中相较于更小的Pro Mini它又自带USB转串口芯片省去了额外购买FTDI编程器的麻烦和成本。对于此类消费电子级别的原型开发Nano是性价比和易用性的最优解。TEA5767模块则是本项目的灵魂。这是一颗高度集成的单芯片FM立体声收音机IC。它内部集成了从天线输入到音频输出的几乎所有射频和中频电路包括低噪声放大器LNA、混频器、中频滤波器、鉴频器以及立体声解码器。这意味着我们不需要处理任何复杂的高频电路设计那需要专业的射频知识和昂贵的仪器只需要通过I2C总线向其发送简单的指令如目标频率它就能自动完成搜台、锁台、解调出立体声音频信号的全部工作。市面上常见的TEA5767模块已经将芯片、必要的电感电容、天线接口和音频输出接口集成在了一块小板上我们直接使用即可极大地降低了门槛。2.2 音频放大与电源方案解析TEA5767模块输出的音频信号功率很小不足以直接驱动扬声器因此需要一个音频功率放大电路。这里我选择了经典的LM386音频放大器模块。LM386是一款电压增益可调的芯片外围电路非常简单通常只需几个电容和电阻在6-12V供电下能提供数百毫瓦的驱动功率推动一个小型扬声器或耳机绰绰有余。选择现成的模块同样是为了简化制作过程。电源部分需要仔细考量。整个系统包含数字部分Arduino Nano 5V工作电压和模拟部分LM386 建议6-12V以获得更好输出功率。一种简单的方案是使用一块9V方块电池供电。9V电压可以直接给LM386供电同时Arduino Nano板载的5V稳压器AMS1117可以将9V降压为稳定的5V供自身和TEA5767模块使用。这种方案集成度高便于携带。注意如果你打算使用高于9V的电源如12V适配器务必确认你的Arduino Nano板上的5V稳压芯片通常是AMS1117的输入电压范围。虽然AMS1117最大输入电压可达15V但在12V输入下其功耗(12V-5V)*系统电流会较大导致芯片发热严重。长期使用可能不稳定甚至损坏。稳妥的做法是如果使用12V电源最好先通过一个独立的降压模块如LM2596将电压降至7-9V再供给整个系统。2.3 人机交互与状态指示设计一个完整的设备需要有与用户交互的界面。在这个收音机中我设计了两个机械按键用于切换电台两个LED用于指示状态。按键使用两个常开型轻触开关。一个定义为“上一台”btnEsq一个定义为“下一台”btnDir。它们连接到Arduino Nano的数字引脚并启用内部上拉电阻代码中INPUT_PULLUP这样按键未按下时引脚为高电平按下时变为低电平无需外部电阻简化了电路。LED使用两个不同颜色的LED如绿色和红色。绿色LEDledGreen可以设计为电源指示灯上电即亮。红色LEDledRed可以作为“调谐锁定”或“信号强度”指示灯本例代码中简单设置为常亮实际可扩展为根据TEA5767状态寄存器闪烁。LED需要串联一个限流电阻通常220Ω-1kΩ连接到Arduino的数字输出引脚。最终的电路连接可以严格遵循提供的原理图。核心是TEA5767模块的I2C引脚SDA, SCL分别连接到Arduino Nano的A4和A5引脚这是ATmega328P硬件I2C的固定引脚。音频输出接LM386输入LM386输出接扬声器。按键和LED按设计连接。电源正负极并联到所有模块的VCC和GND。3. 软件逻辑与核心代码深度剖析硬件是躯体软件是灵魂。下面我们逐行解析控制这台收音机的大脑——Arduino代码。3.1 库的引入与初始化配置代码开头引入了两个必要的库Wire.h和TEA5767Radio.h。Wire.h是Arduino核心库之一负责硬件I2C通信的底层驱动。TEA5767Radio.h是一个针对TEA5767的第三方库它封装了通过I2C读写TEA5767寄存器的复杂操作提供了像setFrequency()这样易于使用的函数。没有这个库我们需要手动研究TEA5767数十页的数据手册去配置寄存器工作量巨大。安装这个库通常可以通过Arduino IDE的库管理器搜索“TEA5767”完成。#include Wire.h #include TEA5767Radio.h接下来定义了引脚和全局变量。estacao数组预先存储了本地可接收的FM频率表。这是一种“预设电台”的思路避免了实现自动搜台的复杂性自动搜台需要不断读取TEA5767的信号强度寄存器逻辑更复杂。cont变量作为数组索引指向当前正在播放的电台。float estacao[25] {87.1, 89.1, 89.9, ... , 108.0}; // 本地电台频率列表 int cont 0; // 当前电台索引 TEA5767Radio radio TEA5767Radio(); // 创建收音机对象在setup()函数中完成了所有初始化工作配置按键引脚为输入模式并启用内部上拉电阻。配置LED引脚为输出模式。初始化I2C总线Wire.begin()。初始化串口用于调试输出当前频率可选但非常有助于排查问题。将两个LED点亮作为系统启动完成的指示。3.2 核心控制逻辑按键扫描与频率设置整个系统的核心逻辑集中在自定义的radioFM()函数中它在loop()中被循环调用。void radioFM() { estadoBtnEsq digitalRead(btnEsq); estadoBtnDir digitalRead(btnDir); if (!estadoBtnEsq) { // 如果“下一台”按键被按下低电平 cont; delay(100); // 简单防抖 } if (!estadoBtnDir) { // 如果“上一台”按键被按下低电平 cont--; delay(100); } // 限制索引范围防止数组越界 if (cont 0) { cont 0; } else if (cont 24) { // 注意数组索引最大是2425个元素 cont 24; } // 核心操作通过I2C向TEA5767写入新的频率 radio.setFrequency(estacao[cont]); // 通过串口打印当前频率便于调试 Serial.print(estacao[cont]); Serial.println( MHz); delay(800); // 设置频率后等待稳定并防止过于频繁切换 }这段代码的逻辑非常清晰扫描两个按键的状态根据按键改变电台索引cont然后将estacao[cont]对应的频率值通过radio.setFrequency()函数发送给TEA5767芯片。这里的delay(100)和delay(800)有两个作用一是简单的按键消抖防止一次按下被误读多次二是给TEA5767芯片留出足够的频率切换和锁相环PLL锁定时间确保接收稳定。实操心得delay(800)这个值可以根据实际情况调整。如果感觉切换电台后声音建立太慢可以适当减小如果发现切换时出现杂音或锁台不稳可以适当增大。更好的做法是用millis()函数实现非阻塞的定时这样在等待频率锁定的同时系统还能响应其他操作比如按键连按但当前简单逻辑已足够可靠。4. 制作流程详解与组装技巧有了清晰的电路图和代码接下来就是动手实现的环节。这个过程能让你对“系统集成”有更深的理解。4.1 结构件制作与外壳处理原项目使用了木质外壳这是一个不错的选择能获得较好的声学共鸣外观也有质感。制作时有几点需要注意木材选择优先选择松木、桐木等软质木材易于切割和打磨。厚度在5-8mm为宜太薄易共振太厚加工困难。开孔规划在粘合盒子前务必在面板上规划并开好所有孔位。包括扬声器出声孔可在内部贴一层防尘纱网、电位器旋钮孔、两个按键孔、LED孔以及可能的电源开关孔。使用手电钻配合合适尺寸的钻头或开孔器是最佳选择。打磨与处理粘合组装后用不同目数的砂纸如先180目后400目仔细打磨边角毛刺和表面。打磨后可以上木蜡油或清漆不仅能提升美观度还能防止木材受潮变形。内部布局在盒子内部用电烙铁或热熔胶枪固定一个小的万能板洞洞板将所有电子模块Arduino Nano, TEA5767, LM386和接线端子焊接或插接在这块板上然后再将整板固定到木盒内。这样比将所有模块散乱地用胶粘更规整也便于后期维修。4.2 电路焊接与模块集成焊接是连接理论设计与实物成败的关键一步。电源走线优先在洞洞板上首先布置好电源VCC和地GND的走线。建议使用较粗的导线或直接利用洞洞板背面的铜箔走电源总线确保供电稳定。信号线与电源线分离尽量让音频信号线从TEA5767到LM386输入、I2C信号线SDA, SCL远离电源线和LM386的输出大电流线路平行走线时保持一定距离以减少噪声干扰。TEA5767天线模块上的天线焊盘通常需要接一段导线作为天线。最佳实践是焊接一根长约70-90cm的导线FM波长的1/4并将其松散地盘绕在盒子内部或引到盒外。天线的长度和位置对接收灵敏度有显著影响需要实际测试调整。LM386增益设置常见的LM386模块上有一个跳线帽或焊盘用于选择增益20倍或200倍。如果推动小扬声器20倍增益通常足够且噪声更小。如果感觉音量不足再切换到200倍增益。4.3 系统联调与功能测试所有硬件连接完成后不要急于装盒先进行开盖测试。上电前检查这是最重要的安全步骤。用万用表通断档仔细检查电源正负极之间有无短路特别是Arduino Nano和LM386的电源输入引脚附近。分模块测试先只给Arduino Nano上电通过串口监视器观察是否有启动信息按键按下时串口打印的频率是否变化正常。此时LED应点亮。然后连接TEA5767模块确保I2C线已接上传完整代码。通过串口监视器确认频率设置指令能正常发送。最后连接LM386和扬声器。此时应能听到电流噪声。当频率切换到有电台的位置时应能听到清晰的广播声。调节电位器音量应有变化。灵敏度与音质调试收台少/杂音大首先检查天线是否连接良好并充分展开。尝试改变天线的位置和形态。其次检查整个系统的接地是否良好所有模块的GND是否可靠连接到了一起。有“滋滋”高频噪声这很可能是电源噪声。尝试用一块电池供电测试如果噪声消失说明开关电源适配器质量不佳。可以在LM386的电源引脚附近并联一个100μF的电解电容和一个0.1μF的瓷片电容来滤波。声音失真可能是LM386输入信号过强TEA5767输出幅度过大可以在TEA5767音频输出和LM386输入之间串联一个10kΩ的可变电阻作为音量电位器的一部分进行衰减调试。5. 进阶优化与扩展方向一个基础功能实现后便是发挥创意进行优化的好时机。这里提供几个提升体验的扩展思路。5.1 软件功能增强当前的代码实现了最基础的预设电台切换我们可以让它变得更智能自动搜台与存储利用TEA5767的信号强度指示SI和立体声指示ST寄存器可以实现自动搜台功能。逻辑是从87.5MHz开始以0.1MHz为步进增加频率读取每个频点的信号强度当强度超过一定阈值且稳定时认为找到一个电台将其频率存入EEPROMArduino的非易失存储器。这样就能自动保存当前环境下所有能收到的台。频率数字化显示增加一个I2C接口的OLED屏幕如SSD1306可以实时显示当前频率、电台名称需预先定义、信号强度等信息用户体验瞬间提升一个档次。基于旋转编码器的调谐用旋转编码器替代两个按键可以实现快速粗调和慢速微调操作更符合传统收音机的习惯。编码器库如Encoder.h可以很好地处理正反转脉冲计数。5.2 硬件性能提升外接天线与放大器对于信号较弱的地区可以购买专用的FM有源天线带放大功能其效果远优于一段导线。将TEA5767模块上的天线输入端通过同轴电缆连接至这种天线接收能力会大幅增强。音频处理在LM386之前可以加入一个简单的音调控制电路例如基于运放或专用音调芯片如TDA1524A的电路实现高音、低音的调节让音质更符合个人喜好。电源管理增加一个锂电池充电管理模块如TP4056和一块18650锂电池实现可充电、便携的无线播放。同时可以编写代码监测电池电压并在OLED上显示电量。5.3 常见问题排查速查表在制作和调试过程中你可能会遇到以下问题。这里提供一个快速排查指南现象可能原因排查步骤与解决方案上电后无任何反应LED不亮1. 电源未接通或电压不对。2. Arduino Nano损坏或焊接短路。1. 用万用表测量供电电压是否在7-12V之间Nano上5V引脚是否有5V输出。2. 检查电源线正负极是否接反板上是否有焊锡短路。串口有频率输出但完全无声音无电流噪声1. LM386模块未工作或损坏。2. 扬声器损坏或未接好。3. 音量电位器处于最小位置或损坏。1. 触摸LM386输入端扬声器应发出“嗡嗡”感应噪声。若无检查LM386供电及芯片。2. 用电池直接点触扬声器两端应有“咔咔”声。3. 短接电位器输入输出端或调节测试。有电流噪声但收不到台1. TEA5767模块未工作或I2C通信失败。2. 天线未接或接触不良。3. 频率数组设置错误不在本地频段。1. 检查I2C连线A4/A5尝试用I2C扫描程序确认TEA5767地址通常是0x60。2. 确保天线导线已焊牢并展开。3. 通过串口确认设置频率值正确如107.9并尝试手动设置一个强电台频率测试。能收到台但杂音很大不稳定1. 电源噪声干扰。2. 天线效率低或位置不佳。3. 信号本身弱。1. 改用电池供电测试如改善则需加强电源滤波加大电容。2. 调整天线长度~75cm和位置远离电源等干扰源。3. 考虑使用外接有源天线。切换电台时响应慢或有爆音1. 代码中delay(800)时间过长或过短。2. LM386输入端耦合电容过小。1. 调整delay(800)这个值在100ms到1000ms间尝试。2. 在LM386输入对地并联一个0.1μF电容或增大输入耦合电容值。按键控制不灵敏或连跳按键消抖不足。除了delay(100)可采用更可靠的消抖逻辑如检测到按键按下后等待状态稳定再执行动作或使用中断状态机的方式。这个项目最吸引我的地方在于它用一个相对简单的框架串联起了嵌入式开发的多个核心概念。当你亲手拧好最后一个螺丝转动旋钮清晰的广播声从你自己制作的小木盒里传出来时那种成就感是单纯的软件编程无法比拟的。它提醒我们代码的世界并非虚无它可以通过电线、芯片和扬声器与现实世界产生如此直接而美妙的共鸣。如果你在复现过程中卡在了某个环节别着急回头仔细检查电源、接地和信号线百分之九十的问题都出在这几个基础环节。享受这个从无到有的创造过程吧。