04-darsOson30 daqiqaOʻZ · РУ · ENSimulyatorda bor

HC-SR04 bilan masofani oʻlchash

HC-SR04 aks-sadoni santimetrga qanday aylantiradi: ishga tushirish va aks-sado impulslari, formulada nega 58 ga boʻlinadi, pulseIn() kutish chegarasi, datchikni nima chalgʻitadi va mediana filtri.

VideoYouTubeʼda

Asosiysi

  • ECHO impulsi tovushning narsagacha borib-qaytishi qancha davom etsa, shuncha davom etadi.
  • Masofa (sm) = impuls davomiyligi (mks) / 58; bu tovush tezligi taxminan 343 m/s boʻlganda (20 °C) toʻgʻri.
  • 25 ms kutish chegarasi berilgan pulseIn() aks-sado qaytmasa, 0 qaytaradi; sketch uni 400 ga aylantiradi.
  • Eski aks-sadolar soʻnib ulgurishi uchun signallar orasida taxminan 60 ms kuting.
  • Uchta oʻlchovning medianasi bitta notoʻgʻri oʻlchovni chiqarib tashlaydi.

HC-SR04 masofani tovush yordamida oʻlchaydi. U qisqa ultratovush signalini yuboradi va aks-sado qancha vaqtda qaytib kelishini oʻlchaydi. Narsa qancha uzoqda boʻlsa, kutish shuncha uzoq davom etadi.

Aks-sado qanday qilib masofaga aylanadi

HC-SR04 40 kHz tovush yuboradi, devor aks-sadoni qaytaradi, mikrosekundlardagi t vaqt esa masofani beradi: d = t / 58 sm.

20 °C da tovush havoda taxminan 343 m/s tezlikda tarqaladi. Devorga urilganda uning bir qismi orqaga qaytadi. Tovush qancha vaqt yoʻlda boʻlganini bilsangiz, u qancha masofani bosib oʻtganini ham bilasiz. Koʻrshapalaklar qorongʻida yoʻl topish uchun xuddi shu gʻoyadan foydalanadi.

HC-SR04 chastotasi 40 kHz boʻlgan tovushdan foydalanadi. Odamlar faqat taxminan 20 kHz gacha eshitadi, shuning uchun siz hech narsa eshitmaysiz. Uning ikkita dumaloq «koʻzi» — T (transmitter, uzatkich) belgili kichik dinamik va R (receiver, qabul qilgich) belgili mikrofon.

Toʻrtta pin

Pin Nima qiladi Robot-mashinada
VCC Taʼminot, 5 V L298N +5V
TRIG Kirish: bu yerga berilgan qisqa impuls oʻlchashni boshlaydi D9
ECHO Chiqish: tovushning borib-qaytishi qancha davom etsa, shuncha uzun impuls D10
GND Yer Unoning GND pinlaridan biri

Datchik 5 V ga moʻljallangan. VCC ni hech qachon batareyaga ulamang.

QayerdanQayergaNima uchun
Batareya +L298N +12VMotorlar quvvati: toʻrtta AA batareyadan taxminan 6 V
Batareya -L298N GNDBatareya minusi
L298N +5VUno 5VDrayver stabilizatori Unoni quvvatlaydi: taxminan 4,4 V
L298N GNDUno GNDUmumiy yer: signallarga bir xil 0 V kerak
Uno D5L298N ENAChap motor tezligi (PWM); ENA jumperi olib qoʻyilgan
Uno D4L298N IN1Chap motor yoʻnalishi
Uno D7L298N IN2Chap motor yoʻnalishi
Uno D8L298N IN3Oʻng motor yoʻnalishi
Uno D12L298N IN4Oʻng motor yoʻnalishi
Uno D6L298N ENBOʻng motor tezligi (PWM); ENB jumperi olib qoʻyilgan
Chap motor M+L298N OUT1
Chap motor M-L298N OUT2
Oʻng motor M+L298N OUT4Ataylab almashtirilgan: bu motor koʻzgudagidek oʻrnatilgan
Oʻng motor M-L298N OUT3Ataylab almashtirilgan: bu motor koʻzgudagidek oʻrnatilgan
HC-SR04 VCCL298N +5VDatchik uchun 5 V
HC-SR04 GNDUno GNDYer (GND)
Uno D9HC-SR04 TRIGOʻlchashni boshlaydi: 10 mks impuls
Uno D10HC-SR04 ECHOAks-sadoning borib-qaytish vaqtiga teng impuls
Dars uchun detallar

Bitta oʻlchov bosqichma-bosqich

  1. Uno TRIG ni 2 mikrosekund (mks) davomida LOW holatida ushlab turadi, shunda impuls toza LOW holatdan boshlanadi.
  2. Keyin TRIG ni 10 mks davomida HIGH qiladi va yana LOW qiladi. Bu ishga tushirish impulsi «hozir oʻlcha» degan maʼnoni bildiradi.
  3. Datchik 40 kHz chastotali tovushning sakkizta impulsidan iborat qisqa signal yuboradi.
  4. Tovush chiqib ketishi bilanoq datchik ECHO ni HIGH qiladi.
  5. Aks-sado qaytib kelganda datchik ECHO ni LOW qiladi.
  6. ECHO dagi HIGH impulsning davomiyligi — tovush narsagacha yetib borib, qaytib kelishi uchun ketgan vaqt.

Sketch

DistanceMeter.ino
// Distance meter: measures with the HC-SR04 and prints centimetres to the Serial Monitor.
// The median of three readings throws away a single wrong echo.
// HC-SR04: VCC -> 5 V, GND -> GND, TRIG -> D9, ECHO -> D10

const byte TRIG = 9, ECHO = 10;

// Distance in centimetres; 400 when no echo came back (nothing within about 4 m).
int readDistanceCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);            // at least 10 microseconds starts a measurement
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  unsigned long us = pulseIn(ECHO, HIGH, 25000UL);  // echo pulse length, 0 after 25 ms
  if (us == 0) return 400;
  return us / 58;                      // there and back at 343 m/s: 58 us per cm
}

int median3(int a, int b, int c) {
  if ((a <= b && b <= c) || (c <= b && b <= a)) return b;
  if ((b <= a && a <= c) || (c <= a && a <= b)) return a;
  return c;
}

void setup() {
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
  Serial.begin(9600);
}

void loop() {
  int a = readDistanceCm();
  delay(60);                           // let the last echo die away
  int b = readDistanceCm();
  delay(60);
  int c = readDistanceCm();
  Serial.print("Distance: ");
  Serial.print(median3(a, b, c));
  Serial.println(" cm");
  delay(60);
}

readDistanceCm() 1 dan 6 gacha boʻlgan qadamlarni bajaradi va impulsni santimetrga aylantiradi. median3() uchta oʻlchovning oʻrtadagisini tanlaydi. loop() 60 ms oraliq bilan uch marta oʻlchaydi va oʻrtadagi qiymatni chiqaradi. setup() TRIG ni chiqish, ECHO ni esa kirish qiladi va Serial ni ishga tushiradi. loop() oxiridagi delay(60) bir aylanishning oxirgi signali bilan keyingi aylanishning birinchi signali orasida ham xuddi shunday pauza boʻlishini taʼminlaydi. Keyingi boʻlimlar har bir raqamni tushuntiradi.

Nega 58 ga boʻlinadi?

343 m/s tezlikda tovush bir mikrosekundda 0,0343 sm yoʻl bosadi. Demak, bir santimetrga taxminan 29 mks ketadi. Lekin tovush borib, qaytishi kerak: masofaning har bir santimetriga 2 sm yoʻl toʻgʻri keladi. Shuning uchun masofaning har bir santimetri ECHO impulsiga taxminan 58 mks qoʻshadi:

masofa (sm) = ECHO impulsi (mks) / 58

ECHO impulsi Masofa
580 mks 10 sm
1160 mks 20 sm
5800 mks 100 sm
23 200 mks (taxminan 23 ms) 400 sm, datchik chegarasi

Sketchda us / 58 butun sonlarni boʻladi, shuning uchun natija ham butun son boʻladi. Verguldan keyingi qism tashlab yuboriladi: 1199 / 58 natijasi 20,7 emas, 20 boʻladi. Robot uchun 1 sm lik qadamlar yetarlicha aniq.

pulseIn() va uning 25 ms lik kutish chegarasi

pulseIn(ECHO, HIGH, 25000UL) ECHO ning HIGH boʻlishini kutadi, u qancha vaqt HIGH boʻlib turishini oʻlchaydi va shu vaqtni mikrosekundlarda qaytaradi. UL 25000 sonini unsigned long deb belgilaydi: kutish chegarasi aynan shu turda beriladi.

Uchinchi son — kutish chegarasi (timeout): 25 000 mks, yaʼni 25 ms. Agar shu vaqtgacha impuls tugamasa, pulseIn() kutishni toʻxtatadi va 0 qaytaradi. Nega 25 ms? Datchik chegarasi boʻlgan 4 m dan qaytadigan aks-sado taxminan 23 ms oladi. Demak, 25 ms oʻlchash oraligʻidagi har qanday aks-sadoni kichik zaxira bilan qamrab oladi. Kutish chegarasi boʻlmasa, pulseIn() bir soniyagacha kutadi va shu vaqt davomida sketch boshqa hech narsa qilmaydi.

Kutish chegarasi boʻlsa ham, tovush yoʻlda boʻlgan paytda pulseIn() sketchni kuttirib qoʻyadi: 1 m narida turgan devor uchun taxminan 6 ms, aks-sado kelmasa esa toʻliq 25 ms. Robot uchun bunday qisqa kutishlar maqbul. Uzoq kutishlar esa muammo tugʻdiradi, buni Hech qachon kutmaydigan dasturlar darsi koʻrsatadi.

Taxminan 4 m ichida hech narsa boʻlmasa, impulsni oʻz vaqtida tugatadigan aks-sado kelmaydi va pulseIn() 0 qaytaradi. Sketch uni 400 ga aylantiradi:

if (us == 0) return 400;
return us / 58;

400 «taxminan 4 m ichida hech narsa yoʻq» degani. Bu son ataylab katta tanlangan: shunda distanceCm < 25 kabi tekshiruv «aks-sado yoʻq» holatini «yoʻl ochiq» deb qabul qiladi.

Nega signallar orasida 60 ms kutiladi?

Signal yuborilgandan keyin tovush xonada yana bir muddat devordan devorga urilib yuradi. Agar keyingi signal juda erta yuborilsa, uzoqdagi devordan kelgan eski aks-sado yetib kelib, yangi va yaqin narsadan qaytgandek koʻrinishi mumkin. Shuning uchun sketch signallar orasida 60 ms kutadi. 60 ms ichida tovush taxminan 20 m yoʻl bosadi. Bu vaqtga kelib eski aks-sadolar datchikni chalgʻitish uchun juda kuchsiz boʻlib qoladi.

Uchta oʻlchovning medianasi

Baʼzan bitta oʻlchov shunchaki notoʻgʻri chiqadi. Aks-sado yoʻqoladi va siz 400 ni olasiz. Yoki eski aks-sado yetib keladi va siz haddan tashqari kichik qiymatni olasiz. Bitta notoʻgʻri son robotni sababsiz burilishga majbur qilishi mumkin.

Shuning uchun sketch 60 ms oraliq bilan uch marta oʻlchaydi va oʻrtadagi qiymatni, yaʼni medianani qoldiradi. median3() avval b ning a va c orasida yotishini tekshiradi, ular qaysi tartibda boʻlishidan qatʼi nazar. Agar shunday boʻlsa, mediana — b. Aks holda u xuddi shu tarzda a ni tekshiradi. Agar ikkalasi ham oʻrtada boʻlmasa, demak, oʻrtadagisi c.

Oʻlchovlar Tartiblangan Mediana Oʻrtacha
52, 51, 53 51, 52, 53 52 52
52, 400, 51 51, 52, 400 52 taxminan 168

Qolgan ikkitasi bir-biriga mos kelsa, bitta notoʻgʻri oʻlchov oʻtib keta olmaydi. Oʻrtacha qiymatni esa u buzib yuboradi. Buning evaziga tezlik yoʻqotiladi: chiqarilgan har bir natija uchun uchta signal kerak, shuning uchun yangi qator soniyasiga taxminan oʻn olti marta emas, atigi toʻrt-besh marta chiqadi.

Datchik nimani koʻra olmaydi

  • Juda yaqin yoki juda uzoq narsalar. U taxminan 2 sm dan taxminan 4 m gacha oʻlchaydi. 2 sm dan yaqin masofada oʻlchovlar notoʻgʻri boʻladi.
  • Robotning yonidagi narsalar. U kengligi taxminan 15 gradus boʻlgan tor konus ichida tinglaydi. U robotning yonidagini emas, oldidagini koʻradi. Konusda ikkita narsa boʻlsa, siz yaqinroq turganini olasiz.
  • Yumshoq sirtlar. Pardalar, divanlar, porolon va kiyimlar tovushni yutadi. Aks-sado kuchsiz boʻladi yoki umuman qaytmaydi.
  • Qiya sirtlar. Juda qiya burchak ostida uchragan devor tovushni boshqa tomonga qaytaradi, xuddi koʻzgu yorugʻlikni qaytargani kabi. Siz 400 ni olasiz yoki, agar tovush boshqa devor orqali qaytsa, haddan tashqari katta masofani olasiz. Simulyatordagi datchik ham juda qiya burchak ostida uchragan devorni sezmaydi.
  • Kichik yoki ingichka narsalar. Ruchka yoki stul oyogʻi juda kam tovush qaytaradi va sezilmay qolishi mumkin.

Harorat

Tovush tezligi har bir gradus Selsiyda taxminan 0,6 m/s ga oʻzgaradi. 58 soni taxminan 20 °C ga moʻljallangan. Mana, roppa-rosa 1 m narida turgan devor uchun sketch nimani koʻrsatadi:

Havo harorati Tovush tezligi Sketch taxminan koʻrsatadi
0 °C taxminan 331 m/s 104 sm
20 °C taxminan 343 m/s 100 sm
35 °C taxminan 352 m/s 98 sm

Devorlardan qochadigan robot uchun bir necha santimetr ahamiyatsiz. Qishda ham, yozda ham ishlatiladigan oʻlchov asbobi uchun esa ular muhim.

Arenada Serial Monitor oynasini kuzatish

setup() ichidagi Serial.begin(9600) ketma-ket aloqani 9600 bod tezlikda ochadi. Shundan soʻng loop() ning har bir aylanishi Distance: 57 cm kabi bitta qator chiqaradi.

Robotni arenada ishga tushiring va Serial Monitor (port monitori) oynasini oching. Nimani koʻrasiz:

  • Soniyasiga toʻrt-besh marta yangi qator chiqadi.
  • Undagi son — datchik oldidagi narsagacha boʻlgan masofa.
  • Taxminan 4 m ichida hech narsa boʻlmasa, qatorda Distance: 400 cm yoziladi.
  • Robot joyida turadi, chunki bu sketch motorlarni umuman ishga tushirmaydi.

Arenadagi masofaning jonli koʻrsatkichi ham masofani koʻrsatadi, shuning uchun sketch chiqargan sonlarni u bilan solishtirishingiz mumkin. Devor yaqin boʻlsa-yu, har bir qatorda 400 yozilgan boʻlsa, ulanishni tekshiring. Quvvat olmayotgan yoki TRIG yoxud ECHO simi chiqib ketgan datchik hech qachon javob bermaydi. Haqiqiy robotda Arduino IDE dagi Serial Monitor oynasini oching va Serial.begin() dagi bilan bir xil son — 9600 bod tezlikni tanlang.

Keyingi qadamlar

Toʻsiqni aylanib oʻtuvchi robot yurib ketayotganda readDistanceCm() funksiyasidan foydalanadi. U qanday qilib bir vaqtning oʻzida ham oʻlchab, ham harakatlanishini Hech qachon kutmaydigan dasturlar darsi koʻrsatadi. Masofa saqlovchi robot esa xuddi shu funksiya yordamida qoʻlingizga ergashadi.

Oʻzingizni tekshiring

1ECHO impulsi 1740 mikrosekund davom etdi. Narsa qancha uzoqlikda?

1740 / 58 = 30, demak, narsa taxminan 30 sm uzoqlikda.

2Nega sketch pulseIn() ga 25 ms kutish chegarasini beradi?

Datchik chegarasi boʻlgan 4 m dan qaytadigan aks-sado taxminan 23 ms oladi. Kutish chegarasi boʻlmasa, pulseIn() bir soniyagacha kutishi mumkin edi va sketch bu vaqtda boshqa hech narsa qila olmasdi.

3Uchta oʻlchov: 48, 400 va 47. median3() nimani qaytaradi?

U oʻrtadagi qiymat — 48 ni qaytaradi, shuning uchun yoʻqolgan aks-sado (400) eʼtiborga olinmaydi. Oʻrtacha qiymat 165 boʻlgan boʻlardi.

Topshiriq

Oʻlchangan masofa 50 sm dan kam boʻlsa, Unoning L svetodiodi (D13) yonadigan, aks holda oʻchadigan qiling. Sketchni arenada ishga tushiring va svetodiodni Serial Monitor koʻrsatayotgan qiymatlar bilan solishtiring. Agar robotga bunchalik yaqin narsa boʻlmasa, 50 ni ekrandagi masofadan biroz kattaroq qiymatga oʻzgartiring va svetodiod yonishini tekshiring.

Maslahat

Medianani avval oʻzgaruvchiga saqlang, shunda uni ham chiqara, ham solishtira olasiz.