یکی از سنسورهای پرکاربرد در هوشمندسازی و اتوماسیون، حسگر اولتراسونیک تشخیص فاصله است. این حسگر با ارسال و دریافت موج فراصوت و اندازه‌گیری مدت زمان رفت و برگشت، تخمین فاصله را امکان‌پذیر می‌کند و کاربردهای بسیار زیادی دارد به خصوص که جزو سنسورهای ارزان‌قیمت است. در امور کنترلی که دقت بالا مطرح نیست، می‌توانید از Ultrasonic استفاده کنید.

در این مقاله با شیوه‌ی استفاده از سنسور تشخیص فاصله‌ی اولتراسونیک و یک مدار ساده که فاصله را روی LCD گرافیکی کوچکی نمایش می‌دهد، در خدمت شما هستیم. زاگرس رباتیک را دنبال کنید.

آشنایی با طرز کار سنسور تشخیص فاصله اولتراسونیک

حسگرهای تشخیص فاصله مشخصات و کارکردهای متفاوتی دارند. Ultrasonic Rangefinder یا سنسور تشخیص فاصله‌ی اولتراسونیک، یک فرستنده‌ی فراصوت و یک گیرنده دارد. موج فراصوت به جسمی که روبروی سنسور قرار گرفته برخورد کرده و برمی‌گردد. مدت زمان رفت و برگشت نشان می‌دهد که فاصله چقدر است.

جالب است بدانید که خفاش‌ها هم از همین روش برای تخمین مسافت اجسام پیرامون استفاده می‌کنند.

برای محاسبه کردن فاصله نیاز به یک برنامه‌ی ساده دارید که بورد آردوینو آن را اجرا می‌کند. پس از تخمین مسافت می‌توانید اکچوئیتورهای مختلف که در ربات یا ماشین در نظر گرفته‌اید را فعال کنید و فرآیند کنترلی موردنظر را عملیاتی کنید.

در ویدیوی زیر شیوه‌ی کارکرد سنسور اولتراسونیک را مشاهده می‌کنید:

در این مدار ساده، هر چه مانع به سنسور اولتراسونیک نزدیک‌تر می‌شود، تعداد LEDهای روشن‌شده بیشتر می‌شود. البته هدف با کمی تغییر می‌توانید فاصله را روی LCD چاپ کنید یا به شکلی دیگر از سنسور اولتراسونیک استفاده کنید.

برای ساخت این مدار به موارد زیر نیاز است:

بورد Arduino UNO

سنسور تشخیص فاصله از نوع اولتراسونیک

۳ عدد دیود نوری یا LED

چند مقاومت دلخواه از ۱۰۰ اهم الی ۱۰۰۰ اهم

تعدادی سیم

برد بورد

کابل USB برای اتصال آردوینو به کامپیوتر

مدار لامپ‌های LED

طبق معمول ولتاژ ۰ یا GND که زمین مدار است را به یکی از لاین‌های کناری برد بورد متصل کنید و ولتاژ ۵ ولت را نیز به لاین کناری آن. منظور دو سیم مشکی و قرمز است که از پایین بورد آردوینو به برد بورد متصل شده است. از این دو لاین برای تغذیه کردن قطعات الکترونیکی استفاده می‌شود.

گام بعدی متصل کردن لامپ‌های LED است. یک پایه‌ی لامپ‌ها به مقاومت و سر دیگر مقاومت به زمین مدار یا ولتاژ ۰ متصل می‌شود. پایه‌ی دیگر LEDها را به پین‌های ۲ و ۳ و ۴ آردوینو متصل کنید. در این مثال از مقاومت ۲۲۰ اهم استفاده کرده‌ایم اما هر مقاومت دیگری که بین ۱۰۰ الی ۱۰۰۰ اهم باشد، مناسب است.

اتصال سنسور اولتراسونیک تشخیص فاصله به Arduino

سنسور اولتراسونیک مثال ما، دارای ۳ پایه است. البته سنسورهای اولتراسونیک تشخیص فاصله متنوعی در بازار موجود است و برخی ۳ و برخی ۴ پین دارند. ۲ مورد از پایه‌ها به زمین مدار و ولتاژ ۵ ولت متصل می‌شود و در واقع برای تأمین توان الکتریکی موردنیاز کاربرد دارد.

در سنسورهای اولتراسونیک ۴ پینه، به جز ۲ پین تغذیه، ۱ پین دیگر برای ارسال سیگنال و ۱ پین دیگر برای دریافت سیگنال وجود دارد. در مدل‌هایی با ۳ پین، در واقع پین ارسال و دریافت موج فراصوت ترکیب شده است. 

شیوه‌ی اتصال به بورد آردوینو ساده است: در مدل‌های ۳ یا ۴ پین، همواره دو پین به ریل + و - مدار یا همون 0 و 5 ولت متصل می‌شود. پین بعدی که پین SIG یا TRIG را به پین شماره ۷ آردوینو متصل کنید و اگر پین ECHO نیز وجود دارد، آن را به پین شماره ۶ آردوینو متصل نمایید.

آموزش کار با حسگر اولتراسونیک تشخیص فاصله و آردوینو در تخمین فاصله و کنترل

نمودار بلوکی کدنویسی سنسور اولتراسونیک

در این مثال بازه‌های فاصله‌ی مختلفی تعریف شده و در هر بازه، LEDهایی که روشن می‌شود متفاوت است. اولین مرز با متغیر distanceThreshold مشخص می‌شود. برای ذخیره کردن خروجی سنسور نیز از متغیر cm استفاده می‌کنیم که در واقع همان سانتی‌متر است. در صورت نیاز می‌توانید فواصل را بر ۲.۵۴ تقسیم کنید تا سانتی‌متر به اینچ تبدیل شود. بد نیست برای مانیتور کردن خروجی کد، از مانیتور سریال استفاده کنید. البته اگر مداری با LCD‌ بسته باشید، طبعاً مشاهده کردن اعداد و ارقام ساده می‌شود.

برای روشن کردن هر یک از LEDها، می‌بایست فاصله اندازه‌گیری شود و با عددی مقایسه شود. با عبارت شرطی if cm > distanceThreshold، بررسی می‌کنیم که آیا فاصله از اولین حد مرزی کمتر است یا خیر. باید چند شرط تعریف کرد و در هر شرط، روشن شدن یا نشدن LEDها را بررسی کرد. در حالتی که فاصله بسیار زیاد است، هیچ لامپی روشن نمی‌شود. اگر فاصله از اولین مرز کمتر شود، یکی از LEDها روشن می‌شود. دو شرط بعدی برای روشن شدن دو LED بعدی است.

در این مثال حد مرزی دوم، ۱۰۰ سانتی‌متر از اولی کمتر است و حد مرزی بعدی را ۲۵۰ سانتی‌متر کمتر از حد مرزی اول در نظر گرفته‌ایم.

آموزش کار با حسگر اولتراسونیک تشخیص فاصله و آردوینو در تخمین فاصله و کنترل

نمونه کد سنسور اولتراسونیک تشخیص فاصله

اولین بخش کد، تعریف کردن متغیرها است. متغیر اینتیجر یا عدد صحیح distanceThreshold، حد مرزی فاصله را مشخص می‌کند. متغیر cm نیز فاصله است. در صورت نیاز به فواصل اینچی، می‌توانید متغیر inches هم در برنامه استفاده کنید.

int distanceThreshold = 0;
int cm = 0;
int inches = 0;

در معرفی مقدماتی آردوینو و برنامه‌نویسی آن، به setup() و loop() اشاره کردیم. در برنامه‌های پیچیده‌تر و طولانی‌تر، برای منظم و بهتر شدن کدنویسی، از توابع هم استفاده می‌شود. در این مثال هم مقوله‌ی محاسبه کردن فاصله با توجه به مدت زمان بین ارسال و دریافت سیگنال را به یک تابع می‌سپاریم. نام تابع را readUltrasonicDistance() گذاشته‌ایم و دستورات آن را در بلوک زیر مشاهده می‌کنید.

اما توضیحاتی در مورد کد فوق:

  • در اولین خط، نوع خروجی تابع مشخص شده که long است و در واقع عددی با بخش اعشاری و ارقام زیاد به برنامه‌ی اصلی برگردانده می‌شود.
  • پس از long، نام تابع ذکر می‌شود.
  • سپس داخل پرانتز آرگومان‌های تابع ذکر می‌شود. با توجه به اینکه قرار است تابع با دو پین تحریک و دریافت سیگنال سروکار داشته باشد، دو متغیر از نوع عدد صحیح به عنوان آرگومان آن تعریف شده است. حین فراخوانی این تابع باید شماره‌ی پین‌های که در مثال ساده‌ی ما عدد ۶ و ۷ است را به تابع بدهیم.
  • در این تابع ابتدا مقدار خروجی پین triggerPin در وضعیت LOW یا ۰ قرار می‌گیرد و پس از مکث ۲ میکروثانیه‌ای، به وضعیت HIGH سوییچ می‌کند و ۱۰ میکروثانیه در این حالت می‌ماند و مجدداً به حالت صفر برمی‌گردد.
  • گام بعدی دریافت سیگنال از پین echoPin است. اگر موج فراصوت برگردد، طبعاً سیگنالی از این پین دریافت می‌شود.
long readUltrasonicDistance(int triggerPin, int echoPin)
{
  pinMode(triggerPin, OUTPUT);  // Clear the trigger
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  // Sets the trigger pin to HIGH state for 10 microseconds
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  pinMode(echoPin, INPUT);
  // Reads the echo pin, and returns the sound wave travel time in microseconds
  return pulseIn(echoPin, HIGH);
}

بخش بعدی برنامه‌ای که باید در بورد آردوینو آپلود شود، بخش ستاپ است. در این بخش وضعیت پین‌های ۲ و ۳ و ۴ مشخص می‌شود که همگی خروجی یا OUTPUT هستند. علاوه بر این برای مانیتورینگ، می‌توانید پورت سریال را راه‌اندازی کنید.

void setup()
{
  Serial.begin(9600);

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

در بخش بعدی برنامه که حلقه یا loop است، حد مرزی فاصله معادل ۳۵۰ سانتی‌متر تعریف شده و در ادامه فرمول محاسبه کردن فاصله با توجه به خروجی تابع readUltrasonicDistance تعریف می‌شود که رابطه‌ی زیر است:

فاصله بر حسب سانتی متر = readUltrasonicDistance(7, 6) × 0.01723 

لذا بخش اول loop() به این صورت خواهد بود:

void loop()
{
  // set threshold distance to activate LEDs
  distanceThreshold = 350;
  // measure the ping time in cm
  cm = 0.01723 * readUltrasonicDistance(7, 6);

برای مانیتورینگ فاصله بر حسب سانتی‌متر و اینچ از طریق پورت سریال، چند خط اضافی در برنامه اضافه می‌کنیم تا این اعداد مرتباً چاپ شود:

// برای تبدیل سانتی‌متر به اینچ، اعداد را بر ۲.۵۴ تقسیم می‌کنیم
  inches = (cm / 2.54);
  Serial.print(cm);
  Serial.print("cm, ");
  Serial.print(inches);
  Serial.println("in");

در ادامه‌ی حلقه، شرط‌های مقایسه برای روشن کردن لامپ‌ها تعریف می‌شود. در هر بازه‌ی فاصله، باید مشخص کردن که کدام پین‌ها مقدار HIGH داشته باشد و در واقع لامپ مربوطه روشن شود و کدام پین‌ها LOW باشد تا لامپ مربوطه خاموش بماند.

دقت کنید که && در دستور if، همان و منطقی است.

در پایان حلقه فاصله‌ی زمانی تا اجرا شدن مجدد حلقه، ۱۰۰ میلی‌ثانیه در نظر گرفته شده است.

if (cm > distanceThreshold) {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
  }
  if (cm <= distanceThreshold && cm > distanceThreshold - 100) {
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
  }
  if (cm <= distanceThreshold - 100 && cm > distanceThreshold - 250) {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
  }
  if (cm <= distanceThreshold - 250 && cm > distanceThreshold - 350) {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
  }
  if (cm <= distanceThreshold - 350) {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
  }
  delay(100); // Wait for 100 millisecond(s)
}

می‌توانید به راحتی تعداد LEDها را بیشتر کنید و با افزایش تعداد شرط‌ها، وضعیت خاموش و روشنی لامپ‌ها در فواصل مختلف را تعریف کنید.

در نهایت با اتصال کابل USB به کامپیوتر، بورد آردوینو آماده‌ی دریافت کد و اجرا کردن حلقه می‌شود. برنامه را با استفاده از Arduino IDE روی بورد آپلود کنید و مانعی در برابر حسگر اولتراسونیک قرار داده و عقب و جلو ببرید.

حین حرکت دادن دست یا هر مانعی جلوی سنسور، دقت کنید که مقدار دقیق فاصله را در سریال مانیتور چک کنید.

آموزش کار با حسگر اولتراسونیک تشخیص فاصله و آردوینو در تخمین فاصله و کنترل

اگر حدود مرزی که برای روشن و خاموش شدن LEDها در نظر گرفته‌اید، بسیار کم یا زیاد است، می‌بایست حد مرزی و بازه‌ها را در کد تغییر دهید تا حاصل کار مناسب پروژه و دستگاه شما باشد.