ESP32 a ultrazvukový snímač JSN-SR04T

01.03.2024 Arduino #esp32 #ultrazvuk #hladina #jsnsr04t

JSN -SR04T je snadno použitelný vodotěsný ultrazvukový senzor vzdálenosti s dosahem 25 až 450 cm. Lze jej použít pro měření hladiny vody nebo venkovního měření vzdálenosti .


Senzor JSN-SR04T se používá v různých aplikacích, včetně autonomního řízení, predikce nehod, detekce pohybu a další.

Vodotěsná vlastnost z něj dělá senzor vhodný pro venkovní použití.

Základy snímače JSN-SR04T

Běžně dostupné snímače JSN-SR04T jsou zobrazeny na obrázku níže. Snímač není přímo součástí CB, ale je odnímatelný. Umožňuje umístit senzor (nárazník vozidla) a chránit PCB před drsným prostředím.

Ultrazvukový senzor vzdálenosti funguje tak, že vysílá ultrazvukové vlny. Tyto ultrazvukové vlny se odrážejí zpět od objektu a ultrazvukový senzor je detekuje. Načasováním času, který uplynul mezi odesláním a příjmem zvukových vln, můžete vypočítat vzdálenost mezi senzorem a objektem.

Snímač JSN-SR04T podporuje více režimů provozu. Jedním z režimů je režim HC-SR04, který přijímá spouštěcí signál a poskytuje echo signální impuls odpovídající době, kterou zvuk potřebuje, aby se pohyboval a odrazil jakýkoli předmět. 

Níže uvedený obrázek ukazuje schéma vývodů modulu vodotěsného ultrazvukového senzoru JSN-SR04T.

JSN-SR04T Provozní režimy

Režim 0 snímače JSN-SR04T

V režimu 0 senzor napodobuje činnost ultrazvukového senzoru HC-SR04. Toto je výchozí režim, ve kterém je PCB implicitně dostupné.

Režim 1 snímače JSN-SR04T

Ultrazvukový senzor sám vypočítá vzdálenost a sériově sdělí naměřenou hodnotu? To dělá režim 1. 

Stačí přijímat naměřenou vzdálenost ze senzoru přímo přes sériový port. 

Chcete-li aktivovat režim 1, propojte malé plošky související s padem M1.

Header Data 1 Data 0 Kontrolní součet
0xFF, označuje začátek dat bloku Vyšší bajt 16bitových dat Dolní bajt 16bitových dat Součet všech tří bajtů

Režim 2 snímače JSN-SR04T

Tento režim je stejný jako režim 1. V tomto případě nejsou data snímačem odesílána automaticky. Musíte odeslat požadavek přes sériový port. 

Chcete-li aktivovat režim 2, zkratujte malé pady související s padem M2. 

Režim 3 snímače JSN-SR04T

Režim 3 je stejný jako režim 1 (režim HC-SR04). Zde nebude čekat na spouštěcí signál od hostitele (ESP32). Automaticky se spustí každých 200 ms a poskytne vám puls na echo vstupu. 

Chcete-li aktivovat režim 3, umístěte odpor 200 kOhm na podložku „mode“.

Režim 4 snímače JSN-SR04T

Režim 4 je stejný jako režim 1 (režim HC-SR04) s velmi nízkou spotřebou energie.

Chcete-li aktivovat režim 4, umístěte odpor 360 k ohmů na podložku „mode“.

Režim 5 snímače JSN-SR04T

Režim 5 funguje jako předem nakonfigurovaný přepínač. Echo pin se přepne, když senzor detekuje jakýkoli objekt ve vzdálenosti 1,5 m.

Chcete-li aktivovat režim 5, umístěte odpor 470 kΩ na podložku „mode“.

Vlastnosti senzoru JSN-SR04T

Zde jsou vlastnosti snímače JSN-SR04T shrnuté v tabulce.

Provozní napětí 5 V
Provozní proud 30 mA
Klidový proud 5 mA
Frekvence 40 kHz
Rozsah měření 25-450 cm
Rozlišení 2 mm
Úhel měření 45-75 stupňů
Rozměry snímače 23,5 x 20 mm, 2,5 m dlouhý kabel
Rozměry PCB 41 x 28,5 mm
Montážní otvor 18 mm

Aplikace snímače JSN-SR04T

Ultrazvukové senzory se používají v různých aplikacích. Senzory pomáhají šetřit energii, zlepšují uživatelský komfort a zvyšují pohodlí a bezpečnost. Zde jsou některé běžné aplikace:

Měření vzdálenosti: Měření vzdálenosti je klíčovou funkcí ultrazvukového senzoru, který je užitečný při parkování, robotické navigaci a automatizaci v průmyslu.

Detekce objektů: Senzor JSN-SR04T můžete použít k detekci objektů, pohybu domácích mazlíčků, bezpečnostních systémů k detekci osob na omezených místech atd.

Měření hladiny: Senzor můžete použít k detekci měření hladiny kapalin v nádržích, průmyslových kotlích a počtu položek zbývajících v nádobách.

Funkce JSN-SR04T

Chcete-li senzor ovládat, musíte jej nastavit Trig na HIGH po dobu alespoň 10 mikrosekund. To způsobí, že deska vyšle osm ultrazvukových impulsů (sonic burst).

Pokud je přijat odražený zvuk (ozvěna), Echo výstup přejde na VYSOKOU úroveň a vzdálenost lze vypočítat jako

vzdálenost = čas na vysoké úrovni * 340 m/s / 2

kde 340 m/s je rychlost zvuku. Tento vzorec je použite v níže uvedeném kódu, ale protože budeme měřit vzdálenost v cm, konstanta bude 0,034 cm/s.

případě JSN-SR04T by cíl měl mít velikost alespoň 0,5 metru čtverečních a chcete senzor nasměrovat kolmo k cíli. Níže uvedená tabulka ukazuje specifikaci snímače, ale dejte pozor, že rozsah měření a rozlišení předpokládá ideální podmínky.

Všimněte si, že ultrazvukové senzory nejsou jako lasery se zaostřeným paprskem. Místo toho je jejich směrovost tvarována jako bublina a také vyžaduje dostatečně velký a tvrdý/reflexní povrch pro přesná měření vzdálenosti.

Připojení senzorového modulu JSN-SR04T k ESP32

Modul ultrazvukového senzoru JSN-SR04T má možnost 4pinového konektoru pro propojení s mikrokontroléry. 

  • Připojte kolík GND snímače ke kolíkům GND ESP32. 
  • Připojte kolík VCC snímače ke kolíku ESP32 5V.
  • Připojte kolík GPIO5 ESP32 ke kolíku TRIG snímače.
  • ECHO pin snímače jde do GPIO18 ESP32.
Piny ultrazvukového snímače JSN-SR04T Piny ESP32
VCC 5V
TRIG GPIO5
ECHO GPIO18
GND GND

Programový kód

#define echoPin 18 
#define trigPin 5                      

long duration; 
int distance; 

void setup()
{
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT);  
  Serial.begin(9600);
  Serial.println("Distance measurement using JSN-SR04T");
  delay(500);
}

void loop()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2); 

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW); 

  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.0344 / 2; 

  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
  delay(100);
}

Jak kód funguje

Nejprve je definován spouštěcí kolík a echo pin. Volám jim trigPinechoPin. Spouštěcí kolík je připojen k digitálnímu kolíku 12 a kolík echa k digitálnímu kolíku 11 na Arduinu. Příkaz const se používá k pojmenování konstantní hodnoty.

const int trigPin = 18;
const int echoPin = 5;

V setup(), začnete inicializací sériové komunikace s přenosovou rychlostí 115200. Chcete-li zobrazit naměřenou vzdálenost na sériovém monitoru, stiskněte Ctrl+Shift+M nebo Tools > Serial Monitor. Ujistěte se, že přenosová rychlost je také nastavena na 115200 v sériovém monitoru.

Dále nastavujeme trigPin jako výstup a echoPin jako vstup.

void setup() {
  Serial.begin(115200);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

V <loop(), spustíte senzor nastavením trigPin HIGH na 20 µs. Všimněte si, že pro získání čistého signálu začněte vymazáním trigPinu jeho nastavením na LOW na 5 mikrosekund.

void loop() {
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(5);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

Dále musíte přečíst duration puls odeslaný echoPinpulseIn() K tomu používám funkci. Tato funkce čeká, až kolík přejde z LOW do HIGH, spustí časování, poté čeká, až kolík přejde na LOW a zastaví časování.

Poté můžete vypočítat vzdálenost pomocí vzorce uvedeného v úvodu tohoto návodu. Všimněte si, že pro rychlost zvuku používáme konstantu 0,034 (místo 340), protože chceme vzdálenost v centimetrech a ne v metrech.

  long duration = pulseIn(echoPin, HIGH);
  long distance = duration * 0.034 / 2;

Nakonec vytiskněte vypočítanou vzdálenost na sériovém monitoru a také ji zobrazte na plotru. Zpoždění 100 milisekund na konci zpomaluje měření na rozumnou míru.

  Serial.print("Distance:");
  Serial.println(distance);
  delay(100);

Příklad kódu JSN-SR04T s knihovnou NewPing

Knihovnu NewPing napsanou Timem Eckelem lze použít s mnoha ultrazvukovými senzory vzdálenosti. Nejnovější verzi této knihovny lze stáhnout zde na bitbucket.org.  Můžete si všimnout, že níže uvedený kód, který používá knihovnu NewPing, je mnohem kratší než kód, který jsme používali dříve.

#include "newping.h"

const int trigPin = 12;
const int echoPin = 11;
const int maxDist = 450;

NewPing sonar(trigPin, echoPin, maxDist);

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

void loop() {
  // Wait 50ms between pings (about 20 pings/sec)
  delay(50); 

  long distance = sonar.ping_cm();

  Serial.print("Distance:");
  Serial.println(distance);
  delay(100);
}