آموزش آردوینو جلسه نهم
در جلسه قبل با مدولاسیون پهنای باند یا PWM آشنا شدیم. در این جلسه به راه اندازی ماژول آلتراسونیک میپردازیم.

آلتراسونیک یکی از سنسور هایی است که قابلیت ارسال امواج فراصوت را دارد که توسط انسان قابل احساس نیست. روش کار این سنسور ها به اینگونه است که با ارسال موج فراصوت و با برخورد آن با موانع به سنسور گیرنده بازخورد داده میشود و مدت زمان انعکاس صدا فاصله را مشخص میکند.
به این روش اصطلاحا «پینگ (Ping)» میگویند.
اصطلاح پینگ در شبکه نیز اینگونه است که به مدت زمان ارسال و دریافت اطلاعات از کلاینت به سرور را پینگ میگویند و زمان پایین تر نشانه پینگ کمتر است.
در گیف زیر طریقه پینگ ماژول آلتراسونیک را مشاهده میکنید:

معرفی
ماژول های آلتراسونیک انواع مختلفی دارند و هر کدام نوع متفاوتی دارند؛ برای مثال دقت اندازه گیری، اندازه ماژول، ضد آب (Water Proof) بودن و… عواملی است که در قیمت و کارایی ماژول تاثیر دارند.
مناسب ترین آنها SRF-04 و SRF-05 هستند که دقت قابل قبولی دارند و قیمت آنها نیز مناسب است.
توجه: برای اندازه گیری موانع از فاصله بیشتر از 2 متر به هیچ عنوان آلتراسونیک پیشنهاد نمیشود و بهتر است از فاصله سنج های لیزری استفاده کنید!
از دیگر کاربرد های آلتراسونیک میتوان به سنسور دنده عقب ماشین ها اشاره کرد که به راننده هشدار برخورد با مانع را اعلام میکند.
دزدگیر های هوشمند، عصای سفید، درب رمزدار و… کاربرد های دیگری از Ultra Sonic هستند.

راه اندازی
کد
const int TRIG_PIN = 12;
const int ECHO_PIN = 13;
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN,OUTPUT);
pinMode(ECHO_PIN,INPUT);
}
void loop(){
long duration, distanceCm, distanceIn;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN,HIGH);
distanceCm = duration / 29.1 / 2 ;
distanceIn = duration / 74 / 2;
if (distanceCm <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distanceIn);
Serial.print("in, ");
Serial.print(distanceCm);
Serial.print("cm");
Serial.println();
}
delay(1000);
}
مدار
توضیحات
در این کد از هیچ کتابخانه ای استفاده نمیکنیم زیرا راه اندازی آن بسیار ساده است که توضیحات آن در ادامه ذکر شده است.
در دو خط اول دو متغیر تعریف کرده ایم که پین های متصل به آردوینو را مشخص میکنند. اگر کمی دقت کنید خواهید دید که این دو متغیر همان int
هستند با این تفاوت که این متغیر ها از نوع const
هستند.
این کلمه مخفف constant به معنی ثابت است. کلمه const در اول متغیر ها، خاصیت متغیر بودن را از آنها میگیرد. در این نوع متغیر ها (بهتر است بگوییم ثابت) مقدار آن تغییر نخواهد کرد و درصورتی که بخواهید مقدار آن را تغییر دهید، کامپایلر خطا هایی را در کد میگیرد.
خاصیت استفاده از const در تعریف آرایه ها است. زیرا در #define
نمیتوان هیچ آرایه ای را تعریف کرد. پس بهتر است از این به بعد از const برای تعریف ثابت ها استفاده کنیم.
const int TRIG_PIN = 12;
const int ECHO_PIN = 13;
در خط 14 متغیری از نوع long تعریف کرده ایم. این نوع متغیر از نظر مقدار ذخیره داده، مقدار بیشتری دارد یعنی میتوان اعداد 2,147,483,648- تا 2,147,483,647 را در آن ذخیره کرد.
این متغیر ها را به صورت سری تعریف کردیم. یعنی اگر نوع متغیر ها یکسان بود میتوانیم تمام آنها را با هم تعریف کرد فقط کافیست آنها را توسط یک کاما , جدا کنید.
اگر متغیر ها را در loop تعریف کنید، آنها فقط در loop قابل دسترسی هستند؛ نه setup و نه تابع دیگری. همچنین هربار که تابع loop شروع شود آن متغیر ها دوباره به مقدار اولیه خود بر میگردند!
long duration, distanceCm, distanceIn;
در خطوط 16 تا 22 پین تریگر ماژول آلتراسونیک را تحریک میکنیم. به مدت 2 میکرو ثانیه خاموش و به مدت 10 میکرو ثانیه روشن و پس از آن دوباره خاموش میشود.
این کار امواج فراصوت را از فرستنده آلتراسونیک ارسال میکند:
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
پس از ارسال امواج از طریق فرستنده و برخورد آنها به مانع، امواج منعکس میشوند و به سنسور گیرنده برخورد میکنند و توسط تابع pulseIn پالس ورودی را اندازه میگیریم.
در کد زیر مدت زمانی که پین ECHO_PIN مقدار HIGH را دارد را اندازه گیری میکنیم و در متغیر duration
ذخیره میکنیم.
duration = pulseIn(ECHO_PIN, HIGH);
پس از فهمیدن مدت زمان پینگ میتوان آن را به سانتی متر و اینچ تبدیل کرد. برای این کار duration را بر عدد های 29 (برای سانتی متر) و 74 (برای اینچ) تقسیم میکنیم و سپس حاصل را بر 2 تقسیم میکنیم.
نکته: این اعداد توسط دیتاشیت سنسور ارائه شده اند.
distanceCm = duration / 29.1 / 2;
distanceIn = duration / 74 / 2;
اگر فاصله اندازه گیری شده به هر دلیلی کمتر از صفر شد متن Out of range را در سریال چاپ میکند و در غیر اینصورت فاصله را به واحد های سانتی متر و اینچ در سریال چاپ میکند:
توجه: فاصله وقتی صفر میشود که مانع چسبیده به سنسور باشد و یا فاصله بسیار طولانی باشد یعنی بیش از 2 یا 3 متر.
if (distanceCm <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distanceIn);
Serial.print("in, ");
Serial.print(distanceCm);
Serial.print("cm");
Serial.println();
}
با تشکر از شما که در جلسه نهم ما را همراهی کردید، درصورت داشتن هرگونه سوال، نظر و یا پیشنهاد میتوانید در بخش نظرات بیان کنید.
درباره admin_hb
حسین بذرافکن هستم، برنامه نویس، فریلنسر و عاشق الکترونیک...
نوشته های بیشتر از admin_hb
دیدگاهتان را بنویسید