Grove 超声波传感器 (SMS812)

介绍
Grove 超声波传感器 (SMS812) 是一款小型化、超低功耗的测距传感器。Grove 超声波传感器 (SMS812) 基于超声波飞行时间 (ToF) 原理,并结合相关的声学、电学和算法设计。通过不同材料表面超声波回波信号的能量差异实现高精度距离测量,输出毫米级距离信息及其回波能量强度值,还可以输出标志位来区分软硬材料。此外,它可用于清洁机器人识别地面材料并在一定范围内测量距离。它体积小巧,易于安装。
应用
- 清洁机器人识别地面软硬材料
- 家庭服务机器人或扫地机器人获取地面信息
- 3D打印机调平检测
特性
- 毫米级测距精度,出色的测距稳定性
- 识别软硬材料并输出I/O信息
- 检测距离可达20-50mm,盲区小
- 支持Arduino
硬件概述

- 该传感器的结构为圆柱形,采用塑料注塑成型。
- 上图中的尺寸单位为毫米。

该接口为PH1.0-4P插头连接器。引脚定义如下:
引脚 | 类型 | 描述 | 默认值 | 数据流 |
GND | 电源 | 负极 | 0V | |
Tx | 输出 | 系统串口输出 | 激光雷达到外设 | |
Rx | 输入 | 系统串口输入 | 外设到激光雷达 | |
VCC | 电源 | 正极 | 3.3V |
开始使用
硬件准备
本教程将介绍使用 XIAO SAMD21 作为主控来使用这个超声波雷达。为了方便接线,我们还将使用 Grove 扩展板。您可以根据实际需要选择其中一种。
然后,将超声波雷达连接到 XIAO 的 UART 接口。

Arduino 库概述
如果这是您第一次使用 Arduino,我们强烈建议您参考 Arduino 入门指南 或查看下面的简单教程:
下面的按钮将直接带您到我们为 Grove 超声波传感器 (SMS812) 提供的 Arduino 程序库。
功能
在我们开始开发程序之前,让我们先了解一下库的可用功能。
-
void setIOMode()
—— 此函数用于将雷达设置为 IO 模式,主要用于检测目标材料。 -
void setUARTMode()
—— 此函数用于将雷达设置为 UART 模式,UART 模式下雷达将主动报告距离和材料信息。 -
void setUARTREQMode()
—— 此函数用于将雷达设置为 UART REQ 模式,在此模式下只能通过发送查询命令来查询距离和材料信息。 -
void checkUARTREQ(int delaytime = 0, bool showSwitch = true)
—— 此函数在 UART REQ 模式下使用,用于查询检测到的材料和距离。输入参数
delaytime
:默认值为 0。此参数控制发出查询命令的时间间隔(毫秒)。showSwitch
:默认为开启。此参数控制是否打印出原始数据帧。
-
bool getFrame(bool showSwitch = true)
—— 此函数用于获取原始数据帧。输入参数
showSwitch
:默认为开启。此参数控制是否打印出原始数据帧。
-
bool parseDatagram(bool showSwitch = false)
—— 此函数用于解析原始数据帧。输入参数
showSwitch
:默认为关闭。此参数控制是否打印出原始数据帧。
安装
由于您已经下载了 zip 库文件,请打开您的 Arduino IDE,点击 Sketch > Include Library > Add .ZIP Library。选择您刚刚下载的 zip 文件,如果库安装正确,您将在通知窗口中看到 Library added to your libraries。这意味着库已成功安装。

XIAO 示例
步骤 1. 您需要安装 Arduino 软件。
步骤 2. 启动 Arduino 应用程序。

步骤 3. 选择您的开发板型号并将其添加到 Arduino IDE 中。
-
如果您想在后续例程中使用 Seeeduino V4.2,请参考 此教程 完成添加。
-
如果您想在后续例程中使用 XIAO SAMD21(Seeeduino XIAO),请参考 此教程 完成添加。
-
如果您想在后续例程中使用 XIAO RP2040,请参考 此教程 完成添加。
-
如果您想在后续例程中使用 XIAO nRF52840,请参考 此教程 完成添加。
-
如果您想在后续例程中使用 XIAO ESP32C3,请参考 此教程 完成添加。
-
如果您想在后续例程中使用 XIAO ESP32S3,请参考 此教程 完成添加。
对于 XIAO nRF52840,请选择 Seeed nRF52 mbed-enabled Boards,否则运行程序时可能会报错。

步骤 4. 安装 Arduino 代码库。
演示 1:IO 模式使用
此示例将指导您完成打印标志位以区分软硬材料的过程。以下是 arduino 的参考代码:
#include "sms812.h"
const int radarPin = A7;
//#include <SoftwareSerial.h>
// Choose any two pins that can be used with SoftwareSerial to RX & TX
//#define RX_Pin A6
//#define TX_Pin A7
//SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// we'll be using software serial
//SMS812_Sensor radar = SMS812_Sensor(&mySerial);
// can also try hardware serial with
SMS812_Sensor radar = SMS812_Sensor(&Serial1);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial1.begin(115200);
// mySerial.begin(115200);
pinMode(radarPin, INPUT);
while(!Serial); //When the serial port is opened, the program starts to execute.
Serial.println("Ready");
radar.setIOMode();
}
void loop() {
// put your main code here, to run repeatedly:
int value = analogRead(radarPin); // Read level status of D7 pin
Serial.println(value);
delay(500);
}
激活 IO 模式后,您应该知道如果 US5 传感器识别到软材料,其 TX 引脚将向开发板发送标志位 0x01
,否则,硬材料是 0x00
,因此您应该将 radarPin
设置为 A0(连接传感器的 TX 引脚)或支持模拟输入的引脚。
高于 1000 的高值表示识别到硬材料,低于 20 的值表示识别到软材料或空气。
因此,当您在墙前移动传感器时,您将看到如下串口输出:

演示 2:UART 模式使用
对于 UART 模式,雷达以 100Hz 的速率输出测量值。数据报文的格式如下表所示。
帧头 | 命令帧 | 数据长度帧 | 数据帧 | 校验帧 |
---|---|---|---|---|
0xAA 0xAA | 0xFD | 0x04 | -- | CS |
数据位占用 4 字节。第 1 字节是材料标志位,0 表示硬材料,1 表示软材料。对于软材料,将无法测量距离。然后是距离值,占用 2 字节,单位为毫米。最后 1 字节是强度值,表示接收到的超声波信号的强度。
材料标志位 | 距离值 | 强度 |
---|---|---|
1 字节 | 2 字节 | 1 字节 |
在此示例中,我们将使用库中的函数来解析接收到的数据帧,并通过串口打印出传感器主动报告的所有特征数据。
XIAO SAMD21 开发板上的硬件串口是 UART 接口引脚 A6 和 A7。您也可以使用任意两个引脚作为软件串口。
#include "sms812.h"
//#include <SoftwareSerial.h>
// Choose any two pins that can be used with SoftwareSerial to RX & TX
//#define RX_Pin A2
//#define TX_Pin A3
//SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// we'll be using software serial
//SMS812_Sensor radar = SMS812_Sensor(&mySerial);
// can also try hardware serial with
SMS812_Sensor radar = SMS812_Sensor(&Serial1);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial1.begin(115200);
// mySerial.begin(115200);
while(!Serial); //When the serial port is opened, the program starts to execute.
Serial.println("Ready");
radar.setUARTMode();
}
void loop() {
// put your main code here, to run repeatedly:
// Prints only the acquired raw data frames
// radar.getFrame();
// delay(1); //Add time delay to avoid program jam
// Parses the contents of the data frame. If the function parseDatagram is given a true argument, the raw data frame display is enabled.
if(radar.parseDatagram(true)){
if(radar.material == 0x00){
Serial.println("No blankets detected.");
Serial.print("The measured distance is: ");
Serial.print(radar.distance);
Serial.println(" mm");
Serial.print("The ultrasonic signal strength is: ");
Serial.println(radar.strength);
}
}
delay(1); //Add time delay to avoid program jam
}
将代码上传到开发板后,你将传感器移动到硬质材料前面(软质材料不会输出解析数据),你可以看到下面的解析数据:

示例 3:UART REQ 模式使用
在这个示例中,我们将延迟时间参数设置为 1000,意味着我们每 1 秒轮询一次发送命令查询。传感器将通过原始消息反馈测距结果,消息长度为 9 字节。
#include "sms812.h"
//#include <SoftwareSerial.h>
// Choose any two pins that can be used with SoftwareSerial to RX & TX
//#define RX_Pin A2
//#define TX_Pin A3
//SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// we'll be using software serial
//SMS812_Sensor radar = SMS812_Sensor(&mySerial);
// can also try hardware serial with
SMS812_Sensor radar = SMS812_Sensor(&Serial1);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial1.begin(115200);
pinMode(A7, INPUT);
// mySerial.begin(115200);
while(!Serial); //When the serial port is opened, the program starts to execute.
Serial.println("Ready");
radar.setUARTREQMode();
}
void loop() {
// put your main code here, to run repeatedly:
radar.checkUARTREQ(1000, true); // Check radar information every second. And turn on raw data frame display.
// Parses the contents of the data frame. If the function parseDatagram is given a true argument, the raw data frame display is enabled.
if(radar.material == 0x00){
Serial.println("No blankets detected.");
Serial.print("The measured distance is: ");
Serial.print(radar.distance);
Serial.println(" mm");
Serial.print("The ultrasonic signal strength is: ");
Serial.println(radar.strength);
}
}

资源
- [PDF] 开发手册 Alpha V0.2.0
- [PDF] 数据手册 Alpha V0.1.3
技术支持与产品讨论
感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。