🦇 فاصلهسنج اولتراسونیک HC-SR04 با آردوینو
خفاشها در تاریکی چطور به دیوار نمیخورند؟ صدایی میفرستند که ما نمیشنویم و از روی زمان برگشت پژواکش میفهمند مانع چقدر دور است. سنسور اولتراسونیک HC-SR04 دقیقاً همین کار را میکند. در این آموزش با آن و آردوینو یک فاصلهسنج میسازیم که عدد را به سانتیمتر نشان میدهد و وقتی چیزی نزدیک شد، چراغ هشدار روشن میکند. این پروژه را میتوانی مثل کاربران wokwi در یک شبیه ساز آردوینو آنلاین هم بسازی، این بار به فارسی و رایگان.
سنسور چطور کار میکند؟
- آردوینو یک پالس ۱۰ میکروثانیهای به پایهی Trig میفرستد.
- سنسور هشت موج صوتی ۴۰ کیلوهرتزی پخش میکند.
- پایهی Echo تا وقتی پژواک برگردد HIGH میماند.
- آردوینو مدت HIGH بودن را اندازه میگیرد و با سرعت صوت (حدود ۳۴۳ متر بر ثانیه) فاصله را حساب میکند.
قطعهها و اتصال
- آردوینو Uno
- سنسور اولتراسونیک HC-SR04
- یک LED قرمز با مقاومت ۲۲۰ اهم (برای هشدار)
| قطعه | پایه | آردوینو |
|---|---|---|
| HC-SR04 | VCC | 5V |
| HC-SR04 | Trig | پایهی 9 |
| HC-SR04 | Echo | پایهی 10 |
| HC-SR04 | GND | GND |
| LED | آند (از راه مقاومت) | پایهی 13 |
| LED | کاتد | GND |
کد کامل
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
const int LED_PIN = 13;
const int ALARM_CM = 20; // نزدیکتر از این، هشدار
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// یک پالس تمیز 10 میکروثانیهای
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000); // حداکثر 30 میلیثانیه صبر
if (duration == 0) {
Serial.println("out of range");
digitalWrite(LED_PIN, LOW);
} else {
float cm = duration * 0.0343 / 2;
Serial.print("distance:");
Serial.println(cm);
digitalWrite(LED_PIN, cm < ALARM_CM ? HIGH : LOW);
}
delay(100);
}
توضیح خطهای مهم
- پالس Trig: اول دو میکروثانیه LOW میکنیم تا مطمئن شویم پالس از صفر شروع میشود، بعد ده میکروثانیه HIGH. این همان «فرمان شلیک» سنسور است.
pulseIn(ECHO_PIN, HIGH, 30000): صبر میکند تا Echo بالا برود و مدت بالا ماندنش را به میکروثانیه برمیگرداند. عدد سوم مهلت است؛ اگر تا ۳۰ میلیثانیه پژواکی نیاید، صفر برمیگرداند و برنامه گیر نمیکند.duration * 0.0343 / 2: صوت در هر میکروثانیه حدود ۰٫۰۳۴۳ سانتیمتر میرود. تقسیم بر ۲ چون صدا رفته و برگشته است. یعنی هر ۵۸ میکروثانیه تقریباً یک سانتیمتر.cm < ALARM_CM ? HIGH : LOW: یک if کوتاه. اگر فاصله کمتر از ۲۰ سانتیمتر بود LED روشن، وگرنه خاموش.distance:با این قالب، در زبانهی نمودار سریال شبیهساز یک منحنی زنده از فاصله میبینی.
اجرا در شبیهساز، رایگان
سنسور اولتراسونیک در تینکرکد فارسی جزو قطعههای همیشهرایگان است. مثال آمادهی فاصلهسنج را باز کن؛ در شبیهساز میتوانی فاصلهی جسم جلوی سنسور را تغییر بدهی و عدد سریال مانیتور را ببینی. درس کامل این پروژه درس ۲۴: فاصلهسنج جادویی است و نسخهی پیشرفتهترش با بوق، سنسور پارک.
اشکالهای رایج
- همیشه صفر یا out of range: Trig و Echo را جابهجا وصل کردهای، یا سنسور برق ندارد. VCC باید ۵ ولت باشد.
- عددها بالا و پایین میپرند: چند اندازهگیری بگیر و میانگینشان را حساب کن، یا بین اندازهگیریها حداقل ۶۰ میلیثانیه فاصله بگذار تا پژواک قبلی تمام شود.
- عدد همیشه حدود دو برابر است: تقسیم بر ۲ را فراموش کردهای.
- عدد اعشاری خیلی کوچک یا صفر: اگر
cmراintتعریف کنی یا تقسیم را با عددهای صحیح بنویسی، اعشار از دست میرود. - برنامه کند است: بدون مهلت سوم در
pulseIn، وقتی جلوی سنسور خالی است تا یک ثانیه منتظر میماند.
عدد فاصله را روی نمودار ببین: سریال مانیتور و نمودار سریال. یا آن را به سروو وصل کن و یک رادار بساز: سروو موتور با آردوینو. همهی پروژهها در صفحهی شبیهساز آردوینو هستند.
فاصلهسنج را رایگان اجرا کن 🦇