1. 项目概述从概念到现实的声学操控超声波相控阵听起来像是实验室里的高端设备但通过一个精心设计的DIY项目你完全可以将它搬进你的工作室。这个项目的核心是构建一个由256个独立的40kHz超声波换能器组成的16x16阵列并通过一块FPGA现场可编程门阵列对每一个换能器发射声波的相位进行独立、精确的实时控制。这听起来很复杂但简单来说它就像指挥一支由256名乐手组成的交响乐团通过微调每位乐手开始演奏的时间相位让所有声波在空间中的特定一点完美叠加形成强大的“声学焦点”。这个焦点能做什么它的能力超乎你的想象。首先它能产生足够强的声辐射压力在焦点处形成一个稳定的“声阱”足以捕获并悬浮起轻小的聚苯乙烯泡沫球或水滴实现声悬浮。其次当这个焦点快速扫过你的手掌皮肤时你能清晰地感觉到一种按压或振动的触感这就是空中触觉反馈。最后由于超声波在空气中传播的非线性效应两个40kHz的声波可以“混合”产生可听的声音并且这个声音只会在声束聚焦的路径上被听到从而实现定向扬声器的效果让声音像手电筒的光束一样定向传播。我之所以投入精力研究并复现这个项目是因为它完美地融合了硬件设计、嵌入式编程和物理原理是极客精神和工程实践的绝佳体现。它不仅仅是一个“玩具”更是一个强大的原型平台适用于交互艺术装置、新型人机交互界面研究甚至是物理教学演示。整个项目的物料成本大约在200美元左右需要你具备一定的表面贴装焊接经验和嵌入式系统调试能力。接下来我将拆解整个构建过程分享从电路板制作到最终调试的每一个细节与踩过的坑。2. 核心硬件设计与选型解析构建一个稳定可靠的超声波相控阵硬件是基石。这部分的设计直接决定了系统的性能上限和调试难度。2.1 核心元件选型与供应链策略整个系统的核心是超声波换能器。必须选择中心频率为40kHz、直径约10mm的型号。我使用的是Manorshi的MSO-P1040H07T性价比很高。这里有一个关键点这类换能器通常有最小起订量MOQ比如500个。直接联系供应商他们通常愿意以稍高的单价出售较小数量如256个。另一个可靠的品牌是Ningbo的FBULS1007P-T。在购买前务必索要样品测试其谐振频率和灵敏度的一致性批次差异会导致后期校准工作量剧增。驱动芯片的选择关乎输出功率和可靠性。原设计使用MIC4127这是一款双通道、高速、低侧MOSFET驱动器。它的关键参数是峰值输出电流可达1.5A足以快速驱动换能器的容性负载。备选方案如TC4427A性能类似而MIC4478虽然支持更高电压32V但价格昂贵除非你需要极高的声压否则MIC4127是更经济的选择。购买时注意选择SOIC-8封装。主控单元采用Waveshare的CoreEP4CE6 FPGA核心板。选择Cyclone IV EP4CE6芯片的原因在于其拥有足够的逻辑单元约6K LE和用户I/O口来控制256个通道。FPGA的并行处理能力是实现对256路相位进行实时、同步控制的唯一可行方案微控制器MCU无法胜任。配套的USB Blaster下载器是编程必备。注意电源规划至关重要。系统有两个主要电源轨逻辑电源5V和发射器电源Power Rail 6-18V。逻辑电源为FPGA、移位寄存器和驱动芯片的逻辑部分供电要求不高但需稳定。发射器电源直接决定换能器的输出声压电压越高声压越强悬浮能力也越强但功耗和发热也越大。我建议从9V开始调试。你需要一个双路输出的可调稳压电源或者两个独立的电源模块。2.2 PCB布局与电源完整性考量PCB是项目的骨架其设计质量直接影响信号完整性和最终效果。板子尺寸为183x169mm双面板设计。布局的核心挑战是如何将256个换能器、128个驱动芯片和32个移位寄存器有机地整合并确保控制信号和电力输送的纯净。信号链设计FPGA的I/O口数量有限无法直接控制256个通道。这里采用了经典的“行列扫描”架构的变体——串行转并行加级联。FPGA通过几根SPI-like的线数据、时钟、锁存连接至第一颗74HC595移位寄存器。每颗595可以控制8个输出32颗595级联起来就能用区区几根线控制256个通道。每个595的输出连接到一个MIC4127驱动器的输入由驱动器来放大电流驱动换能器。电源网络设计这是最容易出问题的地方。板上存在数字5V 3.3V和模拟18V Power Rail两种电源。必须采用星型接地或单点接地策略避免数字噪声通过地线串扰到敏感的功率输出部分。在PCB上应将功率地PGND和数字地DGND在电源输入端子处单点连接。同时必须在每个驱动芯片的电源引脚附近放置去耦电容。我使用了160个0805封装的0.1μF陶瓷电容分别放置在每对驱动芯片的5V和18V电源引脚旁这是抑制高频开关噪声、保证每个通道独立工作的关键。换能器焊盘设计每个换能器有两个焊盘。一个连接驱动器的输出信号另一个连接地。PCB上交替排列信号和地孔但每两行信号孔的位置会交换一次。在焊接时必须对照PCB丝印或原理图用万用表确认每个孔连接的是什么切不可凭感觉乱焊否则会导致一半的换能器相位反相无法形成有效聚焦。3. 焊接组装全流程与工艺要点焊接是整个项目中最耗时、也最考验耐心的环节。采用“先贴片后通孔”的顺序并强烈推荐使用回流焊炉。3.1 SMD元件焊接钢网与回流曲线PCB与钢网准备收到PCB和定制钢网后首先用异丙醇和无尘布彻底清洁。将PCB固定在平整台面上四周用废板或胶带垫高使其与钢网紧密贴合。对齐钢网确保每个焊盘开口精确对应。涂抹焊膏使用刮刀将焊膏均匀刮过钢网。力度要适中一次成功避免来回涂抹导致焊膏渗漏或不足。移开钢网后PCB上应有一层均匀、饱满的焊膏涂层。贴放元件这是最需要细心和好工具的一步。使用尖头镊子对照BOM和位号图依次贴放元件。特别注意元件的方向MIC4127驱动器芯片上有一个小圆点或凹坑标识第1脚。PCB上也有一个白丝印框或圆点。关键来了由于PCB布局优化每一行驱动器的方向是交替的比如第1行芯片的1脚朝左第2行就朝右。必须逐行核对我在这里贴反了好几个返工极其痛苦。74HC595移位寄存器同样需要注意方向但通常是同一方向。0805电容无极性方向任意。回流焊接将贴好元件的PCB小心放入回流焊炉。使用焊膏供应商推荐的温度曲线。一个典型的无铅焊膏曲线可能是150-180°C预热60-90秒然后快速升温至峰值温度235-245°C保持30-45秒最后冷却。没有回流焊炉也可以用热风枪配合加热板但需要对温度和风速有极好的控制否则容易吹飞小元件或加热不均。3.2 通孔元件焊接与初步检测SMD元件焊接并冷却后进行通孔元件的焊接。焊接FPGA插座和侧边连接器将2x22的排母剪成合适长度对照FPGA核心板上的孔位先将其插在核心板上然后一起对准PCB上的孔位放好这样能保证插座间距绝对准确。用胶带临时固定后翻过来焊接。侧边的电源端子、串口插座等也一并焊好。上电前关键检查焊接完成后切勿立即通电必须进行以下检查目视检查用放大镜检查有无桥连、虚焊、元件错位。短路测试使用万用表蜂鸣档重点测量5V对地和18V Power Rail对地是否短路。这是最重要的安全步骤任何电源对地短路都会在通电瞬间损坏大量芯片。基本连通性随机抽查几个驱动芯片的输入脚连接595输出与对应595输出焊盘的连通性。3.3 换能器焊接与机械固定制作或准备垫高支架为了防止换能器引脚过长导致背面短路并让所有换能器发声面处于同一平面需要在PCB和换能器之间加一个垫片。可以用激光切割亚克力或3D打印一个带有256个孔的网格板厚度约2-3mm。极性测试与标记强烈建议换能器虽然标有“”和“-”但批次间可能有误。最可靠的方法是用一个已知好的驱动通道或信号发生器连接一个换能器用另一个换能器作为接收器靠近它用示波器观察接收信号。当驱动信号上升沿时接收到的正弦波峰值如果为正则驱动换能器的正极接的就是信号端。在焊接前用油性笔在所有换能器的正极信号端做上标记。这个步骤能省去后期大量的软件相位校准工作。焊接将垫片放在PCB上然后把所有换能器按标记插入对应的孔中标记端对准信号孔。确保所有换能器安装平整。翻过PCB在背面焊接。由于焊点众多建议使用刀头烙铁和高质量的含铅焊锡丝效率更高。4. FPGA固件烧录与通道功能验证硬件组装完毕接下来是让系统“大脑”开始工作。4.1 搭建开发环境与初次烧录安装软件你需要安装较旧版本的Quartus II 13.0 SP1Web Edition即可和对应的USB-Blaster驱动。同时需要安装Java JDK 11来运行后续的Ultraino控制软件。独立编程FPGA核心板在将核心板插到主PCB之前先单独对其编程。连接USB-Blaster到核心板的JTAG口并通过Micro USB线或单独的5V电源为其供电。打开Quartus Programmer添加项目提供的PrimaryNoCalib.jic文件。选择JTAG模式识别到设备后点击“Start”。烧录完成后核心板上的用户LED通常是L4应该开始闪烁这表明FPGA已经运行起来了。集成到主板并上电将编程好的FPGA核心板按正确方向插入主PCB的插座。再次用万用表确认5V和18V电源对地无短路。然后先连接5V电源可用USB供电观察电流是否正常通常小于0.1A。再连接可调电源到18V电源输入端先将电压调至0V然后慢慢调高至9V同时监视电流。正常空载未开启任何通道下18V电源的电流应几乎为0。4.2 逐通道信号测试这是验证硬件焊接和FPGA驱动是否正常的关键步骤。连接示波器将示波器探头地线夹在PCB的GND测试点上。使用示波器的两个通道。寻找参考信号PCB上有一个标记为“D”的测试点或通过原理图找到FPGA输出的原始PWM信号点。将示波器的一个通道设为触发源连接至此应能看到一个3.3V、40kHz的方波。测试驱动输出将示波器的另一个通道连接到任意一个换能器的信号焊盘上。由于驱动芯片的放大这里应该能看到一个与参考信号同频、但幅度接近电源电压9V的方波由于换能器的容性负载边沿会变得圆滑。系统化测试你可以通过临时修改FPGA测试代码或者使用后续的Ultraino软件逐个打开通道用示波器检查每个换能器信号端的输出。记录下所有没有输出或输出异常的通道编号。出现几个坏通道是正常的可能是焊接问题或芯片损坏。如果出现整行或整列不工作则需要检查对应移位寄存器74HC595的焊接和级联信号。实操心得在这个阶段我遇到了一个诡异的问题单个通道测试正常但同时打开多个通道时某些通道会失效。排查后发现是电源功率不足导致的。当大量通道同时打开时瞬间的电流需求很大如果电源响应慢或线缆太细会导致电压瞬间跌落使得驱动芯片工作异常。解决方案是使用响应速度快的开关电源并加粗电源连线同时在18V电源入口处并联一个大容量如1000μF的电解电容储能。5. 系统校准让256个声音同步硬件正常后要让256个换能器像一支军队一样协同工作必须进行相位校准。因为每个换能器、每个驱动通道的电气延迟都有微小差异。5.1 使用Ultraino软件进行交互式校准连接通信链路使用Arduino Nano作为USB转TTL串口桥接器。将Arduino的TX、RX、5V、GND分别连接到主PCB的对应引脚。在Arduino IDE中上传一个空程序例如Empty Sketch其作用是让Arduino的USB转串口功能直通。运行Ultraino打开Ultraino仿真软件加载一个与你的硬件配置匹配的仿真文件如单板的配置文件。建立连接在“Devices”选项卡中选择“ChainedFPGA”协议点击“Connect”选择Arduino对应的串口。如果连接成功软件界面会与硬件同步。校准流程将一个小型、完好的超声波接收换能器或一个已知极性的发射换能器作为接收器连接到示波器的另一个通道。在Ultraino软件中选中第一个换能器图标按‘W’键打开它。将接收换能器紧贴被测换能器放置。此时示波器上应同时看到参考方波通道1和接收到的正弦波通道2。目标调整软件中该通道的相位偏移值按‘H’/‘J’微调按‘K’翻转180度使得参考方波的上升沿与接收正弦波的峰值点对齐。这保证了所有换能器在发出声波时在空间某点的波前是同步的。按‘M’键切换到下一个换能器重复此过程直到完成全部256个。软件会自动保存每个通道的校准值。5.2 将校准值固化到FPGA中软件校准很方便但每次使用都需要电脑和软件。对于需要独立工作的装置可以将校准值“烧死”进FPGA。导出校准数据在Ultraino中完成校准后导出校准文件。文件里包含了每个通道的相位偏移值。修改FPGA源码在Quartus工程中找到负责分配相位的模块如Distributor.v或类似。将导出的256个相位偏移值以常数数组的形式替换掉原来的默认值通常是全零。重新编译与生成固化文件这个过程非常耗时可能需要30分钟到1小时。编译成功后你会得到一个.sof文件。但FPGA的配置存储器是掉电易失的我们需要将其转换为可烧录到配置Flash中的.jic文件。生成并烧录JIC文件在Quartus中打开“File” - “Convert Programming Files”。选择输出文件类型为.jic配置器件选择EPCS16FPGA型号选择Cyclone IV E: EP4CE6。在“Input files to convert”部分添加刚才生成的.sof文件。点击“Generate”生成.jic文件。最后使用Programmer工具将这个.jic文件烧录到FPGA核心板的配置Flash中。此后一上电FPGA就会加载带有校准信息的配置无需软件干预。6. 核心应用实现与调试一切就绪现在可以探索这个相控阵的神奇应用了。6.1 单板声悬浮创造静态声阱这是最直观的应用。你需要一个声学反射面比如一块光滑的亚克力板或木板。设置将阵列板面朝下平行放置在反射面上方距离约为16厘米这个距离接近最佳焦距可根据公式调整。在Ultraino软件中加载单板仿真文件。创建焦点在软件的3D视图中点击反射面软件中通常显示为一个“切片”你点击的位置就会出现一个焦点标记。确保“连接硬件”和“启用发射”的选项被勾选。悬浮颗粒使用干燥的聚苯乙烯泡沫球直径0.5-1mm或小水滴。从侧面轻轻吹送或滴落颗粒到焦点附近。如果一切正常你会看到颗粒被稳定地捕获在焦点位置并可能缓慢旋转。你可以用鼠标拖动焦点颗粒也会随之移动。参数调节悬浮的稳定性取决于焦点声压的强度。在软件中可以调节发射信号的占空比Duty Cycle来改变输出功率。功率太大会将颗粒吹飞太小则无法捕获。需要耐心微调。6.2 双板3D悬浮与多焦点操控单板悬浮是二维的颗粒被“钉”在反射面上方。要实现真正的三维悬浮需要两个阵列相对放置。硬件连接你需要制作第二块阵列板作为“次级板”。两块板通过支架面对面放置间距在10-20厘米之间可调。两块板的FPGA需要以“主-从”模式连接。通常主板的串口输出连接到从板的串口输入实现级联控制。软件配置在Ultraino中加载twoOpposedArrays.xml仿真文件。在连接设备时先连接主板的串口然后点击“Con Extra”按钮连接从板的串口可能需要根据评论区的代码修复Bug。创建三维声阱在软件中你可以分别在顶部和底部阵列的声场中设置焦点。当两个焦点在三维空间中精确重合时会形成一个三维的声压梯度陷阱将颗粒稳定悬浮在空中不与任何物理表面接触。多焦点与动态控制Ultraino软件支持创建多个焦点并让它们按照预设轨迹运动。你可以编程让多个颗粒同时悬浮并跳舞。这涉及到更复杂的声学算法如声学全息图或时间反演FPGA需要实时计算每个换能器到每个焦点的距离差并修正相位。6.3 空中触觉反馈的实现让皮肤感觉到“无形”的声波原理是利用声辐射压力对皮肤表面的周期性按压。调制原理单纯的40kHz超声波人耳听不见皮肤也感觉不到。需要对其进行幅度调制。例如用200Hz的低频信号去开关40kHz的超声波束。这样在焦点处就会产生200Hz的声压变化皮肤就能感知为振动。FPGA实现项目提供了专门的触觉反馈FPGA代码。它并非简单地全局调制而是采用了一种“顺序扫描”的策略。即快速地在不同换能器子集之间循环切换使得在焦点处合成的声压呈现出低频调制效果但同时让整体的可听噪声由非线性效应产生最小化。你需要烧录这个专门的固件。体验将手放在阵列前方在软件中创建一个焦点并移动到手掌位置。开启触觉模式你就能感觉到一个清晰的、局部的振动点。通过控制焦点的移动路径可以在皮肤上“画出”简单的图形或字母。6.4 定向扬声器功能这是基于“参量阵”原理。当两个高频如40kHz声波在空气中以足够高的强度传播时由于空气的非线性特性它们会产生和频80kHz与差频0Hz即直流和可听频段如1kHz。差频信号可听声会沿着原高频声束的方向传播从而具有极强的方向性。实现方法在FPGA中你需要对40kHz的载波信号进行双边带调制。例如要产生1kHz的声音你需要让换能器同时发射40kHz和40kHz ± 1kHz即39kHz和41kHz的信号。这三者在空气中相互作用最终会产生可听的1kHz声音并且其波束角非常小。应用你可以让焦点沿着一条路径快速扫描并通过动态改变调制信号使得在不同位置产生不同的可听声。这样只有站在声束路径上的人才能听到声音旁边的人则几乎听不见创造出一种“音束”或“定向私密语音”的效果。7. 高级扩展与问题深度排查在基础功能实现后你可以尝试更多可能性并需要准备好应对各种复杂问题。7.1 使用ESP32实现脱机控制依赖PC运行Ultraino软件限制了装置的便携性。你可以用ESP32微控制器来替代PC。硬件连接ESP32通过串口与主FPGA板通信。同时可以从主板的18V电源轨通过一个DC-DC降压模块如LM2596为ESP32提供5V电源。功能实现在ESP32上编程实现一些预置的焦点运动模式如螺旋线、立方体顶点、简单的悬浮控制逻辑甚至可以通过Wi-Fi接收来自手机或电脑的指令动态改变焦点位置。项目Github仓库提供了ESP32控制器的示例代码这是一个很好的起点。优势这使得整个系统可以嵌入到独立的艺术装置或交互展品中无需连接笨重的电脑。7.2 多板级联扩展声场单个16x16阵列的声场范围和焦点强度有限。通过级联多个阵列板可以扩大有效作用区域。串联与并联串联Chained如之前所述一块主板的输出控制下一块主板。优点是只需一个串口控制同步性好。缺点是数据链路过长可能增加延迟。并联Parallel每块板子都通过一个独立的USB转串口模块连接到电脑。在Ultraino软件中你需要为每块板子建立一个连接使用SimpleFPGA协议。软件需要计算每个焦点相对于每块板子的相位并分别发送指令。这要求软件和算法能够处理多设备协同。声场拼接多块板子可以排列成更大的平面甚至曲面。在软件中你需要将每块板子的物理位置和朝向作为参数输入软件会统一计算全局坐标系下的焦点并分解到每块板子。7.3 系统性故障排查指南在调试过程中你几乎一定会遇到各种问题。以下是一个系统化的排查思路问题现象可能原因排查步骤上电后电流异常大0.5A或电源发烫电源短路驱动芯片损坏短路。1. 立即断电。2. 用万用表仔细检查5V和18V对地电阻应大于几十欧姆。3. 检查所有MIC4127芯片触摸是否有异常发热点。4. 使用热成像仪或冷却喷雾定位短路芯片。FPGA编程失败JTAG链无法识别USB-Blaster驱动问题JTAG连接线接触不良FPGA核心板未供电。1. 确认Quartus Programmer中已选择正确的USB-Blaster。2. 重新拔插JTAG排线检查有无弯针。3. 确保FPGA核心板在编程时已接通5V电源可通过核心板LED判断。4. 尝试更换USB-Blaster或USB口。部分通道无输出但对应595输出正常该通道的MIC4127驱动器损坏或焊接不良去耦电容短路。1. 用示波器测量MIC4127的输入脚来自595确认有3.3V方波。2. 测量MIC4127的输出脚应为高电平接近18V或方波。若无更换该驱动器。3. 检查该驱动器旁的0.1μF电容是否短路。整行或整列通道不工作为该行/列提供数据的74HC595损坏、虚焊或级联信号断线。1. 检查该595的电源5V和地。2. 用示波器检查其数据输入SER、时钟SRCLK、锁存RCLK信号是否正常。3. 检查其输出使能OE引脚是否被错误拉高应接地。4. 检查其到下一颗595的级联输出Q7‘是否连通。软件能控制部分通道但控制逻辑混乱如打开A通道B通道响应74HC595的级联顺序在PCB设计或FPGA代码中定义错误FPGA引脚分配文件.qsf有误。1. 核对原理图确认595的级联顺序SER - QA...QH - QH’ - 下一颗SER。2. 核对FPGA代码中生成移位数据的逻辑是否与硬件连接顺序匹配。这是一个非常棘手的逻辑错误需要仔细对照。悬浮不稳定颗粒容易掉落焦点功率不足环境气流干扰反射面不平整或吸声换能器相位未校准好。1. 提高18V电源电压如升至12V注意散热和电流。2. 在安静无风的环境下操作。3. 使用光滑、坚硬的反射面如玻璃、大理石。4. 重新进行精细的相位校准确保所有通道同步。5. 尝试在软件中稍微增加焦点大小声束宽度。双板模式中其中一块板无反应主从板连接线错误从板FPGA固件错误应烧录Secondary固件Ultraino软件中多板连接配置错误或存在Bug。1. 检查主板的串口输出TX是否连接到从板的串口输入RX。2. 确认从板烧录的是SecondaryNoCalib.jic文件。3. 参考项目评论区关于“Con Extra”按钮Bug的修复方法修改Ultraino的Java源代码。一个真实踩坑记录我曾遇到一个诡异问题悬浮焦点总是偏离鼠标点击位置几厘米。排查了很久最终发现是Ultraino仿真文件中定义的阵列物理尺寸换能器间距与我实际制作的PCB尺寸有微小出入。软件根据这个尺寸计算波程差尺寸错了焦点位置自然就错了。务必确保仿真文件中的pitchX和pitchY参数换能器中心间距与你PCB的实际情况完全一致。构建这样一个超声波相控阵系统是一场充满挑战的旅程它横跨了电路设计、精密焊接、嵌入式编程和声学物理。每一个环节的失误都可能让最终效果大打折扣。但当你第一次看到泡沫球违背重力悬浮起来或者感觉到凭空出现的触感时那种成就感是无与伦比的。这个项目不仅是一个酷炫的装置更是一个强大的学习和研究平台。你可以在此基础上尝试更复杂的多焦点算法、探索不同的调制方式用于触觉渲染或是将其集成到更大的交互艺术项目中。硬件开源的力量在于你可以站在前人的肩膀上去触碰那些曾经只存在于论文中的未来科技。