1. 项目概述与核心思路我一直对老物件有种特殊的情结尤其是那些带着岁月痕迹的电子设备。去年在二手市场淘到一台1940年代的收音机木质外壳温润刻度盘上的字迹虽已模糊但依然能感受到那个时代的工艺美学。可惜的是它的电子心脏早已停摆变成了一件纯粹的摆设。于是一个念头冒了出来能不能在不破坏它经典外观的前提下用现代的技术让它重新“开口唱歌”这个想法最终落地成了一个结合了Arduino微控制器、FM收音模块和OLED显示屏的改造项目。这不仅仅是一次修复更像是一次跨越时代的对话用今天的数字芯片去驱动昨天的电磁喇叭让历史的回声以全新的方式响起。这个项目的核心目标很明确保留复古收音机的全部外观与操作手感但将其内部核心功能替换为基于Arduino的现代化FM收音系统。这意味着我们不会去改动任何旋钮、拨盘或外壳甚至原有的喇叭也尽可能利用。我们要做的是悄悄地在它的“躯壳”里植入一个“数字大脑”和“现代听觉神经”。最终这台老收音机将能精准接收87.5-108MHz的FM广播通过OLED屏幕清晰显示电台频率和名称并且可以通过实体按钮进行切换和操控完美融合复古美学与现代便利。整个方案围绕Arduino Uno展开它就像项目的中枢神经系统。选择它是因为其极高的普及度和强大的社区支持任何遇到的问题几乎都能找到答案。收音功能由TEA5767模块负责这是一颗经典的FM收音芯片通过I2C总线与Arduino通信让软件调台成为可能。人机交互界面则是一块小巧的SSD1306 OLED屏用来显示信息以及几个自锁式按钮用于切换电台和开关机。原有的喇叭将通过一个集成功放模块来驱动确保声音洪亮清晰。这个方案的优势在于模块化程度高、接线清晰、代码资源丰富非常适合有一定焊接和编程基础的爱好者复现。即使你是新手跟着步骤一步步来也能领略到硬件改造与嵌入式编程结合的乐趣。2. 硬件选型与核心模块解析改造一台老收音机硬件是骨架。选对部件不仅事半功倍更能决定最终成品的稳定性和音质。我的选型原则是在满足功能、保证稳定性的前提下优先选择通用性强、文档丰富的模块这能极大降低后续调试的难度。2.1 控制核心Arduino Uno的不可替代性为什么是Arduino Uno而不是更小巧的Nano或者更强大的ESP32这基于几个实际考量。首先开发环境极其友好。Arduino IDE对新手来说几乎是零门槛丰富的库管理器让你不需要从底层开始写驱动。对于TEA5767和SSD1306这类常用模块都有经社区千锤百炼的库直接调用即可。其次引脚布局规整便于焊接和扩展。Uno的引脚间距标准无论是用杜邦线临时连接还是最终焊接在万用板上都非常方便。老收音机内部空间通常不小Uno的尺寸完全不是问题。最后是供电简单稳定。Uno可以通过USB口或Vin引脚接受7-12V的宽电压输入并内部稳压到5V这为我们使用一个外接电源适配器同时给整个系统供电提供了便利。虽然ESP32功能更强但它的3.3V逻辑电平需要额外的电平转换且Wi-Fi/蓝牙功能在本项目基础版中并非必需反而增加了复杂度。注意购买Arduino时建议选择正版或质量可靠的兼容板。一些过于廉价的兼容板可能使用劣质的稳压芯片或USB转串口芯片导致在连接多个外设时供电不稳或无法烧录程序徒增烦恼。2.2 “听觉”模块TEA5767 FM收音模块详解TEA5767是一颗单芯片的FM立体声收音机IC它集成了从天线输入到音频输出的几乎所有功能。我们使用的模块通常已经集成了必要的滤波电路和音频输出耦合电容。选择它关键在于其纯数字化的控制接口。它通过I2C总线仅需SDA和SCL两根数据线与Arduino通信我们可以用代码精确设置接收频率、静音、搜索电台等完全取代了传统的可变电容调谐机构。这里有一个关键细节天线连接。TEA5767模块上通常会有一个焊盘或引脚用于连接天线。对于FM广播最佳选择是一段长约75cm的导线约1/4波长将其焊接到天线焊盘上并尽可能在收音机内部拉直悬挂。天线的长度和位置对接收灵敏度有显著影响。在我的实际安装中我将这段天线沿着收音机木质外壳的内壁走线获得了不错的接收效果。如果信号较弱可以考虑在导线末端焊接一个香蕉头连接到收音机原有的拉杆天线上如果存在的话这能利用原机天线的良好外部位置。2.3 “视觉”界面SSD1306 OLED显示屏之所以选择OLED而非LCD主要基于两点极高的对比度和极低的功耗。OLED是自发光显示黑色时像素点完全关闭这使得它在显示文字和简单图形时异常清晰即使在昏暗的复古收音机腔体内也一目了然。SSD1306驱动芯片同样通过I2C总线通信这意味着它可以和TEA5767共用Arduino的I2C引脚A4和A5只需在软件上区分它们的设备地址即可大大节省了引脚资源。常见的尺寸有0.96英寸和1.3英寸。对于大多数老收音机0.96英寸的屏幕足以清晰显示频率和电台名且更容易找到安装位置。在安装时你需要为屏幕在收音机面板上开一个观察窗。我的做法是仔细测量屏幕显示区域的实际尺寸然后在收音机原有的频率刻度盘玻璃后面选择一个不破坏原有数字的位置用精密手钻和锉刀开一个矩形的孔最后用热熔胶将屏幕从内部固定对齐。这个过程需要极大的耐心务必“慢工出细活”。2.4 “嗓音”重塑音频功放模块的选择TEA5767模块输出的音频信号非常微弱必须经过放大才能驱动喇叭。我推荐使用集成的D类功放模块比如PAM8403或TPA3116这类。它们效率高、发热小且通常自带音量电位器。选择时需要注意供电电压和输出功率。Arduino的5V输出可以给PAM8403供电驱动一个小型喇叭足够如果你希望音量更大或喇叭阻抗较低可以选择支持更宽电压如12V的TPA3116并单独供电。接线时将TEA5767的音频左L、右R输出线通常模块会标出连接到功放模块的音频输入端。如果功放是立体声输入而你的收音机是单喇叭可以将左右声道并联后接入或者只接一个声道。最关键的一步是“共地”必须确保Arduino、TEA5767、功放模块以及电源的“地”GND全部连接在一起否则会产生严重的交流噪声。2.5 交互核心自锁按钮与供电方案操作方面我使用了两个自锁式按钮。一个用于电源开关另一个用于切换预存电台。自锁按钮的好处是按下后状态保持无需程序一直检测逻辑简单。你也可以使用非自锁按钮通过代码控制电台切换这取决于个人喜好。供电是整个系统稳定的基石。不建议长期使用电脑USB供电或移动电源。最佳方案是使用一个9V 1A以上的直流电源适配器连接到Arduino Uno的桶形插座Vin引脚。Arduino板上的稳压芯片会将电压降至5V供给自身和所有模块。务必确认你的功放模块的供电需求如果它需要更高的电压如12V则应单独为其准备一路电源但地与Arduino系统共地。3. 电路连接与硬件组装实战理论清晰后动手搭建是真正充满乐趣也最考验耐心的环节。我的建议是不要急于在收音机内部直接焊接先在一个面包板上完成所有功能的原型验证。这能确保每个模块工作正常代码逻辑正确避免封装后发现问题再拆解的麻烦。3.1 分步搭建与测试首先在面包板上插好Arduino Uno。我们按照功能模块逐个连接连接TEA5767模块VCC - Arduino 5VGND - Arduino GNDSCL - Arduino 模拟引脚 A5SDA - Arduino 模拟引脚 A4将一根约75cm的导线焊接到模块的ANT天线焊盘上。连接SSD1306 OLED显示屏VCC - Arduino 5V (或3.3V视模块型号而定多数5V兼容)GND - Arduino GNDSCL - Arduino 模拟引脚 A5 (与TEA5767共用)SDA - Arduino 模拟引脚 A4 (与TEA5767共用)重要提示I2C总线上的每个设备必须有唯一地址。通常SSD1306的地址是0x3CTEA5767的地址是0x60。它们可以共享SCL和SDA线不会冲突。如果后续扫描不到设备检查地址是否正确。连接功放模块与喇叭功放模块的电源输入如12V、GND接至独立的电源适配器如果需高压或接至Arduino的5V和GND如果模块支持5V供电。将TEA5767的音频输出线L和R连接到功放模块的音频输入端子。将老收音机的喇叭两根线连接到功放模块的喇叭输出端子注意正负极接反了声音会变差但一般不会损坏。连接自锁按钮以电台切换按钮为例。按钮一脚接Arduino某个数字引脚如引脚2另一脚接GND。在Arduino引脚2与5V之间连接一个10kΩ的上拉电阻。这样当按钮未按下时引脚通过电阻被拉到高电平5V按下时引脚直接连接到GND变为低电平。这种配置可以利用Arduino内部的上拉电阻但为了稳定性我习惯使用外部电阻。完成面包板连接后先上传一个简单的测试代码分别验证OLED能否显示、Arduino能否控制TEA5767搜台并发出声音、按钮按下时串口是否有打印信息。确保一切正常后再进行下一步。3.2 内部布局与安装技巧老收音机内部通常是“五脏六腑”已被掏空留出了宝贵的空间。我们的安装原则是稳固、散热、便于检修。固定方式强烈建议使用尼龙柱和螺丝来固定Arduino、功放等板卡。热熔胶在长期使用或温度变化下可能脱落而螺丝固定则一劳永逸。可以在板子的安装孔上拧上尼龙柱再用螺丝将尼龙柱固定在收音机底板上。走线管理使用扎带或线卡将电源线、信号线归类捆扎避免杂乱。尤其注意音频信号线要尽量远离电源线和数字信号线平行走线时保持距离以减少噪声干扰。如果条件允许可以使用屏蔽音频线。屏幕安装这是面子工程。在面板内侧开好孔后用少量热熔胶先将屏幕四角点住从正面观察是否居中、端正。确认无误后再在背面补胶固定。可以在屏幕与面板之间垫一层黑色海绵或电工胶布既能遮光又能缓冲。按钮安装在收音机侧板或面板空白处钻孔安装自锁按钮。按钮帽可以选择复古风格的金属或塑料帽以契合整体风格。内部用螺母锁紧确保牢固。供电入口在收音机后壳开一个合适的孔安装一个DC电源插座并将其与内部的电源线焊接好。这样外观上只有一个电源接口非常整洁。4. 软件编程与功能实现硬件是躯体软件是灵魂。让这台复古收音机智能起来的关键全在于Arduino的代码。我们将实现以下几个核心功能FM频率调谐、电台存储与切换、OLED信息显示。4.1 库的安装与基础设置在Arduino IDE中我们需要先安装两个关键的库TEA5767库在库管理器中搜索“TEA5767”选择并安装。OLED显示库对于SSD1306最常用的是“Adafruit SSD1306”和“Adafruit GFX”库。同样通过库管理器安装。代码开头需要引入这些库并定义引脚和对象#include Wire.h #include TEA5767Radio.h #include Adafruit_SSD1306.h #include Adafruit_GFX.h #define OLED_WIDTH 128 #define OLED_HEIGHT 64 #define OLED_ADDR 0x3C // OLED I2C地址 #define BUTTON_PIN 2 // 电台切换按钮引脚 TEA5767Radio radio TEA5767Radio(); Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, Wire, -1); // 预存电台频率和名称根据你所在城市修改 float presetFrequencies[] {88.5, 91.5, 94.3, 96.8, 101.7, 103.9, 106.1}; char* presetNames[] {音乐之声, 交通广播, 新闻频道, 文艺频率, 经济电台, 都市广播, 经典音乐}; int presetCount 7; int currentPresetIndex 0;4.2 核心功能函数解析在setup()函数中我们需要初始化I2C通信、收音机模块、OLED显示屏和按钮引脚。void setup() { Serial.begin(9600); Wire.begin(); // 初始化OLED if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) { Serial.println(F(SSD1306 allocation failed)); for(;;); // 卡住 } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.display(); // 初始化收音机 radio.setMono(false); // 设置为立体声如果信号差可设为true以减少噪音 radio.setMute(false); // 设置初始频率为第一个预存电台 radio.setFrequency(presetFrequencies[currentPresetIndex]); // 初始化按钮引脚为上拉输入模式 pinMode(BUTTON_PIN, INPUT_PULLUP); // 显示初始信息 updateDisplay(); }loop()函数的核心是检测按钮动作并更新显示。void loop() { // 检测按钮是否被按下低电平有效 if (digitalRead(BUTTON_PIN) LOW) { delay(50); // 简单防抖 if (digitalRead(BUTTON_PIN) LOW) { // 确认按下 currentPresetIndex (currentPresetIndex 1) % presetCount; // 循环切换 radio.setFrequency(presetFrequencies[currentPresetIndex]); updateDisplay(); // 等待按钮释放避免连续触发 while(digitalRead(BUTTON_PIN) LOW); delay(50); } } // 这里可以添加其他功能如信号强度读取等 }最关键的updateDisplay()函数负责在OLED上绘制当前信息void updateDisplay() { display.clearDisplay(); display.setCursor(0, 0); display.println(F( 复古收音机 )); // 使用F()将字符串存到Flash节省RAM display.println(); display.print(F(频率: )); display.print(presetFrequencies[currentPresetIndex], 1); display.println(F( MHz)); display.println(); display.print(F(电台: )); display.println(presetNames[currentPresetIndex]); display.println(); display.println(F(----------------)); display.display(); }这段代码构建了一个最基本的可运行系统。你可以通过修改presetFrequencies和presetNames数组来定制你当地的电台。编译并上传到Arduino你应该能通过按钮切换电台并在OLED上看到相应的变化同时听到广播声音。4.3 功能增强与优化基础功能实现后我们可以考虑一些增强体验的优化自动搜台与存储可以编写一个函数让收音机从87.5MHz开始步进扫描到108MHz通过读取TEA5767的信号强度指示自动找出信号强的频率并存入数组。这需要更深入地研究TEA5767库的函数。音量控制如果功放模块支持数字控制如通过I2C或PWM可以增加一个编码器或另一个按钮来实现软件音量调节并在OLED上显示音量条。睡眠定时器增加一个长按关机功能或者实现定时关闭让收音机更像一个现代电器。信号强度与立体声指示从TEA5767读取这些信息并显示在OLED上增加专业感。5. 调试、问题排查与进阶玩法即使按照教程一步步来也难免会遇到一些小问题。这里分享一些我踩过的坑和解决方案。5.1 常见问题速查表问题现象可能原因排查步骤与解决方案上电后无任何反应1. 电源未接通或电压不足。2. Arduino板损坏。3. 核心接线VCC GND错误。1. 用万用表测量Arduino Vin和5V引脚电压。2. 尝试单独给Arduino上电看电源指示灯是否亮起。3. 检查所有电源和地线连接是否牢固。OLED屏幕不显示1. I2C地址错误。2. 接线错误SDA SCL接反。3. 屏幕本身损坏或供电不对。1. 运行一个I2C扫描程序确认屏幕上显示的地址通常是0x3C或0x3D。2. 交换SDA和SCL线试试。3. 确认屏幕是5V还是3.3V供电用万用表测量VCC引脚电压。收音机无声音或噪音大1. 音频线未接或接错。2. 功放未供电或损坏。3. 天线未接或太短。4. “地”未共接引入交流噪声。5. TEA5767模块故障。1. 检查TEA5767到功放的音频线连接。2. 检查功放电源指示灯用耳机直接接TEA5767音频输出需串联一个10uF电容隔直试听。3. 确保天线已连接并尝试调整其长度和位置。4.确保Arduino、TEA5767、功放、电源的GND全部连接在一起这是消除“嗡嗡”声的关键。5. 更换模块测试。按钮控制不灵敏或连跳1. 按键抖动。2. 上拉电阻未启用或损坏。1. 在代码中增加防抖延时或使用更优的millis()定时防抖逻辑。2. 检查按钮引脚是否配置为INPUT_PULLUP或外部上拉电阻是否接好。接收频率不稳定或漂移1. TEA5767晶振精度问题。2. 电源纹波干扰。1. 这是廉价TEA5767模块的通病可尝试在代码中微调频率补偿值。2. 为Arduino和TEA5767的电源输入端并联一个100uF的电解电容和一个0.1uF的瓷片电容进行滤波。编译时内存不足使用的库过多或代码太大。1. 检查是否安装了不必要的库。2. 使用F()宏将长字符串常量存储到Flash而非RAM中如display.println(F(“Hello”));。5.2 进阶升级建议当基础版本成功运行后你可以考虑以下升级让这台复古收音机变得更强大蓝牙音频输入这是最实用的升级。购买一个小巧的蓝牙音频接收模块如JDY-31支持APT-X将其音频输出接入功放模块的AUX输入。通过一个按钮或开关在FM和蓝牙模式间切换。这样你的老收音机瞬间变成了一台蓝牙音箱。数字功放与音质提升将基础的PAM8403升级为更高品质的功放板如使用TI TPA3116芯片的板子并为其配备一个独立的线性电源非开关电源能显著提升声音的力度和清晰度。甚至可以尝试为单声道的老喇叭增加一个低音辐射盆改善低频。锂电池供电与便携化使用一块18650锂电池搭配充放电保护板实现完全无线便携。需要增加一个电压检测电路并在OLED上显示电量。注意Arduino Uno的Vin引脚需要7-12V输入所以你需要一个升压模块将锂电池的3.7V升压到9V。网络收音机与播客这是终极玩法。将主控换成ESP32利用其Wi-Fi功能接入网络。你可以编写代码让它连接互联网收音机流媒体如Icecast或播客平台通过OLED和旋钮进行菜单操作。这彻底突破了FM的频率限制拥有了全世界的音频内容。改造完成后看着这台沉寂半个多世纪的收音机重新流淌出声音那种成就感是无可比拟的。它不再只是一台收音机而是你亲手赋予新生的、承载着历史与科技的作品。每一次旋钮的转动每一次电台的切换都是与过去和现在的一次连接。