آردوینومقدماتی۷ دقیقه مطالعهArduino IDE 2.x / Uno R3

حسگر فاصلهٔ التراسونیک HC-SR04

حسگر التراسونیک HC-SR04 را با تابع pulseIn به آردوینو وصل می‌کنید و فاصلهٔ اجسام تا ۴۰۰ سانتی‌متر را با محاسبهٔ زمان پژواک اندازه می‌گیرید.

آنچه در این درس می‌آموزید

  • اصول اندازه‌گیری فاصله با پالس صوتی و زمان پژواک را توضیح دهید
  • فرمول فاصله بر اساس زمان رفت‌وبرگشت صدا را درک و در کد به‌کار ببرید
  • فاصلهٔ اجسام را با pulseIn بخوانید و در سریال مانیتور نمایش دهید
نویسنده: تیم داکنامه · بازبینی: ۲۰۲۶-۱۰-۳۱
فهرست مطالب

روبات‌ها، مخازن آب و سنسورهای پارک خودرو همه به یک چیز نیاز دارند: دانستن فاصله از مانع، بدون لمس آن. حسگر التراسونیک HC-SR04 ارزان‌ترین و پرکاربردترین ابزار این کار است؛ صدایی فراتر از شنوایی انسان می‌فرستد و از زمان بازگشت آن، فاصله را حساب می‌کند — همان منطقی که خفاش در تاریکی استفاده می‌کند. این درس اولین سنسور «اندازه‌گیر واقعی» شماست و همهٔ مفاهیمش — پالس، زمان‌سنجی و تبدیل واحد — در سنسورهای بعدی هم تکرار می‌شود.

اصول کار: فرستادن و گوش‌دادن

سنسور چهار پین دارد و چرخهٔ کارش سه گام است:

  1. آردوینو روی پین TRIG یک پالس ۱۰ میکروثانیه‌ای می‌فرستد تا اندازه‌گیری شروع شود.
  2. سنسور یک بستهٔ هشت‌ضربی امواج صوتی با فرکانس ۴۰ کیلوهرتز می‌فرستد و هم‌زمان پین ECHO را HIGH می‌کند.
  3. وقتی صدا پس از برخورد به جسم برمی‌گردد، پین ECHO LOW می‌شود. طول حالت HIGH یعنی «زمان رفت‌وبرگشت» صوت (در میکروثانیه).

پس فاصله از یک ضرب ساده درمی‌آید:

distance_cm = duration * 0.034 / 2

دو بخش این فرمول را باز کنید: سرعت صوت در هوا حدود ۳۴۳ متر بر ثانیه است، یعنی 0.034 سانتی‌متر در هر میکروثانیه. و چون صدا مسیر را دو بار طی می‌کند — رفت تا جسم و برگشت به سنسور — عدد را بر ۲ تقسیم می‌کنیم تا فقط مسیر یک‌طرفه بماند. مثلاً اگر ECHO برای ۱۳۵۰ میکروثانیه HIGH بماند، فاصله برابر ۱۳۵۰ ضرب در 0.034 تقسیم بر ۲ یعنی حدود ۲۳ سانتی‌متر است.

پین‌ها و مشخصات

پین نقش
VCC تغذیهٔ 5 ولت
TRIG ورودی؛ پالس آغاز اندازه‌گیری
ECHO خروجی؛ پالس زمان رفت‌وبرگشت
GND زمین
مشخصه مقدار
بازهٔ اندازه‌گیری حدود ۲ تا ۴۰۰ سانتی‌متر
ناحیهٔ کور زیر ۲ سانتی‌متر؛ پاسخ نامطمئن
زاویهٔ مؤثر حدود ۱۵ درجه حول محور سنسور
فرکانس کاری ۴۰ کیلوهرتز

دو محدودیت را از همین جدول به خاطر بسپارید: اجسام نزدیک‌تر از ۲ سانتی‌متر داخل «ناحیهٔ کور» (Blind Zone) می‌افتند و سنسور جواب مطمئنی نمی‌دهد؛ و زاویهٔ پهن صوت یعنی جسم کناری هم ممکن است پژواک بسازد و اندازه‌گیری را مخلوط کند.

ECHO این سنسور خروجی 5 ولت است و روی Uno بی‌خطر است؛ ولی اگر روزی با برد 3.3 ولتی کار کردید، این خروجی باید با مقسوم ولتاژ پایین بیاید.

سیم‌کشی

آردوینو Uno ماژول HC-SR04
5V VCC
GND GND
D9 TRIG
D10 ECHO

پین‌های TRIG و ECHO هر دو ورودی-خروجی دیجیتال معمولی‌اند؛ هر پین دیجیتال آزادی کار می‌کند، فقط از 0 و 1 (مربوط به آپلود) دوری کنید.

اسکچ کامل: نمایش فاصله

تابع کلیدی pulseIn است: منتظر می‌ماند پین به حالت مشخصی برود، زمان‌سنجی را شروع می‌کند و تا برگشت پین به حالت مقابل، مدت را به میکروثانیه برمی‌گرداند:

ultrasonic-distance.ino
const int trigPin = 9;
const int echoPin = 10;

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

void loop() {
  // Clear the trigger before measuring
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  // Send a 10 microsecond pulse to start the burst
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Measure the echo pulse width (timeout 26000 us ~ 4 m)
  unsigned long duration = pulseIn(echoPin, HIGH, 26000);

  if (duration == 0) {
    Serial.println("Out of range");
  } else {
    int distance_cm = duration * 0.034 / 2;
    Serial.print("Distance: ");
    Serial.print(distance_cm);
    Serial.println(" cm");
  }
  delay(500);
}

توضیح نکته‌های تازه:

  1. delayMicroseconds(10); — سنسور دقیقاً پالس ۱۰ میکروثانیه‌ای می‌خواهد؛ delay میلی‌ثانیه کار می‌کند و برای این مقیاس مناسب نیست.
  2. pulseIn(echoPin, HIGH, 26000); — آرگومان سوم «تایم‌اوت» است: اگر صدا در این مدت برنگشت، تابع ۰ برمی‌گرداند. ۲۶۰۰۰ میکروثانیه حدود مسیر رفت‌وبرگشت ۴ متری صوت است؛ یعنی بیش از بازهٔ کاری سنسور منتظر نمی‌مانیم و برنامه قفل نمی‌شود.
  3. unsigned long duration — همان نکتهٔ درس متغیرها: زمان در میکروثانیه با int دو بایتیِ Uno سرریز می‌کند.
  4. ضریب 0.034 و تقسیم بر ۲ دقیقاً همان فرمول بخش قبل است.

اگر جسمی حدود ۲۳ سانتی‌متر جلوی سنسور باشد، خروجی سریال مانیتور هر نیم‌ثانیه چنین است:

خروجی کد

Distance: 23 cm Distance: 23 cm

جسم را نزدیک و دور کنید تا عدد عوض شود؛ اگر چیزی در بازه نباشد، خط Out of range چاپ می‌شود.

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

نشانه علت رایج راه‌حل
فاصله همیشه ۰ است TRIG و ECHO به یک پین وصل شده یا جابه‌جا شده‌اند سیم‌کشی را با جدول چک کنید؛ TRIG خروجی آردوینو و ECHO ورودی آن است
همیشه Out of range یا بیشینه جسم خارج از زاویهٔ ۱۵ درجه یا سطح جنبندهٔ صوت نیست هدف را مقابل سنسور و زاویه‌دار نگیرید؛ سطح صاف و سفت انتخاب کنید
اعداد پرش‌دار و ناپایدار سطح نرم (پارچه، اسفنج) صوت را جذب می‌کند یا چند جسم در زاویه‌اند جسم سفت و تخت بگیرید و میانگین چند اندازه‌گیری بگیرید
خواندن تا سقف اما بعد Out of range عبور از بازهٔ ۴۰۰ سانتی‌متر طبیعی است؛ بازهٔ این سنسور همین است
عدد ثابت بی‌ربط سیم ECHO شل است اتصال بردبورد را سفت کنید

تمرین‌ها

تمرین

تمرین ۱ — هشدار فاصله با LED

به مدار یک LED با مقاومت ۲۲۰ اهم روی پین ۷ اضافه کنید. برنامه طوری تغییر کند که اگر فاصلهٔ اندازه‌گیری‌شده کمتر از ۱۰ سانتی‌متر باشد LED روشن شود، در غیر این صورت خاموش بماند، و پیام Warning: too close هم در مانیتور چاپ شود.

نمایش راه‌حل

کافی است پس از محاسبهٔ فاصله یک شرط بگذارید؛ بخش loop اسکچ به این شکل تغییر می‌کند (تعریف ledPin و pinMode در setup فراموش نشود):

cpp
const int ledPin = 7;

// in setup(): pinMode(ledPin, OUTPUT);

// in loop(), after computing distance_cm:
if (distance_cm > 0 && distance_cm < 10) {
  digitalWrite(ledPin, HIGH);
  Serial.println("Warning: too close");
} else {
  digitalWrite(ledPin, LOW);
}

اگر جسم در ۸ سانتی‌متری باشد، خروجی سریال مانیتور چنین است:

خروجی کد

Distance: 8 cm Warning: too close

::: :::

خلاصه

  • HC-SR04 با پالس صوتی ۴۰ کیلوهرتزی کار می‌کند؛ طول حالت HIGH پین ECHO زمان رفت‌وبرگشت صوت است.
  • فاصله از فرمول duration * 0.034 / 2 به‌دست می‌آید: 0.034 سانتی‌متر بر میکروثانیه ضریب سرعت صوت و تقسیم بر ۲ برای مسیر دوطرفه.
  • بازهٔ کاری حدود ۲ تا ۴۰۰ سانتی‌متر است و زیر ۲ سانتی‌متر ناحیهٔ کور قرار دارد.
  • pulseIn با آرگومان تایم‌اوت (اینجا ۲۶۰۰۰ میکروثانیه) از قفل‌شدن برنامه در نبود پژواک جلوگیری می‌کند.
  • سطح‌های نرم و اجسام خارج از زاویهٔ ۱۵ درجه اندازه‌گیری را خراب می‌کنند؛ میانگین‌گیری راه‌حل حرفه‌ای است.

حالا اندازه‌گیری دقیق فاصله را دارید؛ در درس بعدی با سنسور PIR حرکت را تشخیص می‌دهید — نه «چقدر دور»، بلکه «آیا اتفاقی افتاده».

منابع و ارجاع‌ها

درس‌های مرتبط