Öğren

Measure distance with an HC-SR04 ultrasonic sensor

Orta

Ya da tüm dersleri gör.

  • 503parça tezgahta
  • 44kart şu an çalışıyor
  • 1.00xgerçek zamanlı, her kartta
Arduino Uno: park sensörülive0.000 s 0.00x
Düzenleyicide açmak için tıkla
Park örneği: pin 7 ve 6'da bir HC-SR04, 9'da bir buzzer ve 8'de bir lamba. Düzenleyicide aç ve duvarı hareket ettirmek için sensörün kaydırıcısını sürükle.

HC-SR04, her sınıfın başladığı sensördür, çünkü içinde gizli hiçbir şey yoktur: veri yolu yok, adres yok, güvenmen gereken kütüphane yok. Ona bir darbe gönderirsin, o bir darbe geri gönderir ve ikincinin uzunluğu mesafedir. Yukarıdaki devre birini bir Arduino Uno'ya bağlar ve okumayı bir park sensörüne çevirir: duvar yaklaştıkça daha hızlı öten bir buzzer ve durma çizgisinin içinde kırmızı bir lamba.

Düzenleyicide aç ve duvarı hareket ettirmek için sensördeki kaydırıcıyı sürükle. Seri monitör mesafeyi santimetre cinsinden ve bip aralığını yazdırır.

What you need

  • Bir Arduino Uno
  • Bir HC-SR04 ultrasonik sensör
  • Bir buzzer
  • Kırmızı bir LED ve 220 ohm'luk bir direnç
  • Bir breadboard ve jumper kablolar

Wiring

Parça ve pinGittiği yerNot
HC-SR04 VCC5 VModül 4.5 V ya da daha fazlasını ister
HC-SR04 GNDGND
HC-SR04 TRIGPin 7Kart bu pinde bir ping atar
HC-SR04 ECHOPin 6Sesin geri gelmesi kadar süre boyunca yüksek
BuzzerPin 9Diğer bacak GND'ye
Kırmızı LED, 220 ohm üzerindenPin 8Durma çizgisinin içindeki ışıklar

Sensör nasıl ölçer

TRIG'i en az on mikrosaniye yüksek tut; modül kısa bir 40 kHz ses patlaması gönderir, sonra ECHO'yu sesin nesneye ulaşıp geri gelmesi kadar süre boyunca yüksek sürer. Ses oda sıcaklığında saniyede yaklaşık 343 metre gider; bu mikrosaniyede 0.0343 santimetredir ve yolculuğu iki kez yapar. Yani santimetre cinsinden mesafe, mikrosaniye cinsinden yankı süresinin yaklaşık 58'e bölümüdür; her HC-SR04 kodunun böldüğü sayı budur.

Mokxi'nin parçası veri sayfasının zamanlamasını korur: ECHO tetiklemeden 460 mikrosaniye sonra yükselir, santimetre başına 58 mikrosaniye yüksek kalır ve menzilde hiçbir şey yokken tam 38 milisaniyelik zaman aşımı boyunca yüksek kalır. Sesin hızı, parça üzerinde ayarlayabileceğin bir hava sıcaklığından gelir; bu yüzden 58'e bölen bir kod, donma sıcaklığında bir metrelik duvarı 104 santimetre okur, gerçek bir modülün yaptığı gibi.

Kod, açıklamalı

Örnek sensörü, tetiklemeyi yapan, yankıyı zamanlayan ve milimetre ya da hiçbir şey dönmediğinde sıfır döndüren küçük bir yardımcıyla okur. Çoğu öğreticinin yaptığı gibi pulseIn() ile elle yazılırsa ölçüm beş satırdır.

Park davranışı tek bir fonksiyondur. 15 santimetrenin içinde tek bir uzun nota tutar ve LED'i yakar. Orayla iki metre arasında bipler arasındaki boşluk 90 milisaniyeden 900'e düz bir çizgide büyür. İki metrenin ötesinde sessiz kalır. Her döngü 60 milisaniyelik bir beklemeyle biter ve bu sayı önemlidir: veri sayfası ping'ler arasında 60 milisaniye ister, çünkü sonuncunun yankısı hâlâ odada geziniyordur.

Ölçüm, çoğu öğreticinin yazdığı gibi
const int TRIG = 7;
const int ECHO = 6;

long readCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long us = pulseIn(ECHO, HIGH, 38000);
  return us / 58;
}

Düzenleyicide dene

Devreyi düzenleyicide aç ve sensörü seç. Sıcaklık özelliği hava sıcaklığıdır, varsayılan 20 derece. 0 yap ve aynı duvar birkaç santimetre daha uzakta okunur, çünkü ses soğuk havada daha yavaştır; 40 yap ve daha yakın okunur. Kod değişmedi ve gerçek bir kodda da değişmezdi.

Sonra loop() içindeki her dalın sonundaki delay(60)'ı delay(20) yap. Ping'lerin çoğu artık yanıtsız kalır, çünkü modül son yankının sönmesini bekliyordur ve çok erken gelen bir tetiklemeyi yok sayar; bu yüzden seri monitör gerçek mesafelerin arasına nothing in range karıştırmaya başlar. 60'a geri koy ve her okuma yine gerçek olur.

Aynı bağlantıyla farklı bir proje için buzzer kodunu çıkar ve mesafeyi seri çizici'ye yazdır; basit bir mesafe ölçerin olur.

Common mistakes

60 milisaniyeden hızlı ping atmak. İlk okuma gelir ve gerisi yok sayılır, çünkü modül hâlâ dinlerken tetiklemeyi reddeder. Simüle edilen parça da aynısını yapar, böylece hata masanda görünmeden önce burada görünür.

TRIG ile ECHO'yu değiştirmek. Hiçbir şey bozulmaz, ama kart hiç gelmeyen bir darbeyi bekler ve her okuma sıfır ya da tam zaman aşımıdır.

Zaman aşımını unutmak. Menzilde hiçbir şey yokken yankı 38 milisaniye sürer ve zaman aşımsız pulseIn() vazgeçmeden önce tam bir saniye bekler; bu da kodun geri kalanını takılmış gösterir.

Son milimetreye güvenmek. Gerçek bir HC-SR04 en iyi ihtimalle birkaç milimetre doğruluktadır ve yumuşak ya da eğik yüzeylerde şaşırır. Simüle edilen okuma tamdır; bu kodu öğrenmek için yararlıdır ama tezgahtan daha naziktir.

ECHO'yu doğrudan 3.3 voltluk bir karta bağlamak. Modül ECHO'yu 5 voltta sürer. Uno'da sorun yok; bir ESP32 ya da Pico'da gerçek bir devre o hatta direnç bölücü ister.

Sorular

HC-SR04'ün menzili nedir?

Yaklaşık 2 santimetreden 4 metreye. Simüle edilen parça 20 milimetreden yakın ya da 4000'den uzak her şeyi menzilde hiçbir şey olarak bildirir.

Neden 58'e bölünür?

Ses oda sıcaklığında bir santimetreyi yaklaşık 29 mikrosaniyede gider ve yankı mesafeyi iki kez, gidiş ve dönüş olarak kat eder. 29 çarpı 2, 58 eder.

HC-SR04'ü ESP32 ile kullanabilir miyim?

Evet, aynı kodla. Gerçek donanımda ESP32 pinleri 5 volta dayanıklı değildir, bu yüzden ECHO'ya, örneğin 1 k ve 2 k'lık, bir bölücü koy ve yaklaşık 3.3 volta indir.

Simülatör sesi kendisi modelliyor mu?

Hayır. Işın açısı ve bir sahneden yansıma yoktur. Parça, mesafesi bir kaydırıcıyla ayarlanan, ECHO'yu sesin hızıyla gidiş dönüş süresi kadar yüksek tutan bir kronometredir. Bu, kodu donanımda çalıştığı gibi tam olarak yazmak ve hata ayıklamak için yeterlidir.

Bunu gerçekten kur

Düzenleyiciyi aç, bir değeri değiştir ve sayının onunla birlikte oynadığını izle. Kurulacak bir şey yok ve hesap gerekmez.