一个 18×16mm 的小模组,让我在客户现场演示时,一句话就让机器人转头看向说话的人。订单当场敲定。

一、故事的开头

上周三,客户工厂里,噪音不小。

我拿着一个巴掌大的机器人原型,跟对方技术总监说:"您喊一声'小智'试试。"

他半信半疑地喊了一声,机器人脑袋立刻转过来,直勾勾"看"着他。他往左走了两步,机器人跟着转头;走到 3 米外再喊,依然精准锁定。在场几个工程师都凑过来轮流喊,机器人挨个"点名"转向,无一落空。

"这个声源定位,用的什么方案?"总监问。

"AR1106,一个声源定位模组。"我说,"双麦阵列,180° 范围,10° 精度,5 米内稳定拾音。我们全程没写一行驱动代码。"

当天下午,30 万的订单意向书签了。

二、为什么是 AR1106:选型时的纠结

项目需求其实很朴素:

  • 机器人要能听到人声来源方向,转头跟随;
  • 环境有噪音,不能随便哪个声音都触发
  • 开发周期短,不想从零做算法
  • 成本敏感,模组体积要小。

一开始团队内部讨论过三种路线:

方案

优点

缺点

自研双麦 TDOA 算法

完全可控

麦克风标定、相位校准、算法调优,周期以月计

麦克风阵列 + DSP 处理

精度高

成本高、开发复杂,杀鸡用牛刀

AR1106 现成模组

即插即用,成本低

精度 10°,极致场景不够用

我们的场景是"简易安防 + 智能交互",10° 精度完全够用——因为舵机跟着动,10° 的步进在 1 米距离上也就十几厘米的偏差,人眼根本感觉不出来。选型就是妥协的艺术,AR1106 是最省时间的那个答案。

三、极简到什么程度:一块小板,5 根线

拿到模组第一感受:小。长 18mm、宽 16mm,比一枚硬币大不了多少,标准 2.54mm 排针间距,面包板直接怼。

引脚定义(来自规格书):

引脚

功能

GND / 5V

电源

MICL+ / MICL-

左麦克风

MICR- / MICR+

右麦克风

PWM

SG90 舵机控制输出

TX

串口输出(9600 波特率)

AOUT

语音播报角度

IO

预留

接线就 4 件事:

AR1106 5V  ────  5V(模组)
AR1106 GND ────  GND(共地)
AR1106 TX  ────  主控 RX
AR1106 PWM ────  SG90 信号线(舵机单独供 5V,注意大电流)

注意一个工程坑:SG90 堵转瞬间电流能到 500mA 以上,千万别和模组共用同一路 5V,我们第一版就因为这个把模组干重启了,后来舵机单独供电,稳了。

双麦阵列是模组自带的:2 个驻极体麦克风,间距约 4cm,推荐选信噪比 70dB、灵敏度 -27dB 的型号。这是官方实测优化过的间距,拾音清晰度和抗干扰能力平衡得不错,我们直接照抄。

四、串口协议:一个字节就是角度

最爽的是协议——输出就是 16 进制的角度值,一个字节,没有协议解析的折磨

规格书写得很明白:

  • 90° 输出 0x5A(十进制 90)
  • 100° 输出 0x64(十进制 100)
  • 以此类推,0x00 ~ 0xB4 对应 0° ~ 180°

而且只在识别到预设命令词后才输出,平时串口安静如鸡,不会拿一堆噪声角度去骚扰下游设备。这一点对联动稳定性太重要了。

Arduino 端代码短得离谱:

#include <SoftwareSerial.h>
#include <Servo.h>

SoftwareSerial mod(10, 11);  // RX, TX 接 AR1106
Servo head;

void setup() {
  Serial.begin(9600);
  mod.begin(9600);
  head.attach(9);
  head.write(90);          // 上电回中
}

void loop() {
  if (mod.available()) {
    uint8_t angle = mod.read();   // 读到一个字节,就是角度
    angle = constrain(angle, 0, 180);
    head.write(angle);            // 舵机转向声源
    Serial.print("声源角度: ");
    Serial.println(angle);
  }
}

总共 20 行不到,声源跟随就通了。演示时客户看到这里已经点头了。

如果主控是树莓派这类 Linux 设备,Python 更简单:

import serial

ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=0.1)

while True:
    if ser.in_waiting:
        angle = ser.read(1)[0]      # 一个字节 = 角度值
        print(f"声源角度: {angle}°")
        # 转发给舵机控制板或下位机

五、命令词定制:"小智"是怎么来的

模组默认只认预设命令词。我们要"小智"当唤醒词,走的是厂商定制流程,单次最多 10 个命令词(唤醒词 + 免唤醒词总数),把使用频率最高的几个短语一次配齐。

这里有几个实测下来的避坑经验,规格书里也写了:

  1. 4-6 个字最佳。太短误唤醒率高(喊一声"在"都可能触发),太长用户记不住喊不出口;
  1. 别用叠字,"宝宝""贝贝"这类重叠音容易误识别,我们第一批词表里就有个叠字词,误触发率高到离谱,后来换掉了;
  1. 别用口语高频词,"你好啊"这种日常高频短语就是误唤醒重灾区;
  1. 避免多音字、连续零声母
  1. 敏感词、伟人名字、黄赌毒绝对不碰,这是红线;
  1. 词条之间如果只有一个字不同,那个字尽量不要放在末尾,能明显降误识别率。

最终词表定了:"你好小智""嗨小智""转过来""看这边"等几条,每条发音抑扬顿挫、辨识度高。实测在车间 70dB 左右的背景噪音下,5 米内喊"小智"基本无漏报无错报。

六、效果与落地:从原型到订单

整套方案最终形态:

  • 拾音:AR1106 双麦阵列,5 米内触发即定位;
  • 执行:SG90 舵机带动头部/摄像头,180° 无死角跟随;
  • 联动:串口一字节角度值,任何主控都能接,兼容性拉满;
  • 防误触发:只认命令词,车间里机器轰鸣、工人聊天都不会乱转。

演示那天,客户总监自己围着机器人转了一圈,机器人从 0° 跟到 180°,又倒着跟回来,全程零卡顿、零误转。他说了句让我印象很深的话:"这个'转头'的动作,就是我想要的产品体验。"

30 万订单,就这么拿下了。

七、总结与建议

AR1106 不是什么黑科技,但它把"声源定位"这个原本要啃算法的事,压缩成了一块 18×16mm 的模组 + 一个字节的串口协议。它解决的痛点不是'能不能做',而是'值不值得自己做'——当你的产品只需要 180° 范围、10° 精度、5 米拾音这个量级时,现成模组比自研香太多了。

几点落地建议:

  • 舵机务必单独供电,别跟模组抢 5V;
  • 命令词词表一次规划好(上限 10 条),别频繁找厂商返工;
  • 5 米是甜蜜点,超出这个距离拾音灵敏度断崖式下降,安装位置提前规划;
  • 对精度有极致要求的场景(比如远距离、多声源区分),再考虑更高级的阵列方案。

顺手算一笔账:自研双麦算法,两个工程师一个月的人力成本,足够买上百片 AR1106 了。能用现成的成熟方案解决的事,别用时间去赌。


本文基于 AR1106 声源定位模组规格书撰写。规格书关键参数:180° 定位范围 / 10° 精度 / 5 米拾音 / SG90 舵机联动 / 9600 波特率串口输出(16 进制角度值)。详细咨询请私信公众号后台,期待与您交流。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐