今天分享一个好玩的东西: "基于TDOA算法的声源跟踪小车" 。 用于参加Altium2022声源跟踪小车设计挑战赛的作品。硬件电路的设计用的AltiumDesigner。软件基于RTThread嵌入式系统。官方赛程为时一个月,包括硬件电路的设计审核,PCB打板。回来焊接组装,然后调试程序,调试算法,实现最后的功能。小车纯手工打造的,属实有点丑,但粗糙的外表下却隐藏着一个有趣的灵魂,包括实现音频采样,DMA双FIFO缓存,WIFI数据传输,声音播放,以及最主要的TDOA算法,整体玩下来还是很好玩的哈,里面有意思的小细节很多,大家可以自己玩一下自己体会。不过满打满算,整个调程序的时间大概有两个星期,除去搭建底层的驱动,编写配套的QT软件等,真正调TDOA算法应该只有不到一星期的时间。而最后实现最终的功能的代码,调了不到一小时。最终的效果大家可以看一下后面的视频哈,也正如视频最后所说,还有很多地方可以继续优化,所以,我也已经把所有软硬件资料都开源出来了。如果有小伙伴喜欢,可以继续玩一玩哈,如有遇到任何问题,也可以给我留言,欢迎讨论。
另外如果有小伙伴继续玩,可以换一个好点的车底盘,噪声小一点的,应该就可以实现实时不间断解算声音位置了。而对于我自己而言,比赛过后应该就没有动力再继续以小车的形式玩这个功能了。但可能会把这个TDOA定位用在我的日常工作中,没有比赛功能的限制,也就可以考虑加入更多的措施来提高定位精度和稳定度了。总之,各人感觉,是一个挺好玩的东西,特别针对于还处于学生时代的朋友来说,真心推荐可以玩一玩的,即包括了硬件设计,也包括了软件编程,最核心的还涉及各种算法对数据的处理分析(当然,我这边处理数据用的Python代码并没有给出,不过都不复杂,相信你如果能到这一步,肯定就会自己搞了)。都是日后从事相关工作所需的各项技能哈。这个小车,可谓是麻雀虽小,五脏俱全,虽然都没有太深入,但各种技能涉及面还是很广的。可以作为一个小入门项目哈。
小车外观图片如下:
硬件电路演示图:
上位机调试工具截图“
配套程序代码,直接以附件分享,大家可以直接下载,然后用RTThreadStudio导入即可:
*附件:AudioMiniCarV2_20221209.rar
硬件电路原理图PCB图,也直接以附件分享,大家可以直接下载用AltiumDesinger软件打开。过几天官方也会在DigiPCBA平台进行开源。有DigiPCBA账号的同学也可以直接在那里查看。
*附件:基于TDOA算法的声源跟踪小车电路原理图图+PCB.rar
演示视频:
以下内容更新于20230118
前言
官方最终的评审结果出来了,此作品最终获得了该比赛的一等奖。感谢投票支持的网友和各位评审专家的认可。所以想着既然获得了一等奖,还是再花一些精力,整理一下此项目,对想继续玩的小伙伴有点帮助。软件方面,整理起来比较麻烦,最终时间紧凑,代码比较乱,后面有时间重新整理一下再上传gitee。今天先来整理一下硬件设计的整体思路和相关问题。
如下是官方公布的评比结果,其他优秀作品,大家可以去硬声平台或Altium官方链接查看。
原理图方案介绍
主控板原理图
总框图简介
如下是主控板原理图的总页面框图,总共分了10个原理图页。中间和所有原理图页都有连接的是“Power”图页。主要负责电池充放电管理以及给其它功能模块供电。左侧的是“USB转UART通信口”图页,主要为CH340E的电路。右侧从上到下依次为“CAN&RS485接口”图页,“SPI_Flash”图页,“MCU”图页,“WIFI”图页,“电机驱动”图页,“红外避障”图页,以及最后的“拾音模块接口”图页。
各模块介绍
-
Power图页
其中CN3300是上海如韵的一款多节锂电池升压充电芯片。开关频率可以达到1Mhz,充电功率可以达到25W,不考虑转换效率,5V输入端最大电流可以到5A。实际充电功率可以通过图中的采样电阻R3P进行调节,这里我选定的峰值输入电流为1A,大家可以按照自己的考虑进行调整。我这边主要的考虑是我这里的充电USB接口还是终端调试串口,接入电脑的USB接口调试的时候,会通过电脑USB对小车电池充电,如果电池馈电较多,充电功率过大,可能会超过电脑USB接口的负载功率,导致USB口带不动,或影响USB接口性能,特别是台式机前面板的USB接口,内部连接线都不粗,接台式机后面的主板USB接口又比较麻烦。所以在对充电时间没有太高要求的情况下,最终选定了1A的峰值电流,应该所有的USB接口都带得动了。
P1P连接器链接2S锂电池。P2P连接器链接电源开关。F1P是一个自恢复管,用做整体电路的过流保护,防止后续电路短路等情况烧坏电路板。我这里选择的是2A的自恢复管,大家可以根据自身需求进行调整。
右侧的DS1P和DS2P是CN3300控制的充电指示灯,我这里偷懒,不想封装双色LED的封装了,所以采用了两个独立的LED,大家有兴趣可以直接用一个双色LED进行指示。
再右侧R4P和R7P的分压电路,接入MCU的AD采样接口,用于监测电池电压,可以通过PC端调试工具实时观察电池电量,当电量过低时,及时对小车充电,也可以在板载程序里做保护,电量低于阈值时停止对电机等大功率设备的控制等操作,总之基础条件有了,上面怎么玩,大家可以随心所欲的发挥自己的想象力了。但这里的电路稍微有点问题,用于防止分压值超过ADC采样阈值的D1P二极管,型号要换一个开关二极管,比如最常见的1N4148等,肖特基二极管的反向漏电流太大,会对输出阻抗如此大的分压电路造成很大影响,导致电压检测错误!
下面电池供电电压转5V电源的开关电源方案选择的是上海贝岭的BL8032芯片,开关频率为500Khz,最大输出电流为2A,对于此方案绰绰有余了,甚至电感的选择额定电流才1.5A。这里需要修正的地方是输出端最好还是加一个33uf左右的钽电容,实测对于500Khz的开关频率,还是有源电容的滤除效果更好,要不然电源纹波有点大,甚至还有可能有风鸣声,实测看来开关电源这里滤波电容还是不能偷工减料的哈
右侧的L2P共模电感和两侧电容构成滤波电路,用于隔离一下数字和模拟电源的高频噪声。如果大家感觉隔离等级不够,可以考虑其他方案。
最下面的两个芯片是比较普通的1117的LDO电源芯片,分别用于数字3.3V和模拟3.3V的电源转换。功耗都不大,所以数字3.3电源也采用了简单的LDO方案。
-
USB转UART通信口图页
由于现在TypeC接口的USB线最常见,所以这里选用了TypeC类型的USB座,而且要对电池充电,TypeC接口供电线路承载能力还是要比miniUSB接口要大一些的。
U转串方案,我采用的是我常用的CH340E芯片。由于不太想重新买器件,所以这个小车电路用料,很大一部分的选型考虑都是手头上现有的料,甚至在不会太影响性能的情况下,选择更普通廉价的料。
由于这个小车的硬件方案对我来说还是算简单的,所以并没有对340E做单独供电,如果大家感觉可能调试硬件的过程比较久,这里可以考虑别太偷工减料了,要不然每次开关小车电源的时候都要重新连一遍调试终端还是挺烦的。具体方案可以考虑要么单独给340E一个VBUS转3.3V的电源芯片,要么直接用VBUS给CH340的VCC引脚供电,都是可以的。因为虽然用了TypeC接口,但可以看到CC1和CC2端直接接地了,并没有走其它高压协议,所以就算接入了快充充电头VBUS肯定也是5V供电,另外把CH340E改成5V供电方案,无非就是串口变成5V的TTL电平了,STM32芯片串口可以容忍5V电平,所以问题也不大。
此部分电路比较简单,没什么好说的,主要是考虑我手上有一个FR-07型号的车底盘以及一下RS485接口的传感器,可以扩展一下功能,但最后由于时间原因,也并没有用到。大家可以根据自己情况选择是否保留此扩展接口。虽然最后没有做这部分功能,不过可以给大家看一下我的这个车底盘,性能方面还是这种纯手工打造的小车没法比的哈,如果在这个小车四个角架上四个MIC,做这个声源跟踪,应该效果要好很多哈(当然,目前还都是幻想而已)。
此部分电路没什么太多好说的,也没什么大问题。由于W25Q64支持4线SPI接口,所以这里接入了MCU的QSPI总线,数据传输速率要快一些。后面程序方面以FAT32类型的文件系统进行了挂载,目前只用于保存配置文件,保存一些小车的运行和标定参数,不用每次上电都重新标定了。大家有兴趣也可以用它来保存一些其他数据。
-
WIFI图页
由于原理设计的时候就考虑到,后面调试的时候要传输原始的音频ADC数据,所以由于带宽问题,并没有选择简单的串口WIFI模块,而是选取了一款SPI接口的WIFI模块。正好也是RTthread官方推的,已经做好了适配,用起来也并没有复杂太多。1MBps的带宽,传输音频基本够用了,如果不用,还可以考虑把音频数据先压缩一下哈,也并不复杂的。比如我之前用过的huffman编码,进行无损压缩的压缩率基本都要由于30%。当然,如果还想传输其他更大量的数据,也是可以考虑替换带宽更高的WIFI模块的。
手上有一些大学时候留下来的L298P芯片,所以直接用的L298P芯片做的电机驱动。内部主要就是一个功率H桥电路和控制H桥的一些逻辑电路。虽然也是一颗很普通的电机驱动芯片,但驱动这个小车的两个小电机足够了。
-
红外避障图页
此部分电路完全借鉴了老师的方案。并没有用更加复杂的避障方案。只不过老师的方案,后面还要接入电压比较器,转换为数字信号接入单片机的IO口。而我这里是把光电接收管的输出,直接接入了MCU内部的滞回比较器,H7系列内部又两路比较器,可以设置滞回大小以及比较端的电压来源。所以不用加滑动变阻器进行调节了,可以直接用程序进行现场调整,更方便一些。当然,如此简单的方案,对于环境的适应能力肯定还是比较差的,没有比赛要求的话,如果大家想实现更好的避障效果,还是建议直接用一些现场的避障模块做要好一些,专业人做专业事嘛。
-
拾音模块接口图页
此部分电路,主要是给拾音模块供电以及接入音频信号的IPEX接口。为了减小电机对模拟信号的电磁干扰,还是选择用屏蔽线进行传输。具体的音频信号采集和放大电路,见后面的拾音模块电路介绍或者观看官方的直播课回放,有更详细的讲解。
-
MCU图页
最后的MCU图页,无非就是STM32H743的最小系统,然后再把上面介绍的各模块,接入到MCU即可。这款芯片目前不知道还能不能买到了,我的是国内刚能买到H7系列芯片的时候我买了几片测试用的,后来产品就一直在用BGA封装的了,所以这几片LQFP封装的芯片就一直没什么用,就正好在这个小车上用了一下。估计就算能买到可能也比较贵了,前段时间我们买了一些BGA封装的,已经涨到1000块一片了,所以也只能是应个急,我也在做换型工作了。而这款小车的话,大家也可以根据自己的能力考虑一下换型了,不过最后不要选择性能太弱的MCU哦,要不然算FFT太慢哈。各人推荐可以考虑一下全志的一些芯片,比如我最近在玩的D1S芯片,也是LQFP封装的,焊接起来也方便。内部集成64M字节的DDR2内存,不用自己做DDR电路,还是要方便很多的。
拾音模块电路
此部分电路完全借鉴的老师的方案,只不过滤波参数有所调整,当然老师的课程上也只是给了一个大概的参数,也是说要在调试的时候根据实际情况自己调整。我用的也不是最好的参数,大家也可以根据自己情况更改哈,甚至也可以升级优化电路的。
那这里的方案,也算是能实现这个功能最简单廉价的方案了,电路方面的更多细节大家可以观看官方的直播课回放,我这里就不再推衍一遍放大公式了。
下图左侧是电路仿真的波特图,右侧为实际测试的波特图,结构基本一致。
好了,电路方面的介绍,今天就先整理到这,如果后面想到什么再过来整理哈,软件后面看情况,希望能对大家有点用哈。
最后给出官方的比赛结果链接,里面有相关直播课的视频链接:
官方比赛结果链接:https://mp.weixin.qq.com/s/YLIDGK28DmRm41Va4IuEUg