资讯动态

用Arduino与3D打印自制40kHz超声波声悬浮装置:从驻波原理到悬浮调试

发布时间:2026/10/9 16:00:04 来源:尧图企业网站定制
我第一次在社区看到有人用一排超声波换能器把泡沫小球稳稳钉在半空的时候第一反应是这玩意儿怕不是有根透明的鱼线吊着。直到自己动手做完一套才明白声悬浮这件事并不需要多高深的理论门槛它真正吃功夫的地方在于换能器阵列的装配精度、驱动电路够不够力、以及你愿不愿意花一整个下午去调那几毫米的反射面高度。这篇文章就围绕Arduino、3D打印和声悬浮这三个关键词展开还原一套入门级声悬浮装置从物理原理到实际悬浮的全过程适合有一定Arduino基础、想做个真正能飘起来的硬件项目的朋友参考。1. 声悬浮的物理底子驻波节点不是玄学很多教程一上来就让你买换能器、打印支架结果东西都装好了泡沫球死活不飘。我建议先花二十分钟把原理捋清楚后面调试能少走一半弯路。1.1 为什么40kHz是DIY圈默认频率声悬浮的核心是驻波。两个同频声波相向传播在空间里叠加后会形成波腹和波节交替分布的区域。波节处的空气几乎不动但两边声压把悬浮物夹在中间听起来很绕其实可以类比成两列对开的队伍在一条走廊里相遇——整体看起来消失了但某些点永远挤成一团某些点永远空着。把泡沫小球放到那个空着的位置它就被声压的梯度力托住了。既然是驻波那就必须选择合适的工作频率。空气中声速大约是340m/s波长λ c / f。40kHz对应的波长是8.5mm波节间距是半个波长也就是大约4.25mm。这个尺度非常理想一方面足够大的节点间隔让泡沫小球有稳定的坑待另一方面40kHz属于超声波范围人耳听不到不会像20kHz的可听高频那样吵得人心烦。频率再低一点波节间距变大但声波变成可闻噪声频率太高比如100kHz节点只有1.7mm悬浮物稍大一点就放不进势阱里去了毫无实用价值。还有一个容易被忽略的点市售的压电超声波换能器几乎都是围绕40kHz这个谐振点设计的。标称40kHz的TCT40-16T这类发射头在39.5kHz到40.5kHz区间内阻抗最低、发声效率最高。如果你非要让它工作在80kHz或者20kHz换能器本身的电声转换效率会急剧下降就算驱动电压拉高也没用。所以40kHz不是谁拍脑袋定的而是换能器产业和声悬浮物理特性共同收敛出来的默认值。1.2 反射式与对射式两种结构的取舍理解了驻波后接下来就要决定结构方案。市面上DIY声悬浮主要有两条技术路线第一种是反射式。一排发射换能器朝下发射超声波正下方放一块平整的反射板超声波打在反射板上反弹回来与入射波叠加形成驻波。这种方案的好处是只需要一组换能器驱动电路简单装配时也不用考虑上下两组换能器的对齐问题。对新手来说这是成功率最高的方案。第二种是对射式。上下各有一组换能器面对面同时发射同频超声波在中间区域形成驻波。经典的开源方案TinyLev就是这种思路。对射式的悬浮力更强、势阱更深能托起更重的物体比如2到3毫米的塑料珠甚至小水滴但代价是装配精度要求极高——上下两组换能器必须严格同心且垂直否则波场不对称悬浮物会疯狂旋转甚至直接飞出去。我的建议很明确第一台装置做反射式用8颗换能器加一块金属反射板把流程跑通等你能稳定悬浮1到2毫米的泡沫球之后再考虑折腾对射式。反射式不是低配版它只是把难度集中在单侧阵列上让你有精力把驱动电压、反射面间距这些参数调明白。等你摸透了驻波脾气再做对射式就是顺水推舟的事。2. 器件清单与选型把钱花在关键点上这个项目总花费大概在150到250元之间其中大头在换能器和驱动电路。别的地方能省这两个东西不能省——省下来的钱最后都会变成调试时流的汗。2.1 换能器选购与真假辨别核心器件是40kHz的压电超声发射换能器常见型号是TCT40-16TT代表发射R代表接收注意别买混了。一般建议一次买10到20颗挑出谐振频率最接近的8到12颗使用。这里有个很重要的分辨技巧换能器表面有金属膜的那一面是发射面背面是塑料壳。正负极很好认通常红色引线接正极蓝色或黑色接负极但极少数批次会标反所以上电之前最好用万用表二极管档测一下正接会显示一个电压值反接显示无穷大。十几块钱一颗的东西没必要赌它引脚颜色一定规范。选型时还要注意尺寸。16mm直径的TCT40-16T是主流但也有13mm和10mm的小型号。声悬浮阵列设计通常以16mm为准换成小直径换能器会带来两个问题一是单颗辐射面积小需要更多数量才能达到足够声压二是3D打印模型的孔位要全部重新适配得不偿失。买到手之后怎么挑最简单的方法是测谐振点。用信号发生器扫频或者直接用下面第四章的Arduino扫频代码配合电流表观察换能器工作电流电流峰值对应的频率就是它的实际谐振频率。把频率差异超过正负0.3kHz的挑出去剩下的同频批次留作阵列。别嫌麻烦同一批换能器厂家出货时谐振频率差异通常不大但总有那么几颗歪果仁混进阵列里会导致声场异常、悬浮物体抖动。2.2 驱动电路方案与Arduino的分工这是很多新手最大的误区以为Arduino引脚直接输出40kHz方波就能驱动换能器。实际上一片Arduino Uno或Nano的数字引脚最大输出电流只有几十毫安而8颗并联的换能器在40kHz下的等效容抗大约是150到200欧姆驱动电压稍微提高一点电流需求就要上百毫安。更关键的是声悬浮需要非常高的声压级换能器两端需要数十伏甚至上百伏的驱动电压5V的TTL电平连门槛都摸不到。所以Arduino在这个项目里的定位是信号源负责产生频率精确的40kHz方波真正的功率放大要交给专门的驱动电路。常用的方案有三档第一档是买现成的40kHz超声驱动小板。这类小板通常自带升压和MOSFET驱动级输入5V或12V电源和TTL方波输出就是上百Vp-p的超声驱动信号。优点是省事到手即用非常适合入门。缺点是这类板子良莠不齐额定功率虚标严重买之前最好确认它标注的驱动电流和输出电压。第二档是自己搭半桥驱动。用TC4420这类MOSFET驱动芯片把Arduino的5V方波转成12V到24V的栅极驱动信号再通过升压变压器耦合到换能器阵列。这样做的好处是可调空间大你能通过改变升压变压器的匝数比来控制实际驱动电压从而控制悬浮能力。第三档是D类功放方案。如果你手头有闲置的D类音频功放板大半都能在40kHz附近工作把输入信号接到功放的信号输入端功放输出端接一组匹配电阻和电容网络再去推换能器即可。优点是功率足缺点是频率响应未必平坦需要实测确认40kHz增益没有明显衰减。无论选哪一档有一个原则不变换能器阵列要用同一个驱动源驱动而不是用多个Arduino引脚分别驱动不同换能器。多个独立信号源之间的相位差异会直接破坏驻波形态导致悬浮失败。并联换能器时注意极性方向要全部保持一致否则声场会互相抵消。电源方面去网上买一个12V、2A以上的开关电源就够用了。千万别用电脑USB口供电——驱动电路一启动电流很容易超过USB口的500mA限制可能导致主板保护甚至烧毁。3. 3D打印结构设计垂直度比颜值重要声悬浮装置的结构件完全可以不用3D打印但用3D打印能让你随心所欲地控制反射面间距、换能器阵列的形状和固定方式。我用的是一台普通FDM打印机材料PLA层高0.2mm整套结构打出来大概用了4到5个小时。3.1 参数化建模换能器夹具换能器阵列支架的设计核心是所有换能器的发射面必须共面且发射面法线方向必须平行。如果发射面歪了超声波束就会偏向一侧驻波场也跟着倾斜悬浮物会不由自主地往边缘漂移。最简单的设计是一个圆盘加一圈均布孔位。圆盘直径100mm左右中间留空沿半径方向排布换能器孔位。孔径要配合换能器直径16mm的换能器通常留16.4mm的孔预留一点装配余量。如果你用的建模软件是OpenSCAD或FreeCAD建议用参数化方式定义换能器数量、孔径、阵列半径都设置成变量这样调试时改一个参数就能重新生成模型不用每次从头画。还有一个细节很多人会忽略换能器插入孔后用什么东西固定热熔胶是最顺手的但涂胶位置很有讲究。胶体只能涂在换能器背面的塑料壳边缘绝对不能覆盖金属发射面的边缘否则金属膜的振动会被胶体阻尼吸收声压大幅下降。更讲究一点的做法是设计一个卡簧结构让换能器倒装卡在孔位里但FDM打印精度有限卡簧设计公差不好控制新手还是老老实实热熔胶吧。阵列形状方面平面阵列和球面阵列有本质区别。平面阵列的发散角大声能分散球面阵列所有换能器指向同一点能实现聚焦在焦点附近形成更强的声压梯度。TinyLev方案用的就是球面阵列8颗换能器分布在球面内壁聚焦点位于球心附近。反射式装置同样可以借鉴这个思路让换能器阵列呈微凹面朝下聚焦点落在反射面上方某处。但球面阵列的打印难度也不小——球面内壁的孔位法向量各不相同FDM打印时容易出现孔位歪斜。我的做法是先打印一个平面阵列验证原理跑通之后再升级球面阵列。这不算弯路是可控的迭代。3.2 打印参数、后处理与反射面选择打印参数上外壳壁厚设2.5mm以上填充率30%就够。换能器阵列工作时会有微弱振动但金属封装本身质量不大PLA的这种刚性足够支撑不需要过度设计。填充率太高反而容易让打印件内部应力集中变形。真正需要重视的是反射板。反射板的表面光滑度直接决定反射波的质量粗糙表面会把超声波散射掉削弱驻波。实测下来3D打印的裸板做反射面效果很差因为FDM打印件的表面有层纹层纹间隙在40kHz波长面前就是一道道锯齿反射效率堪忧。最靠谱的反射面是厚1到2mm的铝板或不锈钢板表面抛光贴在3D打印的底座上使用。反射板与发射阵列之间的距离也是可调参数。根据驻波理论反射面应该放在发射面下方约半波长的整数倍处。对于大多数DIY装置发射面到反射面的距离取35到50mm比较合适对应大约8到12个半波长。再配合一个调节机构——比如用四个铜柱加蝶形螺母或者用带有丝杠的升降台——你就能在调试过程中微调反射面高度。这个调节余量非常重要因为理论计算出的最佳间距和实际最优值之间总会有那么一两毫米的偏差而这种偏差往往是悬浮成败的分水岭。4. Arduino代码实现40kHz PWM的寄存器级控制代码本身并不复杂但很多人用tone()函数输出40kHz方波结果发现悬浮效果差。原因在于tone()靠定时器中断翻转引脚当你在loop里做其他操作时中断延迟会导致频率抖动而声悬浮对频率稳定性极其敏感。正确的做法是使用硬件PWM让定时器独立产生方波CPU全程不参与干预。4.1 用Timer2直接输出40kHz方波以Arduino Nano为例D11引脚对应Timer2的OC2A输出。通过直接操作寄存器设置Timer2为Fast PWM模式预分频8计数上限49就能精确得到40kHz的方波。// 40kHz超声波换能器驱动的Arduino Nano代码 // D11输出40kHz方波占空比约50% void setup() { pinMode(11, OUTPUT); // OC2A 输出引脚 // Timer2 Fast PWM模式TOP OCR2A TCCR2A _BV(WGM20) | _BV(WGM21) | _BV(COM2A1); // 8分频 TCCR2B _BV(CS21); // TOP值 49频率 16MHz / (8 * (491)) 40kHz OCR2A 49; // 比较值设为25占空比约 50% OCR2B 25; } void loop() { // 让硬件PWM自己跑这里可以做别的控制逻辑 }代码解释几个关键点WGM20和WGM21置位后Timer2进入Fast PWM模式OCR2A作为计数上限OCR2B作为比较匹配点。COM2A1设置OC2A引脚在匹配时清零、在计数溢出时置位这样就得到对称方波。预分频选8而不是选1是因为不分频时TOP值只有4占空比调节粒度太粗频率也容易受代码中断影响。如果你拿到手的换能器实际谐振点偏低比如39.6kHz那么可以把OCR2A从49改成50公式是F 16MHz / (8 * (OCR2A 1))OCR2A50时约为31.37kHz等等这不对。这里要注意以上计算假设的是快速PWM模式频率公式确实是F_CPU / (N * (OCR2A 1))。代入N8、OCR2A49得到40kHz无误但改成50变成39.2kHz就偏了。所以扫频时每调整一个OCR值对应约0.8kHz的步进这会让你在39kHz到41kHz范围内有约2到3个可用档位。如果嫌步进太大可以把预分频改成1TOP值设99这时频率约160kHz再通过计数匹配中心对齐的方式拿到几乎任意频率但代码复杂度会上升对于DIY项目没必要。4.2 频率微调与扫频技巧每颗换能器的实际谐振频率在出厂时都有微小偏差而且环境温度会影响声速间接改变驻波位置。为了让悬浮效果最好我建议在setup里做一次主动扫频。扫频方法很简单把OCR2A从一个初始值开始每200毫秒加1覆盖39kHz到41kHz的范围同时用电流表串联在驱动电路供电端观察电流突变点。电流最大的频率点就是整个阵列在当前环境下的最佳工作点。找到后写死OCR值再开始调试悬浮。如果你不想手动读电流表也可以在代码里加一个简单的光电检测——用红外对管测量悬浮物下方的遮挡信号悬浮越稳定遮挡信号波动越小程序自动锁定最佳频率。这个自动化方案留给进阶玩家第一版手动扫频完全够用。另外提醒一个坑Arduino的delay()精度只有毫秒级扫频时200毫秒一档足够但别为了精细缩短到10毫秒那会让换能器来不及稳定到新频率电流表读数会乱跳无法判断真实谐振点。5. 声悬浮的调试链路从无声到悬起来代码烧录完毕、结构件打印装配好之后真正的考验才刚刚开始。声悬浮装置的调试是一个典型的现象驱动过程你需要先确认设备工作、再观察悬浮现象、最后微调参数顺序不能乱。5.1 三件必要的测量设备调试声悬浮至少需要三样工具示波器或逻辑分析仪、电流表、以及一把精度0.5mm的游标卡尺。示波器用来确认Arduino引脚和驱动电路输出的波形。D11引脚上应该看到干净的40kHz方波幅值约5V驱动电路次级应该有数十伏峰峰值的波形。如果你没有示波器带逻辑分析仪协议的USB分析器也行只是看不到电压幅值。千万别只用万用表量——40kHz的方波频率很高普通万用表量到的电压值毫无意义。电流表串联在驱动电路的电源端作用是判断换能器是否真正吃到功率。正常工作时8颗换能器并联的电流应该在0.5到1A左右。如果电流只有几十毫安说明换能器没谐振起来或者驱动电压太低如果电流超过2A且换能器明显发热说明过驱动了需要降压或者减少换能器数量。游标卡尺用来精确调节反射面高度。根据理论计算把反射面放在距发射面约40mm处然后以每次0.5mm的步进微调。这一步极其依赖耐心因为最佳位置往往只在一个很小的范围内差一两毫米悬浮现象就从完全不动变成稳稳悬停。5.2 悬浮失败的三种典型原因第一个原因是驱动电压不足。声悬浮需要超过150dB的声压级普通小功率驱动根本达不到。判断方式是在反射面上撒一些微小的泡沫屑若换能器开启后泡沫屑只是微微跳动而不会离开反射面说明声压不够需要提高驱动电压或者增加换能器数量。第二个原因是阵列中存在失谐换能器。如果8颗换能器里有一颗实际谐振频率偏差过大它发出的声波会与其他换能器相互干涉导致节点位置偏移。表现就是悬浮物在某个区域能被托起但会剧烈抖动无法稳定。排查办法是逐颗断开换能器测试找出哪一颗断开后悬浮反而变稳定了直接换掉。第三个原因是反射面距离恰好落在驻波的反节点上。如果你把反射面放在半波长的整数倍位置反射面的声阻抗会破坏驻波形态反射面和发射面之间的声场变成行波而非驻波。这时候无论怎么调驱动电压悬浮物都只会被声风吹走而不是被夹住。正确的做法是把反射面放在半波长的奇数倍/特定相位位置实际操作中是微调节器慢慢找而不是用卷尺量出精确整数倍就完事。调试天然絮叨我自己第一次做的时候卡在反射面距离上整整一个晚上。第二天换成游标卡尺逐步调节之后不到十分钟泡沫小球就像被施了定身咒一样悬在换能器阵列下方。那一刻的成就感值得你为之折腾两天。6. 进阶玩法从能飘着到能玩出花如果你已经能稳定悬浮1到2毫米的泡沫小球恭喜你声悬浮装置的物理链路已经全部打通了。接下来你可以把精力从物理转移到交互上让这个装置从一个小实验变成一个真正的创客作品。6.1 让节点位置动起来改变频率与反射面驻波节点的位置本质上由频率决定。如果你在代码里做一次线性扫频——让频率在39kHz到40kHz之间缓慢变化——你会发现悬浮物会跟着节点上下移动呈现出自动升降的效果。更进阶的做法是用Arduino读取一个旋转编码器或电位器的模拟量映射成频率值手动控制悬浮物的高度。这样你就不只是静态悬浮而是能实时操控它。这个方案的物理依据是改变频率意味着改变波长驻波的节点间距随之变化悬浮物会自然迁移到新的势阱位置。实测中频率从39.5kHz扫到40.5kHz悬浮物大约能上下移动3到4mm足够做出肉眼可见的动态效果。6.2 交互装置的几种扩展思路思路一悬浮平台加传感器测距。用超声波测距模块HC-SR04检测悬浮物的高度反馈给Arduino做闭环控制让悬浮物稳定在固定高度不受外界扰动。这算是把控制理论和声悬浮结合起来的入门选题。思路二用Color传感器识别悬浮物的颜色配合WS2812灯带做氛围效果。当悬浮物是红色时底座亮红光换成蓝色时灯光跟着变化。因为悬浮物本身悬空无接触这种隔空交互天生就有未来感放在创客展会或毕业设计展示里都很有吸引力。思路三用PlatformIO替代Arduino IDE开发环境。如果代码量变大比如加入PID控制、多档扫频、WiFi远程调节Arduino IDE的源码组织方式会变得相当痛苦。VSCode配合PlatformIO插件可以做到工程化管理而且编译下载Arduino项目的体验更好这也是社区里越来越多开发者转向的方向。思路四如果你对3D打印结构升级感兴趣可以把平面阵列改成球面阵列让聚焦点更集中悬浮力更强。国外社区里很多爱好者用这种结构悬浮水滴和火花当然火花有一定危险性我不建议尝试更安全的是悬浮一小团棉花或轻质海绵视觉效果已经足够震撼。最后分享一个我自己的教训换能器阵列的焊接质量是长期稳定运行的天敌。换能器工作时的高频振动会不断冲击焊点普通焊锡很快就会出现冷焊和裂纹。我的做法是给每颗换能器的引线套上热缩管再在焊点处打一圈热熔胶作为应力释放这一招让装置连续工作了几个月也没出现声音变弱的问题。声悬浮装置看着玄学本质上就是声场正确结构稳定耐心调试这三件事祝你一次成功。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑