حسگر فاصلهٔ التراسونیک HC-SR04
حسگر التراسونیک HC-SR04 را با تابع pulseIn به آردوینو وصل میکنید و فاصلهٔ اجسام تا ۴۰۰ سانتیمتر را با محاسبهٔ زمان پژواک اندازه میگیرید.
آنچه در این درس میآموزید
- اصول اندازهگیری فاصله با پالس صوتی و زمان پژواک را توضیح دهید
- فرمول فاصله بر اساس زمان رفتوبرگشت صدا را درک و در کد بهکار ببرید
- فاصلهٔ اجسام را با pulseIn بخوانید و در سریال مانیتور نمایش دهید
فهرست مطالب
روباتها، مخازن آب و سنسورهای پارک خودرو همه به یک چیز نیاز دارند: دانستن فاصله از مانع، بدون لمس آن. حسگر التراسونیک HC-SR04 ارزانترین و پرکاربردترین ابزار این کار است؛ صدایی فراتر از شنوایی انسان میفرستد و از زمان بازگشت آن، فاصله را حساب میکند — همان منطقی که خفاش در تاریکی استفاده میکند. این درس اولین سنسور «اندازهگیر واقعی» شماست و همهٔ مفاهیمش — پالس، زمانسنجی و تبدیل واحد — در سنسورهای بعدی هم تکرار میشود.
اصول کار: فرستادن و گوشدادن
سنسور چهار پین دارد و چرخهٔ کارش سه گام است:
- آردوینو روی پین TRIG یک پالس ۱۰ میکروثانیهای میفرستد تا اندازهگیری شروع شود.
- سنسور یک بستهٔ هشتضربی امواج صوتی با فرکانس ۴۰ کیلوهرتز میفرستد و همزمان پین ECHO را HIGH میکند.
- وقتی صدا پس از برخورد به جسم برمیگردد، پین 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 است: منتظر میماند پین به حالت مشخصی برود، زمانسنجی را شروع میکند و تا برگشت پین به حالت مقابل، مدت را به میکروثانیه برمیگرداند:
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);
}توضیح نکتههای تازه:
delayMicroseconds(10);— سنسور دقیقاً پالس ۱۰ میکروثانیهای میخواهد؛delayمیلیثانیه کار میکند و برای این مقیاس مناسب نیست.pulseIn(echoPin, HIGH, 26000);— آرگومان سوم «تایماوت» است: اگر صدا در این مدت برنگشت، تابع ۰ برمیگرداند. ۲۶۰۰۰ میکروثانیه حدود مسیر رفتوبرگشت ۴ متری صوت است؛ یعنی بیش از بازهٔ کاری سنسور منتظر نمیمانیم و برنامه قفل نمیشود.unsigned long duration— همان نکتهٔ درس متغیرها: زمان در میکروثانیه باintدو بایتیِ Uno سرریز میکند.- ضریب 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 فراموش نشود):
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 حرکت را تشخیص میدهید — نه «چقدر دور»، بلکه «آیا اتفاقی افتاده».