تصویر شاخص نوشته: سنسور فاصله اولتراسونیک HC-SR04 چطور فاصله را می‌سنجد؟

سنسور فاصله اولتراسونیک HC-SR04 چطور فاصله را می‌سنجد؟

۲۷ تیر ۱۴۰۵ سنسورها و ورودی‌ها

در فصل «سنسور فاصله HC-SR04» اولین «چشم» را به ربات دادیم؛ حسگری که می‌فهمد جلوی ربات چیزی هست یا نه و چقدر دور است. جالب اینجاست که این چشم اصلاً از نور استفاده نمی‌کند، بلکه از صدا؛ دقیقاً مثل کاری که خفاش‌ها و دلفین‌ها در تاریکی می‌کنند.

چطور واقعاً کار می‌کند

روی این ماژول دو استوانه می‌بینی: یکی بلندگو و یکی میکروفون. کارش را می‌شود در چهار قدم فهمید:

  • تو یک پالسِ کوتاه (حدود ۱۰ میکروثانیه) به پایه‌ی Trig می‌فرستی و می‌گویی «شروع کن».
  • ماژول چند پالسِ صوتی با فرکانس 40 kHz بیرون می‌فرستد. این صدا فراصوت است، یعنی آن‌قدر زیر و تیز که گوشِ آدم اصلاً نمی‌شنودش.
  • صدا در هوا جلو می‌رود، به مانع می‌خورد و مثل پژواک برمی‌گردد.
  • پایه‌ی Echo دقیقاً به‌اندازه‌ی مدتِ رفت‌وبرگشتِ صدا «۱» می‌ماند. پس هرچه مانع دورتر باشد، این زمان بیشتر است.

حالا چطور از زمان به فاصله برسیم؟ سرعت صوت در هوا حدود 343 m/s است. اگر زمانِ رفت‌وبرگشت را داشته باشی، فاصله برابر است با سرعت ضرب‌در زمان، تقسیم بر ۲. چرا تقسیم بر ۲؟ چون صدا مسیر را دو بار طی کرده: یک‌بار رفت تا مانع و یک‌بار برگشت، ولی ما فقط فاصله‌ی یک‌طرفه را می‌خواهیم.

اگر حساب کنی، می‌بینی که صدا برای طیِ هر سانتی‌متر (رفت‌وبرگشت) حدود ۵۸ میکروثانیه وقت می‌گیرد. برای همین یک قاعده‌ی سرانگشتیِ قشنگ داریم: فاصله به سانتی‌متر برابر است با زمانِ اکو به میکروثانیه، تقسیم بر ۵۸. همین یک تقسیم، هم ضرب در سرعتِ صوت و هم تقسیم بر ۲ را با هم انجام داده است.

دو نکته‌ی ظریف هم خوب است بدانی. اول این‌که این سنسور مثل یک لیزرِ نازک جلو را نمی‌بیند؛ صدا به‌شکل یک مخروط پخش می‌شود، پس مانعی که کمی کنارِ محور باشد هم دیده می‌شود و همین گاهی خطا می‌سازد. به همین دلیل در ربات‌های واقعی چند بار پشت‌سرهم اندازه می‌گیرند و میانگین یا میانه را برمی‌دارند تا عددِ پرشی و اشتباه حذف شود. دوم این‌که سرعتِ صوت با دما کمی تغییر می‌کند؛ در هوای گرم‌تر صدا کمی تندتر می‌رود، برای همین در کارهای خیلی دقیق، دما را هم در محاسبه دخالت می‌دهند.

کاربردهای واقعی

  • سنسورهای پارکِ خودرو که وقتی به مانع نزدیک می‌شوی بوق می‌زنند.
  • دوری‌گزینی از مانع در ربات‌های متحرک.
  • درها و شیرهای آبِ خودکار که حضورِ آدم را حس می‌کنند.
  • اندازه‌گیریِ سطحِ مایع در مخزن‌ها و سیلوهای صنعتی، بدون تماس با مایع.
  • حفظ ارتفاعِ پروازِ پهپاد نسبت به زمین.

در عمل: سیم‌کشی و کد

پایه‌ی Trig را به GPIO 5 و Echo را به GPIO 18 وصل کن، تغذیه به 5V و GND. تابعِ زیر یک پالس می‌فرستد، طولِ اکو را با time_pulse_us می‌گیرد و بر ۵۸ تقسیم می‌کند:

from machine import Pin
import machine
import time

trig = Pin(5, Pin.OUT)
echo = Pin(18, Pin.IN)

def read_distance_cm():
    trig.value(0)
    time.sleep_us(2)
    trig.value(1)
    time.sleep_us(10)
    trig.value(0)
    t = machine.time_pulse_us(echo, 1, 30000)
    if t < 0:
        return -1   # timeout
    return t // 58

while True:
    print(read_distance_cm(), "cm")
    time.sleep_ms(200)

اشتباه‌های رایج

  • سطح‌های نرم یا کج: پارچه، اسفنج و دیوارِ کج صدا را جذب می‌کنند یا به بیرون منعکس می‌کنند و اندازه‌گیری خطا می‌دهد.
  • خیلی نزدیک بودن: فاصله‌های کمتر از حدود ۲ سانتی‌متر قابل‌اعتماد نیست.
  • ولتاژِ پایه‌ی Echo: در دنیای واقعی خروجیِ Echo پنج‌ولتی است و باید با یک تقسیم‌کننده‌ی ولتاژ به پایه‌ی ۳٫۳ ولتیِ ESP32 برسد.
  • نگذاشتنِ timeout: اگر پژواکی برنگردد و منتظر بمانی، برنامه قفل می‌کند؛ برای همین در کد یک سقفِ زمانی گذاشته‌ایم.

همین حالا امتحان کن

مانع را جلوی سنسور جابه‌جا کن و عددِ فاصله را زنده ببین: شبیه‌ساز اولتراسونیک را باز کن. برای یادگیری کاملِ فرمول و ترمزِ خودکار، سراغ فصل سنسور فاصله برو.