这篇文章背后的故事可谓是惊心动魄、意外频频,又峰回路转。我们本次作为NISL物联网安全研究小组参加Geekpwn2021,超声波项目有幸被Geekpwn组委会选中,在此十分感谢Geekpwn组委会的认可。
满怀欣喜的我们大包小包地带着项目所需设备飞到了杭州参加录制,万万没想到这次比赛经历注定不同寻常。
这个题目是Geekpwn给我们的项目起的名字,还是比较贴切的,有某种特工的意味。本质上这个项目利用的是超声波的物理性质,结合一些天线整列的基本思想完成的设计。脑洞比较大和传统的网络安全项目最大的不同是展示的方案没有任何代码的元素,完全是电路设计、信号处理。
不多说“片汤话”,直接说原理。
基于非均匀介质对不同声音频段吸收系数不同,对调制过后的声音信号产生自解调效应。利用自解调过程逐步将超声波探头阵列发射出的高频调制信号中的低频声音信号与高频载波信号分离开。经过一段物理距离使人(机器)听(接收)到。
超声波扬声器阵列依据天线阵列的设计原理,进行布阵。通过CST/HFSS等仿真软件仿真,调整排布,最终找到适合的阵列口面大小Ae,布阵拓扑结构。经过仿真、实际测试发现,对超声波覆盖的角度起主要作用的因素是天线口面大小。
黑客界有一句名言‘Don’t talk too much,but show me the code.’光说说这个原理不来点公式总觉得是在忽悠。(为了公式显示清晰下面我直接粘上截图)
通过这个最后的公式,可知随着传播距离的增加“自解调”现象会越来越明显。
这里留一个工程性问题,就是这个“自解调”现象,从算式上看仅与一个非线性空气因子beta相关,结合不同地区的空气(不同湿度、温度、天气···)这个声音“自解调”的效果会有差异。
结合常识不难想到随着距离的增加,有限的能量终将会消逝,这里存在一个最佳解调区域留给各位师傅去探索了。
相信这是各位读者最关心的部分,看了那么多公式推倒也没有什么作用,对实现来说只能起到一个指导性作用。下面就来阐述我们实现的两种方案。
比赛场上我们展示的是这个模式,因为距离上的限定——要求比较高的功率传输,所以展示的是这款(采用半桥放大器L293DNE)。另一个采用L386N-4功放的方案,之后也会阐述。
半桥放大器L293DNE(数据手册 https://www.ti.com.cn/cn/lit/ds/symlink/l293d.pdf )这种半桥放大器的输入要求是ttl信号,不可以是音频模拟信号(各位师傅可以买来试试直接通模拟信号会发生什么lol),这个输入电压信号形式,正好满足这种PWM方案的要求。
实际上,两种方案都涉及到原声音信号的采集,毕竟没有采集(采样)调制就无从谈起。一开始方案中采用NE555这个时钟芯片自带的pin-5 触发引脚对音频信号进行采样、调制工作,相当于一个简易版ADC。可是这种纯电路方式需要时常调参,并且效果也不是很好(基本调不到最佳水平),于是,我们便替换成stm32开发板完成音频的采集、调制工作。
要保证载波输出PWM信号方波占空比接近50%,这个参数决定后期音频质量。为什么这个要接近50%,一言以蔽之“为了最大限度地‘复刻’出声音信号。”
来上一个信号仿真图:
图中左侧为50%占空比输出载波,调制后声音信号频带范围下频谱,右侧不是50%(记得是70%正占空比),这种情况下原本的低频声音信号调制后会有很多高次谐波分量,极大地影响最后音质的效果(自解调后会有刺耳的声音或者可以听到的声音很小)。
通过stm32开发板,就可以很好的解决模拟电路通过插拔电阻或转电位器麻烦且极其不准确的调参方式。(开发代码还需进一步改进,先不公开了)
经过调制的信号还是不可以直接接负载(扬声器阵列),声音太小,即信号峰峰值很小。因为stm32板不可能输出一个36V峰峰值的电压信号(L293DNE最大工作电压36V),需要把这个调制信号进行放大处理,才能通过最后的扬声器阵列传输一定距离。
可能各位师傅想之后就直接将放大信号通入阵列就完事了,但事情远没有这么简单。如何通,怎么进行电路连接还是有讲究的。
这个半桥放大器(L293DNE)是4通道,每个通道的功能独立(详见模块数据手册),和L386N-4等一众芯片一样皆存在端口的输出阻抗,是需要和负载进行匹配的。
关于音箱前级放大器和音箱阻抗之间的纠葛我会在“AM调制设计方案”会一起讲。现在,通俗来讲就是能否驱动起来的问题,对应到本项目涉及的问题,就是一个输出通道驱动几个超声波探头组成的阵列比较合适。
L386N-4 (数据手册链接 https://www.ti.com/cn/lit/ds/symlink/lm386.pdf )是一个音频功放,输出阻抗是4——8欧姆(稍后会讲这个阻抗的讲究)。
L386N-4的选取原因在于它的Vcc可以达到24V。由于我们不是专业搞音频设计的,同时这次需要放大的声源信号频率在40kHz。一般的放大器不适用,会大面积信号失真(芯片摆率不够),我们的方案就没有尝试其他音频功放,或者更高级的音频电路设计,而仅仅以实现功能为导向,调制信号直连一级功放接负载。如若各位感兴趣、或对音频信号有独特见解,师傅们可以再改进此方案。
对于上面提到的AM调制,这种调制方法很久之前就出现了,在此我不多赘述,各位可自行baidu、google(科学上网)。这个调幅AM方案,还是我们两个到录制酒店,利用等待录制这几天现设计、制作出来的,可能方案上比较糙,各位大佬多担待。
方案设计和上边的类似,还以stm32用来调制信号,后面接一个放大器,(主要区别由于不同的调制信号对应不同型号放大器、功放器),而后接负载(阵列)。不过这次是用stm32对声音信号进行AM调制,放大器换成了L386N-4音频功放,阵列拓扑结构以及单个功放驱动的阵列元数量也做了一些改变。(stm32 对信号调幅代码就先不公布了)
此方案拓扑图如下:
来讲一讲阻抗的问题
关于实际制作的“坑”,我从源到负载进行阐述。
“源”处的坑
这个位置原先使用NE555时钟模块时坑还挺多的(调参就十分麻烦),更换成stm32作信号调制板问题就会好很多,但是还需要注意共模串扰问题。
PWM方案在调制源处的“坑”比较少,最主要的AM调制的“坑”。由于stm32的输出特性,最终输出的调制信号都在0V以上,此时若功放的反相输入直接接地就会使调制信号损失一半的信息。因为功放的输入侧归根结底还是个比较器,所以为了契合stm32的输出信号特性,反相输入需要施加stm32输出的直流偏置电压,同时给功放通上24V的Vcc便可达到最大的放大效果。(2dB左右)
放大器需要注意的问题
AM方案中涉及放大器主要的“坑”就是避免输入信号的共模串扰。PWM方案在放大器这部分的“坑”比较重要,目前我还不知道为什么我的解决方案可以。L293DNE模块是一个半桥放大器主要的参量是输入信号的占空比。stm32输出信号存在直流偏置,这个模块也会把stm32输出信号的直流分量同样保留下来并放大。我们消除这个直流分量的方案是在负载和通道输出端口之间调加无极无极电容。
PS 若各位不懂无极电解电容是什么,可以使用两个有极性电解电容负极端串联在一起,整体连在放大器和音箱之间。而电容容值的计算便等于两个电容串联大小。
虽然根据超声波探头数据手册显示探头是根据输入信号的峰峰值对应输出声压的强弱,也就是说输入信号中混杂有直流偏置应无影响。(望各位师傅就此点指点一二)
两个放大器尤其是L293DNE在远距离传信号时会通入高Vcc电压,工作时会发热,需要外加散热片防止芯片烧坏。
负载(阵列拓扑设计)
这里就涉及到天线阵列的知识了。首先在常温空气中,声速为340m/s,这里理论超声波中心频率40kHz,也就是声波波长为lambada=v/f=0.0085m=8.5mm。 得知波长再类比天线阵列计算模型(这里各个阵列元是同相激励)便可玩一些有意思的事情。(详情可参考《天线》这本书)
探头方向图如下:
上面这个探头的方向图HPBW约为40度,同时是端射阵。也就是无论这个阵列元是以怎样拓扑结构进行排布阵列也不可能变成双向图,同时在平面二维布阵的条件下HPBW也不会得到很大的改观。由于整体阵列的方向性D等于单个的D乘上阵因子。
至少在传播距离、整体方向性以及阵列口面大小三个因素的联合限制下,单凭这款超声波探头是无法完美完成10m间距目标人物与旁人间隔0.5m完成信息定向传输的(这个阵列方向性小得可怕)。或者允许三维布阵,这个课题感兴趣的师傅可以自行玩玩。
距离攻击目标 8 米,向攻击目标定向发出带有语音命令的超声波,攻击目标能听到攻击者发出的语音命令,以攻击目标为中心的周围1.5~2米外听不到攻击者发出的声音(或不识别为声音)。
这次比赛可以讲是惊心动魄,Geekpwn也是第一次引入这么硬件的演示。AM备选方案用48小时的设计加酒店现场制作,途中一次为了切割PCB阵列板找酒店要锯子一度引起前台xjj惊恐xs。比赛前一天AM备选方案stm32板子因一些神奇地错误操作坏了,至今不知道为什么lol,而满杭州城找stm32f407vet6 这个型号的开发板。极大地锻炼了我们电路开发和解决实际工程的能力。
感谢各位师傅的阅读,可能这个项目涉及的问题过于底层,同时基本从零开始实现,涉及设计、实现、现实客观因素方面问题较多不知道在下是否都已涵盖并讲述一二,如果上面有哪里不够清晰,或者各位师傅哪里不明白请务必让我知晓,我会尽快添加、删改。
6 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!