1. 项目概述与核心思路几年前我在整理一堆旧电子元件时翻出了一个老旧的TEA5767模块这让我想起了学生时代用收音机听广播的日子。现在数字流媒体当道但调频广播那种“拧旋钮找台”的仪式感和偶尔收到的意外惊喜是算法推荐给不了的。于是我决定用这个模块结合手头最常用的Arduino做一个属于自己的、带点复古味道的FM收音机。这不仅仅是一个简单的焊接和烧录程序的过程更是一次对模拟信号处理、I2C通信和嵌入式系统设计的重温。这个项目本质上是一个典型的嵌入式系统应用核心是利用Arduino作为微控制器通过I2C总线协议控制TEA5767这颗高度集成的FM收音机芯片完成从天线信号接收、频率调谐、中频处理到立体声解调的全过程。得到的音频信号非常微弱所以我们还需要LM386这颗经典的音频功率放大器来驱动扬声器让它能发出足够响亮和清晰的声音。最终我们通过两个按钮实现电台切换用LED做状态指示并把它装进一个自己制作的木质外壳里让它从一个实验板上的电路变成一个可以摆在桌面上使用的实体设备。无论你是刚接触Arduino和电子制作的新手想通过一个综合性项目练手还是有一定经验的开发者希望深入了解I2C通信和射频接收的细节这个项目都能提供一条清晰的路径。它涵盖了从硬件选型、电路连接、库函数调用、到结构设计和问题调试的完整流程你会学到如何让不同的模块协同工作并亲手做出一个既有用又有成就感的作品。2. 核心硬件选型与原理剖析2.1 主控与收音核心为什么是Arduino Nano和TEA5767选择Arduino Nano作为大脑主要基于其极佳的平衡性。它体积小巧非常适合嵌入到最终成品中拥有足够的I/O口来控制按钮、LED和I2C通信最重要的是其庞大的社区和丰富的库资源让驱动TEA5767这样的芯片变得异常简单。你几乎不需要从零开始编写复杂的寄存器配置代码。TEA5767芯片则是本项目的灵魂。这是一颗单芯片的FM立体声收音机IC它把传统超外差式收音机里复杂的高频放大、本振、混频、中放、鉴频以及立体声解码电路全部集成在了一个小小的贴片封装里。对我们制作者来说这意味着极大的简化你不需要手动绕制中周变压器也不用小心翼翼地调整鉴频线圈。芯片通过I2C接口接收来自Arduino的指令内部的所有调谐、静噪、带宽选择等操作都自动完成最终直接输出左右声道的音频信号。注意TEA5767模块市场上有多种版本常见的有带立体声耳机插孔的和直接引出音频线的。务必确认你购买的模块引脚定义特别是音频输出引脚通常是ROUT/LOUT和ROUT/LOUT以及I2C的上拉电阻是否已集成。大部分模块都已集成这能省去不少麻烦。2.2 声音放大环节LM386的经典角色从TEA5767音频引脚输出的信号是“线路电平”驱动能力很弱直接接扬声器几乎听不到声音。LM386是一款专为低电压应用设计的音频功率放大器增益可调20到200倍外围电路极其简单只需要几个电容和电阻是电子制作中放大音频信号的“万金油”。在这个项目中我们使用它的典型应用电路。通过调整其1脚和8脚之间电容的容值可以改变放大倍数。为了兼顾音量和避免失真我通常选择一个适中的增益如100倍左右。另外在电源输入端和芯片电源引脚附近加入滤波电容至关重要这能有效抑制放大器可能引入的“嗡嗡”声电源噪声。2.3 人机交互与供电设计人机交互我们力求简洁两个常开型轻触开关用于上下搜台一个10kΩ的电位器连接LM386的输入端作为音量调节。两个LED一红一绿用于指示电源和状态例如绿色常亮表示供电正常红色闪烁表示正在调谐。供电部分需要仔细考虑。Arduino Nano的Vin引脚可以接受7-12V的直流输入其板载稳压芯片会将其降至5V为自身和TEA5767模块供电。LM386的工作电压范围是4-12V。因此一个9V的电池或一个9V-12V的直流电源适配器是同时满足两者的最佳选择。绝对不要使用高于12V的电源直接接入这很可能损坏Arduino Nano的稳压芯片。如果你只有更高电压的电源如常见的12V以上务必先使用一个降压模块如LM2596将电压稳定到9V后再使用。3. 电路搭建与焊接实操要点3.1 解读与连接电路图虽然原文提供了示意图但我们需要将其转化为更可靠的连接表。以下是基于常见模块引脚定义的详细连接指南Arduino Nano 引脚连接至说明与注意事项5VTEA5767模块的VCC, LM386的引脚6 (Vs)主电源正极。建议在靠近Arduino Nano 5V引脚处焊接一个10uF的电解电容到GND用于电源滤波。GNDTEA5767模块的GND, LM386的引脚4, 按钮一脚电位器一脚LED阴极所有GND必须共地这是电路正常工作的基础。可以使用面包板或焊接板上的公共地线。A4 (SDA)TEA5767模块的SDAI2C数据线。如果模块无上拉电阻需在SDA和SCL线上各接一个4.7kΩ电阻上拉到5V。A5 (SCL)TEA5767模块的SCLI2C时钟线。D2按钮1上一台的另一脚配置为输入上拉模式按钮按下时读到低电平。D3按钮2下一台的另一脚同上。D5绿色LED阳极通过220Ω电阻数字输出高电平点亮。D7红色LED阳极通过220Ω电阻数字输出高电平点亮。A0(模拟输入)电位器的中间脚滑动端用于读取音量电位器的分压值但注意本示例代码未实现软件音量控制电位器直接接在音频通路中。LM386部分TEA5767 AUDIO_OUT电位器两端固定脚的一端TEA5767的音频输出。另一端固定脚接GND。电位器滑动端LM386 引脚3 (同相输入端)音频信号经电位器分压后输入放大器。LM386 引脚2 (反相输入端)GNDLM386 引脚5 (输出)扬声器正极 ()输出耦合一个220uF电解电容正极接引脚5再接扬声器。扬声器负极接GND。LM386 引脚1和8之间接一个10uF电解电容此电容用于设置放大器增益为200倍。如果觉得增益太高易失真可换为更小电容或串联电阻调整。LM386 引脚7 (BYPASS)通过一个10uF电容接地此去耦电容对稳定性很重要不可省略。实操心得在面包板上先搭建并测试整个系统是明智之举。焊接时建议先焊接电源和地线网络再焊接信号线。对于LM386的输入线从电位器到引脚3使用屏蔽线或双绞线并尽量短可以显著降低引入50Hz工频干扰的“嗡嗡”声。3.2 木质外壳的制作与内部布局制作外壳不仅是让作品美观更是对电子部分的保护。选用松木或桐木这类软木易于加工。尺寸没有严格限制但需要提前规划内部空间。我的经验是一个大约12cm长x 8cm宽x 6cm高的盒子就足够容纳所有元件。切割与组装用锯子切割出六块板子底面、正面、背面、两个侧面、顶面。正面板需要开孔两个按钮孔、电位器旋钮孔、LED孔和扬声器出声孔。扬声器孔可以密集地钻一系列小孔或者用开孔器开一个大圆孔并覆盖网纱。用木工白胶粘合各边用夹子固定直至干燥。打磨与处理干透后用砂纸从粗到细如先180目后400目仔细打磨所有边角使其光滑不扎手。可以上一层木蜡油或清漆既能提升质感也能防潮。内部安装规划元件位置。扬声器通常用热熔胶固定在正面板内侧。Arduino Nano、TEA5767模块和LM386电路可以焊在一小块万用板上可以用铜柱或尼龙柱固定在底板上。电池盒如果用9V电池可以贴在侧面或背面。确保所有连接线长度合适并用扎带或胶固定避免内部线材杂乱晃动。4. 软件编程与库函数深度解析4.1 开发环境与库的安装首先确保安装了Arduino IDE。接下来是关键一步安装TEA5767的库。在Arduino IDE中点击“项目” - “加载库” - “管理库…”在搜索框中输入“TEA5767”。你会找到几个相关的库我推荐使用“Radio”库它通常由TEA5767Radio.h支持兼容性好且示例清晰。安装完成后你可以在“文件” - “示例”中找到该库的例程进行参考。4.2 代码逐行解读与优化原作者的代码提供了一个很好的起点但我们可以让它更健壮、功能更完整。下面是一个增强版的代码并附有详细注释。/* FM收音机 - 基于Arduino Nano与TEA5767 增强版增加软件音量控制、静音切换、频率微调与串口调试信息 */ #include Wire.h #include TEA5767Radio.h // 引脚定义 const int BTN_PREV 2; // 上一个台 const int BTN_NEXT 3; // 下一个台 const int BTN_MUTE 4; // 静音按钮新增 const int LED_PWR 5; // 电源指示灯绿色 const int LED_TUNE 7; // 调谐/静音指示灯红色 const int POT_VOL A0; // 音量电位器用于软件音量控制需库支持或自己实现PWM衰减 // 初始化收音机对象 TEA5767Radio radio TEA5767Radio(); // 预存电台频率数组可根据你所在城市修改 float stations[] {87.7, 88.5, 89.3, 90.0, 90.7, 91.5, 92.3, 93.1, 94.0, 95.0, 96.0, 97.0, 98.0, 99.0, 100.0, 101.0, 102.0, 103.0, 104.0, 105.0, 106.0, 107.0, 108.0 }; int stationCount sizeof(stations) / sizeof(stations[0]); // 自动计算电台数量 int currentStationIndex 0; // 当前电台索引 bool isMuted false; // 静音状态标志 // 按钮状态防抖变量 unsigned long lastDebounceTime 0; unsigned long debounceDelay 50; // 防抖延时50毫秒 void setup() { // 初始化串口用于调试 Serial.begin(115200); Serial.println(FM Radio Boot...); // 配置引脚模式 pinMode(BTN_PREV, INPUT_PULLUP); pinMode(BTN_NEXT, INPUT_PULLUP); pinMode(BTN_MUTE, INPUT_PULLUP); // 新增静音按钮内部上拉 pinMode(LED_PWR, OUTPUT); pinMode(LED_TUNE, OUTPUT); // 初始化I2C总线 Wire.begin(); // 上电指示灯测试 digitalWrite(LED_PWR, HIGH); // 电源灯常亮 digitalWrite(LED_TUNE, HIGH); delay(200); digitalWrite(LED_TUNE, LOW); // 初始化收音机设置初始频率 radio.setFrequency(stations[currentStationIndex]); Serial.print(Initial Frequency: ); Serial.print(stations[currentStationIndex]); Serial.println( MHz); } void loop() { // 1. 检查按钮带防抖 if (debounceRead(BTN_PREV)) { changeStation(-1); // 上一个台 } if (debounceRead(BTN_NEXT)) { changeStation(1); // 下一个台 } if (debounceRead(BTN_MUTE)) { toggleMute(); // 切换静音 } // 2. 可以在这里添加音量读取和控制需要额外硬件或库支持 // int volValue analogRead(POT_VOL); // ... 控制音量 ... delay(10); // 主循环短暂延迟降低CPU占用 } // 防抖按钮读取函数 bool debounceRead(int buttonPin) { if (digitalRead(buttonPin) LOW) { // 按钮被按下低电平 if ((millis() - lastDebounceTime) debounceDelay) { lastDebounceTime millis(); return true; // 确认为有效按下 } } return false; } // 切换电台函数 void changeStation(int direction) { currentStationIndex direction; // 处理边界循环 if (currentStationIndex 0) { currentStationIndex stationCount - 1; } else if (currentStationIndex stationCount) { currentStationIndex 0; } // 调谐指示 digitalWrite(LED_TUNE, HIGH); radio.setFrequency(stations[currentStationIndex]); Serial.print(Tuned to: ); Serial.print(stations[currentStationIndex]); Serial.println( MHz); // 如果当前静音切台后自动取消静音以获得反馈 if (isMuted) { // 某些TEA5767库支持mute函数如 radio.mute()/unmute() // 这里假设切台即解除静音 isMuted false; digitalWrite(LED_TUNE, LOW); // 调谐灯熄灭表示正常播放 } delay(300); // 调谐后短暂延迟避免连续触发 digitalWrite(LED_TUNE, LOW); } // 切换静音函数 void toggleMute() { isMuted !isMuted; // 状态取反 if (isMuted) { // 此处应调用库的静音函数例如radio.mute(); // 由于原库可能不支持这里用闪烁LED示意 Serial.println(Muted); digitalWrite(LED_TUNE, HIGH); } else { // 取消静音例如radio.unmute(); Serial.println(Unmuted); digitalWrite(LED_TUNE, LOW); } }代码关键点解析防抖处理机械按钮在按下时会产生快速的电压抖动可能导致一次按下被误读多次。debounceRead函数通过时间间隔判断确保了每次按下只被识别一次。数组与循环使用数组存储电台频率并通过stationCount自动计算数量使得增删电台频率非常方便。切换电台时索引循环从最后一个跳到第一个反之亦然操作更符合直觉。结构化函数将换台和静音功能封装成独立函数changeStation,toggleMute使主循环loop非常简洁提高了代码的可读性和可维护性。串口调试通过串口输出当前频率和状态在调试时 invaluable。你可以通过IDE的串口监视器查看收音机正在做什么。注意事项原TEA5767Radio库功能可能比较基础。如果你需要更高级的功能如直接静音、设置搜索参数、读取信号强度等可能需要寻找更强大的库如TEA5767bypetrb或者直接通过Wire库读写TEA5767的寄存器这需要对芯片的数据手册有深入了解。5. 系统调试与常见问题排查实录即使按照教程一步步做也可能会遇到收音机不响、噪音大、收台少等问题。下面是我在多次制作中踩过的坑和解决方案。5.1 上电后完全无声检查电源用万用表测量Arduino Nano的5V引脚和GND之间是否有稳定的5V电压。检查LM386的6脚Vs是否有供电5V-9V。检查音频通路用手或螺丝刀轻轻触碰LM386的3脚输入端扬声器应发出“嗡嗡”的感应噪声。如果有说明放大器后半部分工作正常问题出在TEA5767或信号输入部分。如果触碰3脚也没声音检查LM386外围电路1-8脚间的增益电容、7脚的旁路电容、输出耦合电容220uF是否焊好极性是否正确。特别注意LM386的2脚反相输入端必须接地否则放大器不工作。检查TEA5767与控制观察调谐时红色LED是否闪烁通过串口监视器查看Arduino是否输出了频率信息。用万用表测量TEA5767模块的VCC和GND是否有5V。检查SDA和SCL线是否与Arduino正确连接A4, A5。尝试在代码中写死一个强信号台的频率如你本地最清晰的频率排除按钮和数组逻辑的问题。5.2 噪音巨大或只能收到强烈干扰声天线问题TEA5767模块上的ANT引脚需要接一根天线。最佳实践是焊接一根长约70-90cm的导线约FM波长1/4并尽量将其拉直悬空。天线长度对接收灵敏度影响极大。不要用很短的一截导线效果会差很多。电源噪声这是最常见的噪音来源持续的“嗡嗡”声。强化滤波在Arduino的5V输出和GND之间并接一个100uF的电解电容低频滤波和一个0.1uF的瓷片电容高频滤波位置尽量靠近TEA5767模块的电源引脚。检查共地确保Arduino、TEA5767、LM386、电位器、扬声器的“地”都良好地连接在一起最好采用星型单点接地或粗导线作为公共地线。分离供电尝试如果使用USB供电尝试改用电池供电看噪音是否消失。USB电源的开关噪声有时会干扰敏感的射频电路。信号线干扰连接TEA5767音频输出到电位器、再到LM386输入的导线应使用屏蔽线。屏蔽层一端接地接音频地。将这段线远离电源线和数字信号线如I2C线。5.3 收台数量少或频率漂移频率覆盖范围确认代码中radio.setFrequency()设置的频率值在87.5-108.0 MHz范围内。有些地区如日本的FM波段下限是76MHz标准TEA5767需要修改内部配置才能支持。搜索模式与静噪原版库的setFrequency是直接锁频。要实现自动搜台需要用到芯片的搜索功能这通常需要直接配置TEA5767的寄存器。你可以搜索“TEA5767 auto scan”找到相关代码。搜索时可以设置一个信号强度阈值只有高于该阈值的频率才被存入数组。频率漂移TEA5767内部本振的稳定性受温度和电压影响。如果发现电台会慢慢跑偏可以尝试给芯片提供一个更稳定、干净的电源。在代码中实现微调功能例如长按按钮进行频率的微小增减步进0.1MHz找到最清晰的位置后将修正后的频率更新到电台数组中。5.4 I2C通信失败如果串口没有任何输出或收音机毫无反应可能是I2C通信问题。在setup()函数中加入Wire.begin();后可以加入Wire.beginTransmission(0x60);TEA5767的常见I2C地址是0x60然后用Wire.endTransmission();检查返回值如果为0则表示通信成功。检查SDA和SCL线上是否接了上拉电阻通常4.7kΩ到10kΩ上拉到5V。很多模块已集成如果没有必须自己加上。确保没有其他设备占用相同的I2C地址。6. 功能扩展与进阶玩法基础功能实现后这个平台还有很大的扩展空间添加LCD或OLED显示屏使用I2C接口的0.96寸OLED屏可以显示当前频率、电台名称需预存、信号强度甚至频谱。这会让你的收音机看起来更专业。实现数字音量与音调控制使用数字电位器如MCP4131替代模拟电位器通过Arduino进行软件控制。甚至可以加入均衡器芯片调节高低音。增加蓝牙音频发射加入一个蓝牙音频模块如JDY-31将Arduino接收到的电台音频可以从TEA5767模块的音频输出端接出转发到蓝牙耳机或音箱变身无线FM转发器。录制与定时播放结合SD卡模块可以实现电台录音功能。或者增加一个RTC实时时钟模块实现定时开关机、定时录制喜欢的节目。网络收音机融合接入ESP8266或ESP32让你的设备既能听传统FM广播也能通过WiFi播放网络电台成为一个真正的“跨界”播放器。这个基于Arduino和TEA5767的FM收音机项目从电路原理到代码编写从手工制作到问题调试完整地覆盖了一个嵌入式产品从原型到成品的核心流程。它最吸引我的地方在于用现代易用的微控制器去驾驭一个经典的射频芯片最终复活了一种传统的媒介体验。当你第一次从自己亲手焊接的电路板中清晰地收听到远方的广播节目时那种跨越空间的连接感和动手实现的满足感是购买任何成品设备都无法替代的。希望你在制作过程中不仅能收获一个有趣的桌面摆件更能深入理解信号、控制与系统协同工作的魅力。如果在制作中遇到任何问题不妨回头仔细检查电源、接地和天线这三个最关键的环节它们往往是解决问题的突破口。
基于Arduino与TEA5767的FM收音机制作:从原理到实践的完整指南
发布时间:2026/5/30 17:53:05
1. 项目概述与核心思路几年前我在整理一堆旧电子元件时翻出了一个老旧的TEA5767模块这让我想起了学生时代用收音机听广播的日子。现在数字流媒体当道但调频广播那种“拧旋钮找台”的仪式感和偶尔收到的意外惊喜是算法推荐给不了的。于是我决定用这个模块结合手头最常用的Arduino做一个属于自己的、带点复古味道的FM收音机。这不仅仅是一个简单的焊接和烧录程序的过程更是一次对模拟信号处理、I2C通信和嵌入式系统设计的重温。这个项目本质上是一个典型的嵌入式系统应用核心是利用Arduino作为微控制器通过I2C总线协议控制TEA5767这颗高度集成的FM收音机芯片完成从天线信号接收、频率调谐、中频处理到立体声解调的全过程。得到的音频信号非常微弱所以我们还需要LM386这颗经典的音频功率放大器来驱动扬声器让它能发出足够响亮和清晰的声音。最终我们通过两个按钮实现电台切换用LED做状态指示并把它装进一个自己制作的木质外壳里让它从一个实验板上的电路变成一个可以摆在桌面上使用的实体设备。无论你是刚接触Arduino和电子制作的新手想通过一个综合性项目练手还是有一定经验的开发者希望深入了解I2C通信和射频接收的细节这个项目都能提供一条清晰的路径。它涵盖了从硬件选型、电路连接、库函数调用、到结构设计和问题调试的完整流程你会学到如何让不同的模块协同工作并亲手做出一个既有用又有成就感的作品。2. 核心硬件选型与原理剖析2.1 主控与收音核心为什么是Arduino Nano和TEA5767选择Arduino Nano作为大脑主要基于其极佳的平衡性。它体积小巧非常适合嵌入到最终成品中拥有足够的I/O口来控制按钮、LED和I2C通信最重要的是其庞大的社区和丰富的库资源让驱动TEA5767这样的芯片变得异常简单。你几乎不需要从零开始编写复杂的寄存器配置代码。TEA5767芯片则是本项目的灵魂。这是一颗单芯片的FM立体声收音机IC它把传统超外差式收音机里复杂的高频放大、本振、混频、中放、鉴频以及立体声解码电路全部集成在了一个小小的贴片封装里。对我们制作者来说这意味着极大的简化你不需要手动绕制中周变压器也不用小心翼翼地调整鉴频线圈。芯片通过I2C接口接收来自Arduino的指令内部的所有调谐、静噪、带宽选择等操作都自动完成最终直接输出左右声道的音频信号。注意TEA5767模块市场上有多种版本常见的有带立体声耳机插孔的和直接引出音频线的。务必确认你购买的模块引脚定义特别是音频输出引脚通常是ROUT/LOUT和ROUT/LOUT以及I2C的上拉电阻是否已集成。大部分模块都已集成这能省去不少麻烦。2.2 声音放大环节LM386的经典角色从TEA5767音频引脚输出的信号是“线路电平”驱动能力很弱直接接扬声器几乎听不到声音。LM386是一款专为低电压应用设计的音频功率放大器增益可调20到200倍外围电路极其简单只需要几个电容和电阻是电子制作中放大音频信号的“万金油”。在这个项目中我们使用它的典型应用电路。通过调整其1脚和8脚之间电容的容值可以改变放大倍数。为了兼顾音量和避免失真我通常选择一个适中的增益如100倍左右。另外在电源输入端和芯片电源引脚附近加入滤波电容至关重要这能有效抑制放大器可能引入的“嗡嗡”声电源噪声。2.3 人机交互与供电设计人机交互我们力求简洁两个常开型轻触开关用于上下搜台一个10kΩ的电位器连接LM386的输入端作为音量调节。两个LED一红一绿用于指示电源和状态例如绿色常亮表示供电正常红色闪烁表示正在调谐。供电部分需要仔细考虑。Arduino Nano的Vin引脚可以接受7-12V的直流输入其板载稳压芯片会将其降至5V为自身和TEA5767模块供电。LM386的工作电压范围是4-12V。因此一个9V的电池或一个9V-12V的直流电源适配器是同时满足两者的最佳选择。绝对不要使用高于12V的电源直接接入这很可能损坏Arduino Nano的稳压芯片。如果你只有更高电压的电源如常见的12V以上务必先使用一个降压模块如LM2596将电压稳定到9V后再使用。3. 电路搭建与焊接实操要点3.1 解读与连接电路图虽然原文提供了示意图但我们需要将其转化为更可靠的连接表。以下是基于常见模块引脚定义的详细连接指南Arduino Nano 引脚连接至说明与注意事项5VTEA5767模块的VCC, LM386的引脚6 (Vs)主电源正极。建议在靠近Arduino Nano 5V引脚处焊接一个10uF的电解电容到GND用于电源滤波。GNDTEA5767模块的GND, LM386的引脚4, 按钮一脚电位器一脚LED阴极所有GND必须共地这是电路正常工作的基础。可以使用面包板或焊接板上的公共地线。A4 (SDA)TEA5767模块的SDAI2C数据线。如果模块无上拉电阻需在SDA和SCL线上各接一个4.7kΩ电阻上拉到5V。A5 (SCL)TEA5767模块的SCLI2C时钟线。D2按钮1上一台的另一脚配置为输入上拉模式按钮按下时读到低电平。D3按钮2下一台的另一脚同上。D5绿色LED阳极通过220Ω电阻数字输出高电平点亮。D7红色LED阳极通过220Ω电阻数字输出高电平点亮。A0(模拟输入)电位器的中间脚滑动端用于读取音量电位器的分压值但注意本示例代码未实现软件音量控制电位器直接接在音频通路中。LM386部分TEA5767 AUDIO_OUT电位器两端固定脚的一端TEA5767的音频输出。另一端固定脚接GND。电位器滑动端LM386 引脚3 (同相输入端)音频信号经电位器分压后输入放大器。LM386 引脚2 (反相输入端)GNDLM386 引脚5 (输出)扬声器正极 ()输出耦合一个220uF电解电容正极接引脚5再接扬声器。扬声器负极接GND。LM386 引脚1和8之间接一个10uF电解电容此电容用于设置放大器增益为200倍。如果觉得增益太高易失真可换为更小电容或串联电阻调整。LM386 引脚7 (BYPASS)通过一个10uF电容接地此去耦电容对稳定性很重要不可省略。实操心得在面包板上先搭建并测试整个系统是明智之举。焊接时建议先焊接电源和地线网络再焊接信号线。对于LM386的输入线从电位器到引脚3使用屏蔽线或双绞线并尽量短可以显著降低引入50Hz工频干扰的“嗡嗡”声。3.2 木质外壳的制作与内部布局制作外壳不仅是让作品美观更是对电子部分的保护。选用松木或桐木这类软木易于加工。尺寸没有严格限制但需要提前规划内部空间。我的经验是一个大约12cm长x 8cm宽x 6cm高的盒子就足够容纳所有元件。切割与组装用锯子切割出六块板子底面、正面、背面、两个侧面、顶面。正面板需要开孔两个按钮孔、电位器旋钮孔、LED孔和扬声器出声孔。扬声器孔可以密集地钻一系列小孔或者用开孔器开一个大圆孔并覆盖网纱。用木工白胶粘合各边用夹子固定直至干燥。打磨与处理干透后用砂纸从粗到细如先180目后400目仔细打磨所有边角使其光滑不扎手。可以上一层木蜡油或清漆既能提升质感也能防潮。内部安装规划元件位置。扬声器通常用热熔胶固定在正面板内侧。Arduino Nano、TEA5767模块和LM386电路可以焊在一小块万用板上可以用铜柱或尼龙柱固定在底板上。电池盒如果用9V电池可以贴在侧面或背面。确保所有连接线长度合适并用扎带或胶固定避免内部线材杂乱晃动。4. 软件编程与库函数深度解析4.1 开发环境与库的安装首先确保安装了Arduino IDE。接下来是关键一步安装TEA5767的库。在Arduino IDE中点击“项目” - “加载库” - “管理库…”在搜索框中输入“TEA5767”。你会找到几个相关的库我推荐使用“Radio”库它通常由TEA5767Radio.h支持兼容性好且示例清晰。安装完成后你可以在“文件” - “示例”中找到该库的例程进行参考。4.2 代码逐行解读与优化原作者的代码提供了一个很好的起点但我们可以让它更健壮、功能更完整。下面是一个增强版的代码并附有详细注释。/* FM收音机 - 基于Arduino Nano与TEA5767 增强版增加软件音量控制、静音切换、频率微调与串口调试信息 */ #include Wire.h #include TEA5767Radio.h // 引脚定义 const int BTN_PREV 2; // 上一个台 const int BTN_NEXT 3; // 下一个台 const int BTN_MUTE 4; // 静音按钮新增 const int LED_PWR 5; // 电源指示灯绿色 const int LED_TUNE 7; // 调谐/静音指示灯红色 const int POT_VOL A0; // 音量电位器用于软件音量控制需库支持或自己实现PWM衰减 // 初始化收音机对象 TEA5767Radio radio TEA5767Radio(); // 预存电台频率数组可根据你所在城市修改 float stations[] {87.7, 88.5, 89.3, 90.0, 90.7, 91.5, 92.3, 93.1, 94.0, 95.0, 96.0, 97.0, 98.0, 99.0, 100.0, 101.0, 102.0, 103.0, 104.0, 105.0, 106.0, 107.0, 108.0 }; int stationCount sizeof(stations) / sizeof(stations[0]); // 自动计算电台数量 int currentStationIndex 0; // 当前电台索引 bool isMuted false; // 静音状态标志 // 按钮状态防抖变量 unsigned long lastDebounceTime 0; unsigned long debounceDelay 50; // 防抖延时50毫秒 void setup() { // 初始化串口用于调试 Serial.begin(115200); Serial.println(FM Radio Boot...); // 配置引脚模式 pinMode(BTN_PREV, INPUT_PULLUP); pinMode(BTN_NEXT, INPUT_PULLUP); pinMode(BTN_MUTE, INPUT_PULLUP); // 新增静音按钮内部上拉 pinMode(LED_PWR, OUTPUT); pinMode(LED_TUNE, OUTPUT); // 初始化I2C总线 Wire.begin(); // 上电指示灯测试 digitalWrite(LED_PWR, HIGH); // 电源灯常亮 digitalWrite(LED_TUNE, HIGH); delay(200); digitalWrite(LED_TUNE, LOW); // 初始化收音机设置初始频率 radio.setFrequency(stations[currentStationIndex]); Serial.print(Initial Frequency: ); Serial.print(stations[currentStationIndex]); Serial.println( MHz); } void loop() { // 1. 检查按钮带防抖 if (debounceRead(BTN_PREV)) { changeStation(-1); // 上一个台 } if (debounceRead(BTN_NEXT)) { changeStation(1); // 下一个台 } if (debounceRead(BTN_MUTE)) { toggleMute(); // 切换静音 } // 2. 可以在这里添加音量读取和控制需要额外硬件或库支持 // int volValue analogRead(POT_VOL); // ... 控制音量 ... delay(10); // 主循环短暂延迟降低CPU占用 } // 防抖按钮读取函数 bool debounceRead(int buttonPin) { if (digitalRead(buttonPin) LOW) { // 按钮被按下低电平 if ((millis() - lastDebounceTime) debounceDelay) { lastDebounceTime millis(); return true; // 确认为有效按下 } } return false; } // 切换电台函数 void changeStation(int direction) { currentStationIndex direction; // 处理边界循环 if (currentStationIndex 0) { currentStationIndex stationCount - 1; } else if (currentStationIndex stationCount) { currentStationIndex 0; } // 调谐指示 digitalWrite(LED_TUNE, HIGH); radio.setFrequency(stations[currentStationIndex]); Serial.print(Tuned to: ); Serial.print(stations[currentStationIndex]); Serial.println( MHz); // 如果当前静音切台后自动取消静音以获得反馈 if (isMuted) { // 某些TEA5767库支持mute函数如 radio.mute()/unmute() // 这里假设切台即解除静音 isMuted false; digitalWrite(LED_TUNE, LOW); // 调谐灯熄灭表示正常播放 } delay(300); // 调谐后短暂延迟避免连续触发 digitalWrite(LED_TUNE, LOW); } // 切换静音函数 void toggleMute() { isMuted !isMuted; // 状态取反 if (isMuted) { // 此处应调用库的静音函数例如radio.mute(); // 由于原库可能不支持这里用闪烁LED示意 Serial.println(Muted); digitalWrite(LED_TUNE, HIGH); } else { // 取消静音例如radio.unmute(); Serial.println(Unmuted); digitalWrite(LED_TUNE, LOW); } }代码关键点解析防抖处理机械按钮在按下时会产生快速的电压抖动可能导致一次按下被误读多次。debounceRead函数通过时间间隔判断确保了每次按下只被识别一次。数组与循环使用数组存储电台频率并通过stationCount自动计算数量使得增删电台频率非常方便。切换电台时索引循环从最后一个跳到第一个反之亦然操作更符合直觉。结构化函数将换台和静音功能封装成独立函数changeStation,toggleMute使主循环loop非常简洁提高了代码的可读性和可维护性。串口调试通过串口输出当前频率和状态在调试时 invaluable。你可以通过IDE的串口监视器查看收音机正在做什么。注意事项原TEA5767Radio库功能可能比较基础。如果你需要更高级的功能如直接静音、设置搜索参数、读取信号强度等可能需要寻找更强大的库如TEA5767bypetrb或者直接通过Wire库读写TEA5767的寄存器这需要对芯片的数据手册有深入了解。5. 系统调试与常见问题排查实录即使按照教程一步步做也可能会遇到收音机不响、噪音大、收台少等问题。下面是我在多次制作中踩过的坑和解决方案。5.1 上电后完全无声检查电源用万用表测量Arduino Nano的5V引脚和GND之间是否有稳定的5V电压。检查LM386的6脚Vs是否有供电5V-9V。检查音频通路用手或螺丝刀轻轻触碰LM386的3脚输入端扬声器应发出“嗡嗡”的感应噪声。如果有说明放大器后半部分工作正常问题出在TEA5767或信号输入部分。如果触碰3脚也没声音检查LM386外围电路1-8脚间的增益电容、7脚的旁路电容、输出耦合电容220uF是否焊好极性是否正确。特别注意LM386的2脚反相输入端必须接地否则放大器不工作。检查TEA5767与控制观察调谐时红色LED是否闪烁通过串口监视器查看Arduino是否输出了频率信息。用万用表测量TEA5767模块的VCC和GND是否有5V。检查SDA和SCL线是否与Arduino正确连接A4, A5。尝试在代码中写死一个强信号台的频率如你本地最清晰的频率排除按钮和数组逻辑的问题。5.2 噪音巨大或只能收到强烈干扰声天线问题TEA5767模块上的ANT引脚需要接一根天线。最佳实践是焊接一根长约70-90cm的导线约FM波长1/4并尽量将其拉直悬空。天线长度对接收灵敏度影响极大。不要用很短的一截导线效果会差很多。电源噪声这是最常见的噪音来源持续的“嗡嗡”声。强化滤波在Arduino的5V输出和GND之间并接一个100uF的电解电容低频滤波和一个0.1uF的瓷片电容高频滤波位置尽量靠近TEA5767模块的电源引脚。检查共地确保Arduino、TEA5767、LM386、电位器、扬声器的“地”都良好地连接在一起最好采用星型单点接地或粗导线作为公共地线。分离供电尝试如果使用USB供电尝试改用电池供电看噪音是否消失。USB电源的开关噪声有时会干扰敏感的射频电路。信号线干扰连接TEA5767音频输出到电位器、再到LM386输入的导线应使用屏蔽线。屏蔽层一端接地接音频地。将这段线远离电源线和数字信号线如I2C线。5.3 收台数量少或频率漂移频率覆盖范围确认代码中radio.setFrequency()设置的频率值在87.5-108.0 MHz范围内。有些地区如日本的FM波段下限是76MHz标准TEA5767需要修改内部配置才能支持。搜索模式与静噪原版库的setFrequency是直接锁频。要实现自动搜台需要用到芯片的搜索功能这通常需要直接配置TEA5767的寄存器。你可以搜索“TEA5767 auto scan”找到相关代码。搜索时可以设置一个信号强度阈值只有高于该阈值的频率才被存入数组。频率漂移TEA5767内部本振的稳定性受温度和电压影响。如果发现电台会慢慢跑偏可以尝试给芯片提供一个更稳定、干净的电源。在代码中实现微调功能例如长按按钮进行频率的微小增减步进0.1MHz找到最清晰的位置后将修正后的频率更新到电台数组中。5.4 I2C通信失败如果串口没有任何输出或收音机毫无反应可能是I2C通信问题。在setup()函数中加入Wire.begin();后可以加入Wire.beginTransmission(0x60);TEA5767的常见I2C地址是0x60然后用Wire.endTransmission();检查返回值如果为0则表示通信成功。检查SDA和SCL线上是否接了上拉电阻通常4.7kΩ到10kΩ上拉到5V。很多模块已集成如果没有必须自己加上。确保没有其他设备占用相同的I2C地址。6. 功能扩展与进阶玩法基础功能实现后这个平台还有很大的扩展空间添加LCD或OLED显示屏使用I2C接口的0.96寸OLED屏可以显示当前频率、电台名称需预存、信号强度甚至频谱。这会让你的收音机看起来更专业。实现数字音量与音调控制使用数字电位器如MCP4131替代模拟电位器通过Arduino进行软件控制。甚至可以加入均衡器芯片调节高低音。增加蓝牙音频发射加入一个蓝牙音频模块如JDY-31将Arduino接收到的电台音频可以从TEA5767模块的音频输出端接出转发到蓝牙耳机或音箱变身无线FM转发器。录制与定时播放结合SD卡模块可以实现电台录音功能。或者增加一个RTC实时时钟模块实现定时开关机、定时录制喜欢的节目。网络收音机融合接入ESP8266或ESP32让你的设备既能听传统FM广播也能通过WiFi播放网络电台成为一个真正的“跨界”播放器。这个基于Arduino和TEA5767的FM收音机项目从电路原理到代码编写从手工制作到问题调试完整地覆盖了一个嵌入式产品从原型到成品的核心流程。它最吸引我的地方在于用现代易用的微控制器去驾驭一个经典的射频芯片最终复活了一种传统的媒介体验。当你第一次从自己亲手焊接的电路板中清晰地收听到远方的广播节目时那种跨越空间的连接感和动手实现的满足感是购买任何成品设备都无法替代的。希望你在制作过程中不仅能收获一个有趣的桌面摆件更能深入理解信号、控制与系统协同工作的魅力。如果在制作中遇到任何问题不妨回头仔细检查电源、接地和天线这三个最关键的环节它们往往是解决问题的突破口。