Grove Ultrasonic Sensor (SMS812)

Introdução
O Grove Ultrasonic Sensor (SMS812) é um sensor de medição de distância em miniatura e ultrabaixo consumo de energia. O Grove Ultrasonic Sensor (SMS812) é baseado no princípio de tempo de voo (ToF) ultrassônico e é projetado com acústica, eletrônica e algoritmos relacionados. A medição de distância de alta precisão é alcançada através da diferença de energia dos sinais de eco ultrassônico na superfície de diferentes materiais, e ele fornece informações de distância em nível de milímetro e o valor de intensidade de energia de eco, e também pode fornecer bits de sinalização para distinguir materiais macios e duros. Além disso, pode ser usado em robôs de limpeza para identificar materiais do piso e medir distâncias dentro de um determinado alcance. Ele possui tamanho reduzido e é fácil de instalar.
Aplicações
- O robô de limpeza reconhece os materiais macios e duros no chão
- Robô de serviço doméstico ou aspirador robô para obter informações sobre o piso
- Detecção de nível de impressora 3D
Características
- Precisão de medição em nível de milímetro, ótima estabilidade de medição
- Reconhece materiais macios e duros e fornece informações de E/S
- Distância de detecção de até 20–50 mm e área cega pequena
- Suporte a Arduino
Visão geral de hardware

- A estrutura deste sensor é cilíndrica e feita por moldagem por injeção de plástico.
- As dimensões na figura acima estão em milímetros.

Esta interface é um conector tipo plugue PH1.0-4P. E a definição dos pinos é a seguinte:
| Pin | Type | Description | Defaults | Data stream |
| GND | Power supply | Negativo | 0V | |
| Tx | Saída | Saída da porta serial do sistema | Radar para periféricos | |
| Rx | Entrada | Entrada da porta serial do sistema | Periféricos para radar | |
| VCC | Power supply | Positivo | 3.3V |
Primeiros Passos
Preparação de hardware
Esta rotina apresentará o uso deste radar ultrassônico usando o XIAO SAMD21 como controle principal. Para facilitar a fiação, também usaremos a placa de expansão Grove. Você pode escolher uma de acordo com suas necessidades reais.
| XIAO SAMD21 | Grove Base para XIAO | Grove Ultrasonic Sensor (SMS812) |
|---|---|---|
![]() | ![]() | ![]() |
Em seguida, conecte o radar ultrassônico à interface UART do XIAO.

Visão geral da biblioteca Arduino
Se esta é a sua primeira vez usando Arduino, recomendamos fortemente que você consulte Getting Started with Arduino ou veja o simples tutorial abaixo:
O botão abaixo levará você diretamente à nossa biblioteca de programas Arduino para o Grove Ultrasonic Sensor (SMS812).
Função
Antes de começarmos a desenvolver um sketch, vamos analisar as funções disponíveis da biblioteca.
-
void setIOMode()—— Esta função é usada para configurar o radar no modo IO, que é usado principalmente para detectar o material-alvo. -
void setUARTMode()—— Esta função é usada para configurar o radar no modo UART; no modo UART o radar irá reportar ativamente informações de distância e material. -
void setUARTREQMode()—— Esta função é usada para configurar o radar no modo UART REQ, no qual as informações de distância e material só podem ser consultadas enviando um comando de consulta. -
void checkUARTREQ(int delaytime = 0, bool showSwitch = true)—— Esta função é usada no modo UART REQ para consultar o material detectado e a distância.Parâmetros de entrada
delaytime: O valor padrão é 0. Este parâmetro controla o tempo em milissegundos para o envio do comando de consulta.showSwitch: O padrão é ligado. Este parâmetro controla se o quadro de dados original é impresso.
-
bool getFrame(bool showSwitch = true)—— Esta função é usada para obter o quadro de dados original.Parâmetros de entrada
showSwitch: O padrão é ligado. Este parâmetro controla se o quadro de dados original é impresso.
-
bool parseDatagram(bool showSwitch = false)—— Esta função é usada para analisar o quadro de dados original.Parâmetros de entrada
showSwitch: O padrão é desligado. Este parâmetro controla se o quadro de dados original é impresso.
Instalação
Como você já baixou a biblioteca em formato zip, abra o seu Arduino IDE, clique em Sketch > Include Library > Add .ZIP Library. Escolha o arquivo zip que você acabou de baixar e, se a biblioteca for instalada corretamente, você verá Library added to your libraries na janela de notificações. Isso significa que a biblioteca foi instalada com sucesso.

Exemplo com XIAO
Passo 1. Você precisa instalar o software Arduino.
Passo 2. Inicie o aplicativo Arduino.

Passo 3. Selecione o modelo da sua placa de desenvolvimento e adicione-o ao Arduino IDE.
-
Se você quiser usar Seeeduino V4.2 para as rotinas posteriores, consulte este tutorial para concluir a adição.
-
Se você quiser usar XIAO SAMD21(Seeeduino XIAO) para as rotinas posteriores, consulte este tutorial para concluir a adição.
-
Se você quiser usar XIAO RP2040 para as rotinas posteriores, consulte este tutorial para concluir a adição.
-
Se você quiser usar XIAO nRF52840 para as rotinas posteriores, consulte este tutorial para concluir a adição.
-
Se você quiser usar XIAO ESP32C3 para as rotinas posteriores, consulte este tutorial para concluir a adição.
-
Se você quiser usar XIAO ESP32S3 para as rotinas posteriores, consulte este tutorial para concluir a adição.
Para XIAO nRF52840, selecione Seeed nRF52 mbed-enabled Boards, caso contrário, um erro pode ser reportado ao executar programas.

Passo 4. Instale a biblioteca de código Arduino.
Demo 1: Uso do Modo IO
Este exemplo irá guiá-lo pelo processo de impressão dos bits de sinalização para distinguir materiais macios e duros. Aqui está o código de referência 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);
}
Depois de ativar o modo IO, você deve saber que, se o sensor US5 reconhecer o material macio, seu pino TX enviará os bits de sinalização 0x01 para a placa, caso contrário, o material duro é 0x00, então você deve definir o radarPin como A0 (que conecta ao pino TX do sensor) ou o pino que suporta entradas analógicas.
O valor alto acima de 1000 significa reconhecimento de material duro, e o valor abaixo de 20 significa reconhecimento de material macio ou ar.
Então, quando você mover o sensor em frente, verá a saída serial como abaixo:

Demo 2: Uso do Modo UART
Para o modo UART, o radar gera medições a uma taxa de 100 Hz. O formato do telegrama de dados é mostrado na tabela abaixo.
| Quadro de cabeçalho | Quadro de comando | Quadro de comprimento de dados | Quadro de dados | Quadro de checksum |
|---|---|---|---|---|
| 0xAA 0xAA | 0xFD | 0x04 | -- | CS |
Os bits de dados ocupam 4 Byte. O primeiro 1 Byte é o bit de sinalização de material, 0 significa material duro e 1 significa material macio. Para materiais macios, será impossível medir a distância. Em seguida, há o valor de distância, que ocupa 2 Byte em milímetros. O último 1 Byte é o valor de intensidade, indicando a força do sinal ultrassônico recebido.
| Bit de sinalização de material | Valor de distância | Intensidade |
|---|---|---|
| 1 Byte | 2 Byte | 1 Byte |
Neste exemplo, usaremos as funções da biblioteca para analisar os quadros de dados recebidos e imprimir todos os dados de características reportados pelo Sensor ativo via porta serial.
A porta serial de hardware na placa XIAO SAMD21 é o pino de interface UART A6 e A7. Você também pode usar quaisquer dois pinos como serial 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
}
Depois de fazer o upload do código para a placa, mova o sensor em frente ao material duro (material macio não irá gerar os dados analisados), você poderá ver os dados analisados abaixo:

Demo 3: Uso do Modo UART REQ
Neste exemplo, definimos o parâmetro delaytime para 1000, o que significa que fazemos uma pesquisa de 1 segundo para enviar uma consulta de comando. E o sensor retornará o resultado de medição pela mensagem bruta, cujo comprimento é 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
Suporte Técnico & Discussão de Produto
Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.



