Sensor ultrassônico JSN SR04T com Arduino

O sensor ultrassônico JSN SR04T com Arduino, ESP8266, ESP32, Raspberry ou qualquer outra controladora é simples de utilizar. Seguindo esse link, você terá um PDF (em inglês) especificando o módulo.

O que me atrai nesse módulo é primeiramente o fato de ser à prova d’água, o que nos permite utilizá-lo para medir nível de líquidos – não submergindo-o no líquido, mas medindo o retorno do sinal sobre a superfície, que não lhe causa deflexão. Ser à prova d’água é fundamental para esse propósito, pois micro-gotículas estarão constantemente suspensas, por exemplo, em caixas d’água. Mesmo que o líquido fosse estável, deve-se considerar as mudanças de estado; o líquido evapora e então se condensa, o que faz com que o HC-SR04 não seja o sensor ideal para esse propósito. Particularmente, o acho mais elegante também, dado o fato que temos apenas um elemento que emite o sinal e então entra em modo de retorno. Seu encapsulamento facilita sua inserção em projetos finais, garantindo um aspecto visual bastante satisfatório e discreto.

Especificações do sensor ultrassônico JSN SR04T

Esse módulo é tranquilo de se trabalhar com qualquer MCU, já que opera de 3V à 5V5. Sua corrente de trabalho é menor que 8mA, facilitando ainda mais sua utilização, já que até por GPIO podemos alimentá-lo. Trabalha na frequência de 40KHz, em uma distância máxima de 600cm (6 metros) e distância mínima de 20cm, conforme descrito no documento. A precisão é de aproximadamente 1cm, o que pode não ser suficiente se estiver medindo o nível de uma represa, mas é suficiente para volumetria de caixas d’água, por exemplo. Pode ser usado em robôs também, claro. Quer aumentar a precisão de saída? Faça um “offset”; se for utilizar em um robô, instale-o recuado 20cm. Em uma caixa d’água, coloque-o 20cm acima da tampa. Mas isso só será necessário para distâncias curtas, leia até o final e entenderá.

Uma coisa que me intriga é a descrição de precisão de aproximadamente 1cm e a resolução de 1mm. Veremos na prática o que isso significa.

Modo de operação do sensor ultrassônico JSN SR04T

Essa é a placa, como ela vem:

Sensor ultrassônico JSN SR04T

Modo 1: sensor ultrassônico JSN SR04T sem modificações

Podemos utilizá-lo de 3 maneiras diferentes. No modo convencional, o resistor R27 é aberto. Desse modo, devemos usar um gatilho na porta de IO TRIG. Olhando atrás da placa, temos a identificação TRIG para RX. Do mesmo modo, temos ECHO para TX. Para esse gatilho, devemos colocar o IO em HIGH por pelo menos 10us. O módulo enviará automaticamente 8 ondas quadradas de 40khz e a identificação do retorno é automática.

O sinal de retorno do sensor ultrassônico JSN SR04T é lido no pino ECHO. Para testar a distância, devemos usar:

distance = (high time * speed of sound)/2

Sendo a velocidade do som de 340m/s (metros por segundo). A divisão por 2 é óbvia; o som se originou do ponto que receberá o retorno, portanto teremos o dobro do tempo (ou o dobro da distância) ao receber a resposta.

O gatilho é recebido após a medição da distância, portanto se for excedida a distância mensurável, o pino ECHO mudará para LOW automaticamente após 60ms, marcando o fim da medição com ou sem sucesso.

Fórmula de leitura

A inicialização é um sinal de no mínimo 10us no TTL. O retorno corresponde à distância (150us à 25ms. 38ms se não tiver obstáculo). A fórmula para centímetros seria:

pulse width (us) /58 = distance (cm)

Para leitura em polegadas (alguém haverá de usar), simplesmente mude a divisão para 148.

Um pulso curto ultrassônico é transmitido no tempo 0, refletido por um objeto. Tenha essas informações em mente, mas não se preocupe, o código será disposto mais adiante.

O sensor recebe esse sinal e o converte para um sinal elétrico. O próximo pulso pode ser transmitido quando o echo sumir. Esse processo é chamado de “período de ciclo”. O período recomendado deve ser menor do que 50ms. Se um gatilho de 10us for enviado para o pino de sinal, o sensor emitirá 8 sinais de 40kHz e  “escutará” pelo retorno. A distância medida é proporcional ao comprimento de pulso, e pode ser calculado pela fórmula anterior. Se nenhum obstáculo for detectado, o pino de saída dará um sinal de 38ms em nível alto.

Modo 2: R27 com resistor de 47K

Colocando um resistor de 47K no R27 referenciado na imagem mais acima, o módulo passa a funcionar em ciclos automáticos de 100ms. Eu queria ter usado esse modo, mas não tenho SMD de 47K e não estou afim de emporcalhar a placa com um resistor discreto. Se tiver o resistor em qualquer um dos formatos e desejar utilizá-lo, a comunicação serial poderá ser feita utilizando o padrão 9600,n,8,1. Se não conhece os parâmetros, foque apenas na velocidade.

Após energizado, ele entrará em modo de trabalho direto, entregando uma medição (feita internamente) a cada 100ms, onde um quadro poderá ser lido no pino TX, incluindo 4 dados de 8 bits. O formato do quadro é:

0XFF + H_DATA + L_DATA + SUM

0xFF

Para iniciar os dados, usado como referência.

H_DATA

Dados de distância alto.

L_DATA

Dados de distância baixo.

SUM

Somatória de validação (SUM = 0xFF+H_DATA+L_DATA).

Eu gostaria muito de testar esse modo, talvez eu até procure um resistor de 47K discreto para um próximo artigo. Enfim, temos 16 bits de dados de leitura, com distância em milímetros, sendo  H_DATA deslocado para a esquerda e L_DATA à direita. A resposta deve ser algo semelhante a isso:

FF 07 A1 A7

O checksum tem a seguinte nota:

SUM = A7 = (0x07 + 0xA1 + 0Xff) & 0x00ff

Como os dados já vem na ordem de leitura normal, temos a distância de 0x07A1, que convertido para decimal corresponde a 1953mm. Se o módulo não conseguir efetuar uma leitura válida, a saída será 0.

Modo 3: Resistor de 120K no R27

Ao ser ligado, o módulo sensor ultrassônico JSN SR04T entra em modo de espera e a comunicação também se dará por serial. Quando a porta RX receber a instrução 0x55, ele inicia uma medição e coloca 1 quadro (citado mais acima) no pino RX, com 4 Bytes. O formato é exatamente o mesmo do modo 2. Não sou técnico em eletrônica, por isso só tenho uns 30 tipos de resistores aqui – não inclusos os de 47K e 120K. Tsc, que pena.

 

Usando o sensor ultrassônico JSN SR04T no modo 1

Esse tutorial é o básico; um Arduino UNO e o sensor conectado ao 5V e GND. Os pinos de dados, RX (TRIG) ao pino 2 e TX (ECHO) ao pino 3. Pela documentação descrita, tudo o que precisamos fazer é mandar um sinal para medição em um tempo delta e aguardar a resposta; ler esse valor pelo tanto de tempo que ele fica em HIGH e aplicar a medição. Só que tem um modo rapidíssimo de fazer isso, usando dois recursos interessantes; um na biblioteca NewPing e o outro na biblioteca MedianFilter.

A biblioteca NewPing se encontra no repositório oficial do Arduino. Já a MedianFilter pode ser baixada através desse link do github. Baixe-a em zip ou clone o repositório, coloque dentro do diretório de bibliotecas da IDE do Arduino ou do PlatformIO (~/Arduino/libraries ou .platformio/lib, respectivamente).

Esse é o sketch:

// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------


#include <Arduino.h>
#include <NewPing.h>
#include <MedianFilter.h>
#include <Wire.h>

#define TRIGGER_PIN  2  
#define ECHO_PIN     3  
#define MAX_DISTANCE 600


NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

MedianFilter filter(31,0);

void setup() {
  Serial.begin(9600); 
}

void loop() {
  
  delay(50);
  unsigned int out, micross = sonar.ping(); 

  filter.in(micross);
  out = filter.out();
  Serial.print("Distancia: ");
  Serial.print( out / US_ROUNDTRIP_CM); 
  Serial.println("cm");

  
}

E funciona muito bem! Testei com uma régua de 50cm, deu certinho, compensando a distância mínima, sem precisar fazer ajustes!

Onde comprar

Esse apaixonante sensor pode ser adquirido na Arduino Brasil Shop, através desse link. Aproveite para dar “uma voltinha” pela loja e conferir os materiais que eles tem!

Em breve escreverei sobre um projetinho com esse sensor. Até a próxima!

 

Revisão: Ricardo Amaral de Andrade

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.