使用M5Stack AtomS3和扬声器构建一个微型Wi-Fi收音机
大家好,欢迎回来!这是StackFM,一款基于M5Stack AtomS3、MAX98357A I2S音频放大器和扬声器打造的紧凑型Wi-Fi收音机。
这个项目的核心理念是将小巧的AtomS3变成一个功能完整的桌面收音机:能够连接网络电台流媒体,通过内置扬声器播放,并且保留简洁的物理操作界面。
为了不把所有控制功能都塞进AtomS3的128×128显示屏上,我专门设计了一个定制的网页来控制收音机。用户可以通过连接同一Wi-Fi网络的手机或电脑打开该网页,在页面中添加直播链接、保存电台、选择想听的内容、控制播放以及调节音量。
关键之处在于,手机仅作为无线控制器使用,不会播放音频。一旦选中某个电台,AtomS3会直接与该流媒体连接,并将音频信号发送至MAX98357A放大器,再由其驱动扬声器播放。
我还希望设备能像一台老式调频收音机一样,尽管它实际上通过Wi-Fi接收电台信号。因此,收音机显示屏和浏览器控制器都采用了复古风格的界面。
本文将详细介绍该项目的完整制作过程。那么,废话不多说,开始吧!
所需材料
- M5Stack AtomS3(内置128×128显示屏幕)
- MAX98357A I2S数字音频放大器
- 与放大器兼容的外接扬声器
- 自定义StackFM电路板
- IP5306电源管理IC
- 10 µF SMD 1206电容
- 10 kΩ SMD 0805电阻
- 1 µH SMD电感
- 0805指示LED灯
- USB Type-C接口
- 按钮开关
- 3D打印的StackFM外壳及配件
- 跳线或短接线
ATOMS3与音频设置
M5Stack AtomS3是StackFM的核心组件。它连接Wi-Fi,运行网页,接收指令,开启音频流,更新显示屏,并将数字音频数据发送至放大器。
音频通过I2S接口传输,该接口使用三个主要信号:
•BCLK — 音频位时钟
•LRC/WS — 单词选择
•DIN — 数字音频数据
MAX98357A接收这些信号,将数字音频进行转换、放大后驱动扬声器输出。
MAX98357A 与扬声器
MAX98357A 可直接接收 ESP32-S3 的 I2S 音频信号,因此无需额外的 DAC 和放大器。
扬声器连接在 SPK+ 和 SPK- 之间。两个扬声器端子均不应接地,因为该模块采用桥接输出方式。
在测试过程中,我尽量将 I2S 线路保持短小,并确保 AtomS3 与放大器共用同一地线。
设计
在 Stack FM 的设计中,我希望它看起来像一个小型桌面收音机,而不是普通的电子设备外壳。
机身设计紧凑且方正,以便所有部件都能合理安置,而前面板则作为项目的主要视觉焦点。
前面板采用黑色面板,顶部有凸起的 STACK FM 标志。我使用蓝色/青色打印了标志,使其在黑色背景上清晰醒目。外部机身和按钮也采用了相同的蓝色,使整个设备呈现出简洁的双色调外观。
在前面板下方,我加装了三个圆形按钮。这些按钮让设备更像一台真正的收音机,而非仅通过网页应用进行控制的设备。
机箱的一侧还设有扬声器格栅,以便内部扬声器的声音能够正常传出。这一点非常重要,因为该项目旨在像独立收音机一样运行,音频来自设备本身。
整体设计简洁:
•蓝色外壳
•黑色前面板
•凸起的Stack FM标志
•三个前面按钮
•侧面扬声器格栅
•紧凑的收音机式外形
这里的主要目标不仅仅是隐藏电子元件,而是让整个项目看起来像一个完成的迷你设备。尽管它以一块小型AtomS3板为核心,但外壳的设计却赋予了它类似正规迷你FM收音机的外观。
3D打印外壳
在确定设计后,我开始对所有外壳部件进行3D打印。为了便于打印、组装和表面处理,我没有将整个机身作为一体件打印,而是将设计拆分为多个独立部分。
如图所示,主要部件包括蓝色外罩、黑色前面板、三个按钮、立体的STACK FM标志以及扬声器格栅。分别打印这些部件还使得可以使用不同颜色,而无需进行复杂的后期处理或涂装。
主体部分采用Aqua PLA材料打印,为收音机提供了主色调。前面板则单独用黑色打印,使控制按钮和立体标志与前面板形成鲜明对比。
STACK FM标志也作为独立的立体部件打印出来,使其从前面板中脱颖而出,使整体外壳呈现出更成熟、近乎商用产品的外观。
三个圆形按钮也是单独打印的。将它们作为独立部件,不仅便于安装,还能在按下时正常移动。
我还单独打印了扬声器格栅。它采用简单的排列小孔设计,既能让内部扬声器的声音通过,又能保护扬声器不被外壳外露。
这种设计和打印外壳的方式还有一个优势:可以对各个部件进行微小调整,而无需重新打印整个外壳。同时,也大大方便了对不同组件的颜色和适配性进行实验。
PCB设计
本项目使用了一个定制的单板电路(PCB),将按钮和电源管理电路集成到一个紧凑的电路板上。该PCB基于我早期的一个Waveform项目进行修改,其中麦克风部分未用于Stack FM。
电路板包含三个按钮和IP5306电源管理IC。一个锂聚合物电池连接至IP5306电源管理IC,可提供稳定的5V 2A输出,为矩阵和Pico供电。三个按钮用作本项目中的物理控制装置:其中一个为连接至IP5306的主电源开关,另外两个则连接至Pico的GPIO0和GPIO1。
由于本项目未使用原始波形PCB上的麦克风部分,因此MAX9814及其连接线已被保留未用。
我们还添加了必要的接口连接器,用于将PCB与项目其他部分连接。HUB75连接器(CON-16)用于将64×32 LED矩阵连接至Pico,具体连接如下:A接GPIO19,B接GPIO16,C接GPIO18,D接GPIO20,E接GPIO22,CLK接GPIO11,LAT/STB接GPIO12,OE接GPIO13,R1接GPIO2,G1接GPIO3,B1接GPIO4,R2接GPIO5,G2接GPIO8,B2接GPIO9。
此外,我们还加入了CON2连接器用于5V和GND,以及CON4连接器,用于分离GPIO0、GPIO1、GPIO26和GPIO28。
PCB设计基于我们3D CAD模型中的PCB轮廓,这有助于根据外壳尺寸正确布置按钮、USB Type-C接口、Pico引脚布局、安装孔及连接器位置。
PCB组装
本项目包含两种不同的电路。我们首先进行开关–麦克风–电源板的组装流程。使用焊膏涂布针,将63/37 Sn/Pb焊膏均匀涂抹在每个SMD元件的焊盘上。
接着,利用ESD镊子将每个SMD元件精确拾取并放置到PCB上。
完成贴装后,将PCB移至回流焊热板上。当电路板从底部开始加热时,温度逐渐上升,直至达到焊膏的熔点。当PCB温度升至约200°C时,焊膏融化,所有SMD元件均被牢固固定到位。
为M5 Atom制作帽子
为了使线路更整洁,我还为M5Stack AtomS3定制了一个小型HAT。
HAT 作为一个小型附加板,与 AtomS3 配合使用,承载 MAX98357A 模块的基本连接、扬声器线路以及外部按钮。相比使用跳线将所有部件松散连接,HAT 使最终的布线更加紧凑可靠。
对于这块电路板,连接方式根据代码中使用的引脚进行布局:MAX98357A 的 I2S 线路连接到选定的 GPIO 引脚,两个外部按钮则通过接地连接到各自指定的引脚上。
随后,将 HAT 安装到 AtomS3 上,使得整个电子部分更容易嵌入 3D 打印机机身内部。
完成之后,整体装配变得整洁许多,设备便可放入外壳中。
电路与接线
扬声器直接连接在 SPK+ 和 SPK- 上。
在为电路供电前,我检查了 5V 和地线连接,确认了三根 I2S 线缆,并确保没有扬声器端子接地。
面包板设置
在将所有组件安装进 3D 打印机机身之前,我先在面包板上对整个电路进行了测试。
这一步非常重要,因为项目包含多个部分需要协同工作:AtomS3、MAX98357A放大器、扬声器以及物理按钮。在机箱外部测试所有部件,使得在最终组装前更容易检查接线并修复任何问题。
我使用I2S引脚将MAX98357A模块连接到AtomS3上,扬声器则连接到MAX98357A模块的输出端子。
接下来,我在面包板上添加了按钮,并将其连接到GPIO引脚。按钮的接线方式很简单,按下按钮时,GPIO引脚会与GND相连。由于代码使用了内部上拉电阻,因此无需额外的上拉电阻。
完成接线后,我将第一个测试代码上传到AtomS3,并检查设备是否能连接Wi-Fi,并对本地网页应用作出响应。
面包板的设置有助于验证:
- MAX98357A音频输出
- 扬声器连接
- I2S线路
- 按钮输入
- Wi-Fi连接
- 与本地网页应用的通信
这也帮助确认了基本的无线电系统在将所有组件装入最终机箱之前已正常工作。
最终连接与组装
在面包板上测试电路后,我开始进行3D打印外壳内的最终布线和组装。
首先,我将AtomS3放入外壳内部,并检查屏幕与前面开口的对齐情况。接着,我在壳体内安装了MAX98357A放大器和扬声器。
扬声器被放置在侧边格栅附近,以确保声音能够清晰传出。这一点很重要,因为设备需要像一个正常的微型收音机一样工作,不能因外壳内部而产生声音阻塞。
然后,我使用之前测试过的相同的I2S接口,将MAX98357A模块永久连接到AtomS3上。
接下来,我将三个前面板按钮安装到对应的插槽中。按钮帽从正面安装,而实际的按键则位于其后方。
在按钮布线方面,我使用了代码中选定的GPIO引脚:
这些按钮采用内置上拉电阻,因此无需额外的上拉电阻。
所有电子元件安装完毕后,我检查了是否有电线压在扬声器锥体上或遮挡按钮。同时,我也确认AtomS3的USB-C接口仍可访问,以便进行编程和供电。
最后,前面板被固定到位,外壳也完成了闭合。
至此,Stack FM 已最终成型:一款紧凑的3D打印收音机,配有显示屏、实体按键和扬声器输出。
本文编译自hackster.io





