این مطلب بخش پنجم از آموزش جامع آردوینو (مبتدی و پیشرفته) است. در این آموزش با سنسور فاصلهسنج التراسونیک (Ultrasonic) یا فراصوت آشنا شده و خواهید توانست فاصله اجسام خارجی تا سنسور را به کمک آردوینو اندازهگیری کنید. با سنسور التراسونیک میتوانید کارهای جالبی انجام بدهید. مثلا میتوانید یک ربات مسیریاب ساخته و با سنسور التراسونیک موانع را تشخیص دهید یا اینکه با سنسور التراسونیک ورود اشخاص به منزلتان را زمانی که خودتان حضور ندارید متوجه شوید
قطعات مورد نیاز:
امواج صوتی
سنسور التراسونیک از امواج فراصوتی برای سنجش استفاده میکند. این باعث میشود تا تفاوتی در استفاده از آن در محیط روشن یا تاریک وجود نداشته باشد. موج صوتی یک نوع موج مکانیکی است که معمولا به صورت یک جبهه فشاری حرکت میکند. البته انواع دیگری از امواج مکانیکی نیز وجود دارد که خارج از بحث ماست. ویژگی امواج مکانیکی نیاز به وجود محیط مادی برای انتقال است. این امواج میتوانند در گازها، مایعات یا جامدات منقل شوند. تفاوت مهم محیطهای مختلف در انتشار امواج صوتی، سرعت صوت در آنهاست. هرچه چگالی محیط بیشتر باشد، سرعت انتشار موج صوتی در آن نیز بیشتر خواهد شد. برای مثال، در شرایط یکسان سرعت انتشار موج صوتی در محیط جامد بیشتر از مایع و در محیط مایع بیشتر از گاز است. در ادامه خواهید دید که این موضوع در نحوه استفاده از سنسور التراسونیک اهمیت دارد. موج صوتی میتواند فرکانسهای مختلفی داشته باشد و میتوان بر این اساس آنها را دستهبندی کرد. امواج التراسونیک یا فراصوت دستهای از امواج صوتی است که فرکانس آن بالاتر از محدوده شنوایی انسان (kHz ٢٠) است.
نحوه عملکرد سنسور التراسونیک
ایده سنسورهای التراسونیک از حیوانات گرفته شده است. دلفین و خفاش موجوداتی هستند که توانایی انتشار و شنیدن امواج التراسونیک را دارند و از این قابلیت برای تخمین فاصله خود تا موانع و اشیا استفاده میکنند. خفاش چشمهای ضعیفی دارد اما از امواج التراسونیک مثل یک رادار پیشرفته استفاده میکند و با آن میتواند محیط اطرافش را حتی در تاریکی مطلق شناسایی کند.
همین کار توسط سنسور التراسونیک انجام میشود. بر روی این ماژول دو قسمت استوانهای شکل دیده میشود. توسط یکی از این دو قسمت یک موج التراسونیک با فرکانس kHz ٤٠ ارسال میشود. این موج در هوا حرکت کرده و در صورت برخورد به یک جسم خارجی بازتابیده شده و به سمت سنسور بر میگردد. قسمت دوم ماژول وظیفه دریافت موج بازتابیده را بر عهده دارد. بر روی این بخش یک قطعه پیزوالکتریک حساس به ارتعاش وجود دارد. برخورد یک موج التراسونیک به این قطعه باعث به وجود آمدن یک ولتاژ الکتریکی در آن میشود.
اگر به پشت سنسور التراسونیک توجه کنید، سه تراشه وجود دارد. یکی سیگنال التراسونیک را تولید کرده، دیگری سیگنال التراسونیک را دریافت کرده و تراشه سوم دادههای آنالوگ را به دیجیتال تبدیل کرده و به میکروکنترلر میفرستد.
زمانی که طول میکشد تا موج از فرستنده ارسال شده به مانع برخورد کرده و توسط سنسور دریافت شود مبنای اندازهگیری فاصله بین سنسور تا مانع است. طبق رابطه زیر سرعت برابر است با فاصله طی شده تقسیم بر زمان. بنابراین با داشتن سرعت صوت در هوا میتوانیم فاصله را حساب کنیم:
از آنجایی که زمان اندازهگیری شده از سنسور التراسونیک، زمان رفت و برگشت موج است، برای محاسبه فاصله باید نصف این زمان در نظر گرفته شود:
انواع سنسور التراسونیک
اگر نگاهی به محصولات التراسونیک در بازار بیاندازید، چندین نوع سنسور پیدا میکنید. نمونههایی مانند HC-SR04 ، HC-SR05 ، SRF06 ، US-100 و JSN-SRF04T . نحوه کارکرد این سنسورها تقریبا یکسان است و تفاوت آنها عمدتا به میزان دقت، محدوده کاری، ضد آب بودن و غیره مربوط میشود. پرکاربردترین سنسور التراسونیک ماژول HC-SR04 است که یک سنسور ارزان قیمت و با دقت مناسب است. محدوده کاری این سنسور cm ٢ تا m ٤ و دقت آن cm ٠.٥ است.
راهاندازی اولیه سنسور التراسونیک
سادهترین روش کار با ماژول التراسونیک ثابت در نظر گرفتن سرعت صوت است. در این حالت معمولا سرعت صوت را چیزی در حدود m/s ٣٣٤ در نظر میگیرند. ابتدا به روش ساده فاصلهسنجی و سپس اندازهگیری فاصله با دقت بالاتر را انجام میدهیم.
ماژول التراسونیک دارای ٤ پایه است. نام هر پایه در کنار آن نوشته شده است. دو پایه VCC و GND ماژول را به 5V و GND آردوینو و پایههای Trig و Echo را به دو پایه دیجیتال (پایه ٢ و ٣ دیجیتال) آردوینو وصل کنید. پایه Trig ورودی ماژول است و فرمان ارسال موج التراسونیک به آن وارد میشود. پایه Echo خروجی ماژول است و به موج دریافتی از محیط حساس است.
در نرمافزار آردوینو پایه Trig را به عنوان خروجی و Echo را به عنوان ورودی تعریف کنید. دستور مهمی که باید در این بخش معرفی کنیم، دستور pulseIn است. با استفاده از این دستور در آردوینو میتوانید طول زمانی یک پالس که به پین آردوینو وارد میشود را اندازه بگیرید. مدت زمان محاسبه شده توسط pulseIn بر حسب میکروثانیه است. در صورتی که سیگنالی که میخواهید اندازه بگیرید، یک پالس با سطح ولتاژ High است (یعنی قبل از به وجود آمدن پالس، سیگنال Low است) در دستور pulseIn عبارت LOW و در صورتی که سیگنالی که میخواهید اندازه بگیرید، یک پالس با سطح ولتاژ Low است (یعنی حالت قبل از به وجود آمدن پالس، سیگنال High است) در دستور pulseIn عبارت HIGH را وارد کنید. برای مثال:
time=pulseIn(pin,HIGH)
یا این چنین
time=pulseIn(pin,LOW)
برای ارسال یک موج التراسونیک جهت اندازهگیری فاصله باید به مدت µs ١٠ پایه Trig را فعال کنید. علت این مقدار این است که برای دستور pulseIn پالس مورد نظر باید حداقل μs ١٠ عرض داشته باشد. با این کار ٨ پالس التراسونیک با فرکانس kHz ٤٠ به محیط ارسال میشود. این طول زمانی به اندازهای کوتاه است که تاثیر چندانی در دقت اندازهگیری ندارد. جهت اطمینان از صحت ارسال موج، قبل از فرمان انتشار موج، برای یک مدت کوتاه پایه Trig را Low کنید. پس از ارسال پالس، یلافاصله دستور pulseIn را بر روی پین Trig اجرا کنید تا اندازهگیری زمان شروع شود. از آنجایی که میدانیم که محدوده کاری این سنسور بین ٢ تا ٤٠٠ سانتیمتر است، مقادیر خارج از این محدوده دقیق نبوده و آنها را حذف کنید. قبل از اینکه کد ما را ببینید، سعی کنید خودتان برنامه راهاندازی سنسور التراسونیک را در آردوینو بنویسید. بعد از آن برنامه ما را با کد خودتان مقایسه کنید.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#define trigger 2
#define echo 3
void setup()
{
Serial.begin(9600);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}
void loop()
{
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
float time = pulseIn(echo, HIGH);
float velocity = 334;
float distance = ((time / 2) * velocity) * 0.0001; // conversion to cm
if (distance >= 2 && distance <= 400)
{
Serial.print("Distance= ");
Serial.println(distance);
}
else
{
Serial.println("Out of range");
}
delay(1000);
}
راه اندازی سنسور التراسونیک با دقت بالا
همان طور که پیشتر نیز گفته شد مشخصات محیط مخصوصا چگالی آن، در سرعت انتشار امواج صوتی اثرگذار است. سرعت انتشار صوت تحت شرایط خاصی معمولا برابر با m/s ٣٣٤ در نظر گرفته میشود. این مقدار معمولا چندان تغییر نمیکند اما اگر بخواهید یک اندازهگیری دقیق داشته باشید، بهتر است که اثر عوامل مختلف بر سرعت صوت را در نظر بگیرید. مهمترین این عوامل، دما و رطوبت نسبی موجود در هوا هستند که به نوبه خود بر چگالی هوا اثر میگذارند. نحوه تاثیر این عوامل بر سرعت صوت با استفاده از آزمایش بررسی شده و نهایتا رابطهای بین سرعت صوت با دما و رطوبت هوا به دست آمده است که دقت نسبتا خوبی دارد. با داشتن این رابطه میتوانید سرعت صوت در هوا را به دست آورید:
که در آن v سرعت صوت در هوا، T دمای هوا بر حسب درجه سلسیوس و RH رطوبت نسبی هوا است. نحوه اتصال ماژول التراسونیک مانند حالت قبل است. برای محاسبه سرعت صوت لازم است تا دما و رطوبت هوا را اندازه بگیریم. به این منظور از سنسور اقتصادی و نسبتا دقیق DHT22 استفاده کردهایم. این سنسور ٤ پایه دارد که اگر قسمت شبکهای آنرا روبروی خود بگیرید، پایههای آن از سمت چپ به ترتیب VCC، Data، آزاد و GND است. دقت کنید که پایه سوم به جایی وصل نمیشود. پایههای VCC و GND را به 5V و GND آردوینو و Data را به یک پایه دیجیتال (پایه ٧ دیجیتال) وصل کنید. همچنین این پایه را با یک مقاومت kΩ ١٠ به سر مثبت مدار وصل کنید. اگر میخواهید در مورد این سنسور بیشتر بدانید، پیشنهاد میکنم معرفی و راهاندازی سنسورهای دما و رطوبت را مطالعه کنید.
برنامه آردوینو نسبت به حالت قبل چند تفاوت جزئی دارد. اول اینکه باید کتابخانه dht را فراخوانی کرده و میزان دما و رطوبت را اندازه بگیرید. دوم اینکه رابطه سرعت صوت را بر حسب دما و رطوبت بنویسید. رابطه سرعت صوت را در این برنامه به صورت یک عبارت با استفاده از دستور define تعریف کردهایم هرچند که میتوانستید این رابطه را در حلقه loop نیز تعریف کنید.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#define trigger 2
#define echo 3
#define velocity 331.4 + temperature * 0.606 + humidity * 0.0124
#include <dht.h>
dht DHT;
#define DHT22_PIN 7
void setup()
{
Serial.begin(9600);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}
void loop()
{
DHT.read(DHT22_PIN);
float temperature = DHT.temperature;
float humidity = DHT.humidity;
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
float time = pulseIn(echo, HIGH);
float distance = ((time / 2) * velocity) * 0.0001; //conversion to cm
if (distance >= 2 && distance <= 400)
{
Serial.print("Distance= ");
Serial.println(distance);
}
else
{
Serial.println("Out of range");
}
delay(1000);
}
نتیجهگیری
در این آموزش با نحوه عملکرد سنسور التراسونیک آشنا شدید و توانستید به کمک این سنسور و آردوینو، فاصله اجسام را اندازه بگیرید. یکی از مزایای کار با آردوینو، عملکرد ماژولار آن در کنار سنسورها و عملگرهای مختلف است. این یعنی که با وجود تعدادی ماژول مختلف میتوانید بینهایت پروژه جالب و کاربردی تعریف کرده و بسازید. هر کدام از ماژولها یک عمل خاص را انجام میدهد اما اینکه کل سیستم چه کاری انجام دهد کاملا بستگی به خلاقیت و ابتکار شما دارد.
در آموزش بعدی، نحوه راهاندازی و کار با ماژولهای کیپد و JoyStick را خواهید آموخت. نظرات شما باعث بهبود محتوای آموزشی ما میشود. اگر این آموزش را دوست داشتید، همینطور اگر سوالی در مورد آن دارید، از شنیدن نظراتتان خوشحال خواهیم شد.