Sensor Ultrasónico Grove (SMS812)

Introducción
El Sensor Ultrasónico Grove (SMS812) es un sensor de medición de distancia miniatura de ultra bajo consumo. El Sensor Ultrasónico Grove (SMS812) está basado en el principio ultrasónico de tiempo de vuelo (ToF), y está diseñado con acústica, electricidad y algoritmos relacionados. Se logra una medición de distancia de alta precisión a través de la diferencia de energía de las señales de eco ultrasónico en la superficie de diferentes materiales, y proporciona información de distancia a nivel de milímetros y su valor de intensidad de energía de eco, y también puede proporcionar bits de bandera para distinguir materiales blandos y duros. Además, puede ser utilizado para robots de limpieza para identificar materiales del suelo y medir distancias dentro de un cierto rango. Es de tamaño pequeño y fácil de instalar.
Aplicación
- El robot de limpieza reconoce los materiales blandos y duros en el suelo
- Robot de servicio doméstico o aspiradora robot para obtener información del suelo
- Detección de palanca en impresora 3D
Características
- Precisión de medición de distancia a nivel de milímetros, gran estabilidad de medición
- Reconoce materiales blandos y duros y proporciona información I/O
- La distancia de detección hasta 20-50mm y el área ciega es pequeña
- Soporte para Arduino
Descripción del Hardware

- La estructura de este sensor es cilíndrica y está hecha por moldeo por inyección de plástico.
- Las dimensiones en la figura anterior están en milímetros.

Esta interfaz es un conector PH1.0-4P. Y la definición del pin es la siguiente:
Pin | Tipo | Descripción | Predeterminados | Flujo de datos |
GND | Fuente de alimentación | Negativo | 0V | |
Tx | Salida | Salida del puerto serie del sistema | Ladar a Periféricos | |
Rx | Entrada | Entrada del puerto serie del sistema | Periféricos a Ladar | |
VCC | Fuente de alimentación | Positivo | 3.3V |
Comenzando
Preparación del Hardware
Esta rutina introducirá el uso de este radar ultrasónico utilizando el XIAO SAMD21 como control maestro. Para la conveniencia del cableado, también utilizaremos la placa de expansión Grove. Puedes elegir una según tus necesidades reales.
XIAO SAMD21 | Base Grove para XIAO | Sensor Ultrasónico Grove (SMS812) |
---|---|---|
![]() | ![]() | ![]() |
Luego, conecta el radar ultrasónico a la interfaz UART del XIAO.

Descripción General de la Librería de Arduino
Si esta es tu primera vez usando Arduino, te recomendamos encarecidamente que consultes Primeros Pasos con Arduino o veas el tutorial simple a continuación:
El botón de abajo te llevará directamente a nuestra librería de programas de Arduino para el Sensor Ultrasónico Grove (SMS812).
Función
Antes de comenzar a desarrollar un sketch, veamos las funciones disponibles de la librería.
-
void setIOMode()
—— Esta función se usa para configurar el radar en modo IO, que se utiliza principalmente para detectar el material objetivo. -
void setUARTMode()
—— Esta función se usa para configurar el radar en modo UART, el radar en modo UART reportará activamente información de distancia y material. -
void setUARTREQMode()
—— Esta función se usa para configurar el radar en modo UART REQ, en el cual la información de distancia y material solo puede consultarse enviando un comando de consulta. -
void checkUARTREQ(int delaytime = 0, bool showSwitch = true)
—— Esta función se usa en modo UART REQ para consultar el material detectado y la distancia.Parámetros de Entrada
delaytime
: El valor predeterminado es 0. Este parámetro controla el tiempo en milisegundos para que se emita el comando de consulta.showSwitch
: El predeterminado está activado. Este parámetro controla si se imprime la trama de datos original.
-
bool getFrame(bool showSwitch = true)
—— Esta función se usa para obtener la trama de datos original.Parámetros de Entrada
showSwitch
: El predeterminado está activado. Este parámetro controla si se imprime la trama de datos original.
-
bool parseDatagram(bool showSwitch = false)
—— Esta función se usa para analizar la trama de datos original.Parámetros de Entrada
showSwitch
: El predeterminado está desactivado. Este parámetro controla si se imprime la trama de datos original.
Instalación
Ya que has descargado la Librería zip, abre tu Arduino IDE, haz clic en Sketch > Include Library > Add .ZIP Library. Elige el archivo zip que acabas de descargar, y si la librería se instala correctamente, verás Library added to your libraries en la ventana de notificación. Lo que significa que la librería se instaló exitosamente.

Ejemplo XIAO
Paso 1. Necesitas instalar un software de Arduino.
Paso 2. Ejecuta la aplicación Arduino.

Paso 3. Selecciona tu modelo de placa de desarrollo y añádelo al IDE de Arduino.
-
Si quieres usar Seeeduino V4.2 para las rutinas posteriores, por favor consulta este tutorial para completar la adición.
-
Si quieres usar XIAO SAMD21(Seeeduino XIAO) para las rutinas posteriores, por favor consulta este tutorial para completar la adición.
-
Si quieres usar XIAO RP2040 para las rutinas posteriores, por favor consulta este tutorial para completar la adición.
-
Si quieres usar XIAO nRF52840 para las rutinas posteriores, por favor consulta este tutorial para completar la adición.
-
Si quieres usar XIAO ESP32C3 para las rutinas posteriores, por favor consulta este tutorial para completar la adición.
-
Si quieres usar XIAO ESP32S3 para las rutinas posteriores, por favor consulta este tutorial para completar la adición.
Para XIAO nRF52840, por favor selecciona Seeed nRF52 mbed-enabled Boards, de lo contrario puede reportarse un error al ejecutar programas.

Paso 4. Instala la biblioteca de código de Arduino.
Demo 1: Uso del Modo IO
Este ejemplo te guiará a través del proceso de imprimir los bits de bandera para distinguir materiales blandos y duros. Aquí está el código de referencia para 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);
}
Después de activar el modo IO, debes saber que si el sensor US5 reconoce el material blando, su pin TX enviará los bits de bandera 0x01
a la placa, de lo contrario, el material duro es 0x00
, por lo que debes configurar el radarPin
como A0 (que conecta el pin TX del sensor) o el pin que soporte entradas analógicas.
El valor alto por encima de 1000 significa reconocer el material duro, y el valor por debajo de 20 significa reconocer el material blando o aire.
Entonces, cuando muevas el sensor frente a la pared... verás la salida serie como se muestra a continuación:

Demo 2: Uso del Modo UART
Para el modo UART, el radar emite mediciones a una velocidad de 100Hz. El formato del telegrama de datos se muestra en la tabla a continuación.
Trama de encabezado | Trama de comando | Trama de longitud de datos | Trama de datos | Trama de suma de verificación |
---|---|---|---|---|
0xAA 0xAA | 0xFD | 0x04 | -- | CS |
Los bits de datos ocupan 4 Bytes. El primer 1 Byte es el bit de bandera del material, 0 significa material duro y 1 significa material blando. Para materiales blandos, será imposible medir la distancia. Luego está el valor de distancia, que ocupa 2 Bytes en milímetros. El último 1 Byte es el valor de intensidad, indicando la fuerza de la señal ultrasónica recibida.
Bit de bandera del material | Valor de distancia | Intensidad |
---|---|---|
1 Byte | 2 Byte | 1 Byte |
En este ejemplo, usaremos las funciones de la biblioteca para analizar las tramas de datos recibidas e imprimir todos los datos de características reportados por el Sensor activo a través del puerto serie.
El puerto serie por hardware en la placa XIAO SAMD21 es el pin de interfaz UART A6 y A7. También puedes usar cualquier dos pines como el puerto serie por software.
#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
}
Después de cargar el código a la placa, mueves el sensor frente al material duro (el material blando no generará los datos analizados), puedes ver los datos analizados a continuación:

Demo 3: Uso del Modo UART REQ
En este ejemplo, establecemos el parámetro delaytime en 1000, lo que significa que sondeamos durante 1 segundo para enviar una consulta de comando. Y el sensor retroalimentará el resultado de medición de distancia mediante el mensaje sin procesar, cuya longitud es de 9 bytes.
#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);
}
}

Recursos
Soporte Técnico y Discusión de Productos
¡Gracias por elegir nuestros productos! Estamos aquí para brindarle diferentes tipos de soporte para asegurar que su experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para satisfacer diferentes preferencias y necesidades.