آموزش راه اندازی سنسور فاصله سنج التراسونیک MaxBotix MB1240 با آردوینو

آموزش راه اندازی سنسور فاصله سنج التراسونیک MaxBotix MB1240  با آردوینو

سنسور MB1240 XL-MaxSonar-EZ4، یک سنسور فاصله‌سنج التراسونیک با عملکرد بالا و برد قابل اندازه‌گیری 20 تا 765 سانتی‌متر است. درصورتی­که به فیلتر نویز بهتر و قابلیت اطمینان بیشتری نیاز دارید، این یک جایگزین عالی برای HC-SR04 است. اگرچه این آموزش برای MB1240  نوشته شده‌است، اما می­توان از آن برای سایر سنسورهای MaxBotix نیز استفاده کرد. در این آموزش، نحوه عملکرد و راه اندازی سنسور فاصله سنج التراسونیک MaxBotix با آردوینو را خواهید آموخت.

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

پس از هر مثال، به تحلیل عملکرد کد مربوطه خواهیم پرداخت، بنابراین می‌توانید متناسب با نیاز خود آن را تغییر دهید.

موارد مورد نیاز

قطعات سخت افزاری

نرمافزار

برای راه اندازی سنسور فاصله سنج التراسونیک با آردوینو به نرم­‌افزار Arduino IDE نیاز خواهید داشت.

یک سنسور التراسونیک چگونه کار می­کند؟

یک سنسور فاصله‌سنج التراسونیک با ارسال امواج فراصوت، فاصله‌ی اشیاء را تشخیص می‌دهد. این امواج توسط شیء منعکس شده و سنسور التراسونیک آن‌ها را تشخیص می­دهد. با اندازه‌گیری مدت زمان بین ارسال و دریافت امواج صوتی، می­توان فاصله سنسور و شیء را طبق رابطه‌­ی زیر محاسبه کرد. به طوری‌که در این رابطه، منظور از سرعت، سرعت امواج صوتی بر حسب سانتی‌متر بر میکروثانیه و منظور از زمان، مدت زمان بین ارسال و دریافت امواج صوتی بر حسب میکروثانیه است. توجه داشته‌­باشید که باید حاصل‌­ضرب را بر دو تقسیم کنید. این به این دلیل است که امواج صوتی از سنسور به شیء و از شیء به سنسور برمی­گردند. بنابراین فاصله بین سنسور و شیء تنها نیمی از فاصله‌ای است که امواج صوتی طی می‌کنند.

2/( زمان (میکروثانیه) × سرعت (سانتی متر بر میکروثانیه)) = فاصله (سانتی متر)

نحوه‌ی کار و عملکرد سنسورهای فاصله سنج التراسونیک
اصول کار سنسورهای فاصله‌سنج التراسونیک

سنسور MB1240 XL-MaxSonar-EZ4، یک سنسور فاصله‌سنج التراسونیک ساخته شده توسط شرکت MaxBotix Inc است. MaxBotix تولید‌کننده‌ای در ایالات متحده است که در ساخت سنسورهای التراسونیک تخصص دارد. آن­‌ها سنسورهایی برای کاربردهای مختلف، چه برای استفاده در فضای بسته و چه در فضای باز، می­سازند. MB1240 یکی از محبوب‌­ترین سنسورهای آن‌­هاست و برای استفاده در حوزه‌ی رباتیک ایده‌آل است.

 خانواده‌ی XL-MaxSonar-EZ تحمل بالایی در برابر نویزهای الکتریکی یا صوتی دارند. این بدان معناست که شما می‌توانید از آن برای کاربردهای رباتیک همراه با چندین موتور و سروو استفاده کنید.

حداکثر برد سنسور MB1240 که در این آموزش استفاده شده، 765 سانتی‌متر است و رزولوشن 1 سانتی‌­متر را ارائه می­دهد. همچنین سنسورهایی با رزولوشن 1 میلی­‌متر (HRLV-MaxSonar-EZ) و نرخ تازه‌­سازی (Refresh Rate) بالاتر (LV-MaxSonar-EZ) نیز به فروش می‌رسند. علاوه‌براین، سنسورهای سری HR دارای جبران‌ساز دمای داخلی هستند.

مشخصات سنسور TM1240 XL-MaxSonar-EZ4

ولتاژ تغذیه  5.5 – 3.3 ولت
جریان مصرفی3.4 میلی‌آمپر (حداکثر 100 میلی‌آمپر)
فاصله‌ی قابل اندازه‌گیری765 – 20*(0) سانتی‌متر
رزولوشن1 سانتی‌متر
فرکانس42 کیلوهرتز
نرخ خواندن10 هرتز
خروجی سنسورولتاژ آنالوگ، پهانای پالس،  RS232
ابعاد25.11×19.9×22.1 میلی‌متر
دمای کاری65 – 0  درجه‌ی سانتی‌گراد
ویژگی‌هاکوچک، سبک، پرتو باریک، کالیبراسیون خودکار (ولتاژ، رطوبت، نویز محیط)، استفاده‌ی آسان
کشور سازندهUSA

* سنسور اجسام نزدیک­تر از 20 سانتی‌متر را در محدوده 20 سانتی‌متر شناسایی می­‌کند.

خروجی­‌های سنسور MaxBotix

همانطورکه در جدول مشخصات مشاهده کردید، سنسورهای MaxBotix خانواده‌­ی MaxSonar خروجی‌های متفاوتی دارند: ولتاژ آنالوگ، پهنای پالس و سریال RS232 (سنسورهای مبتنی بر پروتکل I2C نیز موجود هستند). در این آموزش هر دو خروجی ولتاژ آنالوگ و پهنای پالس را بررسی خواهیم کرد.

ولتاژ آنالوگ

ساده‌ترین راه برای خواندن فاصله اندازه‌گیری شده از سنسور، به دست­ آوردن ولتاژ خروجی آنالوگ سنسور است. این ولتاژ، یک ولتاژ خطی است که مقدار آن با دور شدن هدف از سنسور افزایش می‌یابد.

به دست­ آوردن ولتاژ خروجی آنالوگ سنسور که با دور شدن از هدف افزایش میابد.
ولتاژ خروجی آنالوگ سنسور

می‌توانیم این خروجی را با میکروکنترلری مانند آردوینو خوانده و با ضرب کردن آن در یک ضریب مقیاس ثابت، فاصله را محاسبه کنیم ( این ضریب به نوع سنسور بستگی دارد که می­توانید مقدار آن را در دیتاشیت سنسور مشاهده کنید).

پهنای پالس سنسور فاصله سنج MaxBotix

گزینه دیگر، استفاده از خروجی پهنای پالس است. این پایه، پهنای پالسی که بیانگر فاصله است را به عنوان خروجی نشان می­دهد. می‌توانید از تابع ()pulseIn در کد آردوینو، برای خواندن طول این پالس خروجی برحسب میکروثانیه استفاده کنید. برای به­ دست آوردن فاصله، باید این مقدار را در یک ضریب مقیاس ثابت ضرب کنید. ضریب ثابت MB1240(XL-MaxSonar) با توجه به دیتاشیت آن 58 میکروثانیه بر سانتی‌­متر می‌باشد. بنابراین می­‌توانید به سادگی TOF، را بر 58 تقسیم کنید تا فاصله را بر حسب سانتی‌­متر به‌دست آورید.

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

مقایسه MaxBotix MB1240 با HC-SR04

هنگام خرید یک سنسور فاصله‌سنج التراسونیک، احتمالاً با HC-SR04 محبوب نیز برخورد کرده‌اید! این سنسور ارزان قیمت توسط بسیاری از سازندگان چینی ساخته می­شود. HC-SR04 و MB1240 هر دو بر اساس یک اصل مشابه عمل می­کنند، اما برخی تفاوت‌­های کلیدی (در کیفیت و قیمت) باهم دارند.

اولین چیزی که توجه شما را به خود جلب می­کند، تفاوت ابعاد آن­هاست. MaxBotix MB1240 تنها از یک مبدل التراسونیک برای ارسال و دریافت امواج صوتی استفاده می­کند، درحالی‌که HC-SR04 از دو مبدل التراسونیک استفاده می­کند، بنابراین MB1240 ابعاد بسیار کوچک‌تری دارد. همچنین نصب سنسور HC-SR04 می­تواند دشوار باشد و اغلب به پیچ­‌های کوچکی نیاز دارد، درحالی که MB1240 دارای دو سوراخ برای پیچ‌­های M3 است.

از جمله مزایای اصلی سنسورهای MaxBotix می­توان به کالیبراسیون خودکار، زاویه پرتو کوچک، تحمل نویز بالا، و فیلترینگ داخلی آن اشاره کرد.

سنسور MB1240 دارای یک پرتو بسیار باریک در سراسر محدوده اندازه‌­گیری خود (برای اشیاء بزرگ) است که آن را برای موقعیت‌یابی دقیق یک اتاق (ربات‌های تشخیص مانع) ایده‌آل می‌کند، به این معنا که از اجسام نزدیک به سنسور، بازتاب اولیه دریافت نخواهید کرد. HC-SR04 دارای پرتویی به شکل مخروط 3 بعدی 15درجه است که شما نمی‌توانید اشیایی را که از حسگر دور هستند به دقت اندازه‌گیری کنید. پرتو بسیار گسترده است و تنها  اجسامی را که به سنسور نزدیک‌تر هستند، تشخیص می‌دهد. علاوه‌براین، عملکرد مداوم سنسورها و خروجی آنالوگ آن‌ها جالب است. خروجی آنالوگ پروگرام کردن سنسورها را بسیار آسان می‌کند. این ویژگی‌ها همگی بسیار خوب هستند، اما توجه داشته باشید که قیمت این سنسورها نیز کمی بالاتر از سنسورهای چینی است. در مجموع، اگر به دنبال یک سنسور قابل اطمینان با کیفیت بالا هستید، سنسورهای MaxBotix می­توانند گزینه خوبی باشند. جدول زیر مقایسه‌­ی بین این دو سنسور را نشان می­دهد.

جدول مقایسه MB1240 با HC-SR04

مشخصاتMB1240HC-SR04
ولتاژ کاری5.5-3.3V5v
جریان کاری3.4mA average (100mA peak)15mA
محدوده اندازه گیری765-20cm2-400cm
رزولوشن(وضوح)1cm3mm <
الگوی پرتوبه شکل 1 مراجعه شود15°cone
فرکانس42kHz40kHz
خروجی سنسورولتاژ آنالوگ، پهنای پالس، پروتکل 232پهنای پالس
ابعاد22.1x 19.9 x 25.11mm45x 20 x 15 mm
جبران کننده درجه حرارتخیرخیر
فیلترینگبلهخیر
کالیبراسیون خودکار برخطبلهخیر
مقاوم در برابر نویزبالاپایین
سازندهUSAChina
* لازم به ذکر است که سرعت صوت به شدت به دما و رطوبت هوا بستگی دارد. به طوری‌که سرعت صوت در هوا به ازای هر درجه‌ی سانتی‌گراد، حدود 0.6 متر در هر ثانیه افزایش می­یابد.

هیچ­‌یک از سنسورهای HC-SR04 و MB1240 از جبران‌­ساز تغییر دما در حین اندازه‌گیری پشتیبانی نمی‌کنند. سنسورهای XL-MaxSonar و LV-MaxSonar دمای هوا را 22.5 درجه سانتی‌گراد فرض می­کنند. سنسورهای سری HR دارای مکانیزم کالیبراسیون دمای داخلی هستند، بنابراین نیازی به اضافه کردن هیچ سنسوری نخواهید داشت.

اتصال سنسور فاصله سنج التراسونیک MaxBotix MB1240 به یک آردینو UNO

همانطورکه در مقدمه ذکر شد، سنسورهای MaxBotix می‌توانند در مدهای مختلفی کار کنند. تصاویر زیر به شما نشان می‌دهند که چگونه سنسور MB1240 را برای به­‌دست آوردن ولتاژ آنالوگ یا پهنای پالس به آردوینو متصل کنید. شما می‌توانید مستقیماً سیم‌ها را به سنسور لحیم کنید، یا از پین هدر یا یک کانکتور استفاده کنید.

اتصالات سنسور MB1240– ولتاژ خروجی آنالوگ

MaxBotix MB1240 SensorArduino
GNDGND
+V5V
Pin 3A0

اتصالات سنسور MB1240– پهنای پالس

MaxBotix MB1240 SensorArduino
GNDGND
+V5V
Pin 2Pin 2

نمونه کد آردوینو برای راه اندازی سنسور فاصله سنج MaxBotix MB1240  – ولتاژ خروجی آنالوگ

با مثال زیر می­توانید فاصله‌ی اندازه‌گیری شده را خوانده و آن را در مانیتور سریال نمایش دهید. این کد بسیار ساده است و در ادامه توضیحاتی در مورد راه اندازی سنسور فاصله سنج التراسونیک با استفاده از ولتاژ خروجی آنالوگ و عملکرد آن آورده شده­‌است.

ابتدا کد زیر را با استفاده از Arduino IDE آپلود کنید.

/* Arduino example code for MaxBotix MB1240 XL-MaxSonar-EZ4 ultrasonic distance sensor: analog voltage output. More info: www.www.makerguides.com */

#define sensorPin A0

int distance = 0;

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

void read_sensor() {
  distance = analogRead(sensorPin) * 1;
}

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" cm");
}

void loop() {
  read_sensor();
  print_data();
  delay(1000);
}

سپس باید خروجی زیر را در مانیتور سریال مشاهده نمایید:

مشاهده خروجی کد راه اندازی سنسور التراسونیک و دریافت فاصله اندازه گیری شده از ولتاژ خروجی، در مانیتور سریال
خروجی مانیتور سریال MB1240

توضیح کد

اولین گام، تعریف پایه‌­های اتصالات است. عبارت define# به منظور تخصیص یک نام به یک مقدار ثابت مورد استفاده قرار می‌گیرد. هنگامی که برنامه کامپایل می­شود، کامپایلر هر ارجاعی به این مقدار ثابت را با مقدار تعریف شده جایگزین می­کند. بنابراین، در هنگام کامپایل شدن برنامه، هر جا که به sensorPin اشاره شده کامپایلر آن را با A0 جایگزین می­کند.

#define sensorPin A0

در گام بعدی، باید یک متغیر برای ذخیره‌­ی مقدار فاصله‌‌ی اندازه­‌گیری شده تعریف کنید.

int distance = 0;

در تابع setup، ارتباط سریال را با بادریت 9600 مقداردهی می‌کنیم. سپس فاصله‌ی اندازه‌گیری شده را در مانیتور سریال نمایش خواهیم داد. شما می‌توانید توسط کلیدهای Ctrl + Shift + M  یا از مسیر Tools > Serial Monitor مانیتور سریال را باز کنید، همچنین مطمئن شوید که بادریت بر روی 9600 تنظیم شده‌باشد.

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

پس از آن، دو تابع read_sensor و print_data را ایجاد خواهیم کرد. در تابع read_sensor ، خروجی ولتاژ آنالوگ سنسور را با کمک تابع analogRead(pin) می‌خوانیم. بردهای آردوینو دارای یک مبدل آنالوگ به دیجیتال چند کاناله‌ی 10 بیتی هستند. به این معنا که ولتاژ ورودی بین 0 و ولتاژ کاری را به مقادیر صحیح بین 0 و 1023 نگاشت می‌کنند. در آردوینو Uno، این مقدار برابر 5 ولت به ازای 1024 واحد یا 4.9 میلی ولت به ازای هر واحد خواهد بود.

سنسور MB1240  با ولتاژ تغذیه‌ی 5 ولت،  از ضریب (Vcc/1024  ) به ازای یک سانتی‌متر یا 4.9 میلی‌ولت به ازای یک سانتی‌متر استفاد می‌کند. این امر مقدار analogRead را به سانتی‌متر تبدیل می‌کند و سپس کافیست نتیجه را در 1 ضرب کنید.

analogRead (sensorPin) = distance in centimeters

void read_sensor() {
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(triggerPin, LOW);
  duration = pulseIn(readPin, HIGH);
  distance = duration / 58;
  delay(100);
}

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

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" cm");
}

در حلقه‌ی loop، ابتدا با فراخوانی تابع read_sensor فاصله را به‌دست آورده و سپس با فراخوانی تابع print_data داده‌ی حاصل را به مانیتور سریال ارسال می‌کنیم. در اینجا یک تأخیر 1000 میلی‌ثانیه اضافه کردیم، اما می‌توانید آن را به 100 میلی‌ثانیه کاهش دهید. فرکانس خواندن از سنسور MB1240 ، برابر با 10 هرتز است، یعنی شما می‌توانید در هر ثانیه 10 بار از سنسور داده دریافت کنید.

void loop() {
  read_sensor();
  print_data();
  delay(1000);
}

نمونه کد آردوینو برای راه اندازی سنسور فاصله سنج MaxBotix MB1240 – پهنای پالس

در این مثال، از خروجی دیگر سنسور یعنی خروجی پهنای پالس استفاده خواهیم کرد.

/* Arduino example code for MaxBotix MB1240 XL-MaxSonar-EZ4 ultrasonic distance sensor: pulse width output. More info: www.www.makerguides.com */
#define sensorPin 2
long distance = 0;
long duration = 0;
void setup() {
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);
}
void read_sensor() {
  duration = pulseIn(sensorPin, HIGH);
  distance = duration / 58;
}
void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" cm");
}
void loop()         {
  read_sensor();
  print_data();
  delay(1000);    }

توضیح کد

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

long distance = 0;
long duration = 0;

در تابع setup، علاوه بر مقداردهی ارتباط سریال، باید پایه‌ی سنسور را به عنوان ورودی تنظیم کنیم. برای این کار از تابع pinMode (pin, mode) استفاده شده‌است.

void setup() {
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);
}

تابع read_sensor متفاوت از مثال قبلی است. اکنون ما خروجی ولتاژ آنالوگ را اندازه‌گیری نخواهیم کرد، بلکه طول پالس ارسال شده توسط سنسور را اندازه می‌گیریم. برای این کار از تابع pulseIn(pin, value) استفاده می‌کنیم. این تابع منتظر می‌ماند تا ابتدا مقدار پایه از LOW به HIGH تغییر کند، سپس زمان‌بندی را شروع می‌کند و منتظر می‌ماند تا مقدار پایه دوباره به LOW تغییر و زمان‌بندی را متوقف سازد. در نهایت طول پالس را بر حسب میکروثانیه برمی‌گرداند.

پس از آن، می‌توانیم فاصله را با تقسیم duration بر 58 محاسبه کنیم. برای سایر سنسورهای MaxBotix، می توانید این ضریب را در دیتاشیت مربوطه پیدا کنید.

void read_sensor() {
  duration = pulseIn(sensorPin, HIGH);
  distance = duration / 58;
}

ادامه‌ی کدها مشابه مثال قبل است.

عملکرد مد تریگر راه اندازی سنسور فاصله سنج

تمام سنسورهای MaxSonar به طور پیش‌فرض در مد آزاد کار می‌کنند. یعنی تا زمانی‌که تغذیه‌ی سنسور قطع نشود به کار خود ادامه خواهند داد و هر 99 میلی‌ثانیه 20 موج 42 کیلوهرتزی را ارسال می‌کنند (نرخ خواندن از سنسور MB1240، برابر با 10 هرتز می‌باشد، برای سایر سنسورها به دیتاشیت مراجعه کنید).

به طورکلی این ساده‌ترین راه برای کار با سنسور است، زیرا لازم نیست خودتان آن را فعال کنید و تنها کافیست ولتاژ آنالوگ یا پهنای پالس را برای به‌دست آوردن فاصله بخوانید.

برای برخی از کاربردها، مانند زمانی‌که تغذیه‌ی سنسور با باتری تأمین می‌شود، بهتر است سنسور را با یک تریگر راه اندازی کنید. به این معنا ‌که شما می‌توانید به سنسور بگویید که یک سیکل متغیر را آغاز کند، اما فقط درصورتی‌که به آن فرمان داده باشید این امر امکان پذیر است. به این ترتیب، می‌توانید بیشترین جریان عبوری از سنسور را، زمانی‌که یک پالس سونار (sonar) ارسال می‌شود، کنترل کنید.

ارسال پالس سونار توسط یک سنسور التراسونیک
حداکثر میزان مصرف جریان مربوط به زمانی است که سنسور یک پالس سونار ارسال می‌کند.

به منظور راه اندازی سنسور فاصله سنج التراسونیک با تریگر، از یک اتصال دیگر میان پایه 4 سنسور و آردوینو استفاده می‌کنیم. چنانچه مشابه مثال‌های قبل این پایه را بدون اتصال باقی بگذارید، سنسور با نرخ تازه‌سازی ذکر شده در دیتاشیت تغییر می‌کند.

در صورت نیاز به فعال کردن سنسور، باید پایه‌ی 4 را به پایه‌ی Low منطقی متصل کنید. سپس وقتی می‌خواهید فاصله را بخوانید، باید پایه‌ی 4 را برای حداقل 20 میکروثانیه به پایه‌ی high منطقی متصل نمایید. بنابراین سنسور یک سیکل متغیر را آغاز می‌کند.

تصویر زیر اتصالات را برای این مثال به شما نشان می‌دهد.

در این مثال، از یک کلید فشاری برای راه اندازی سنسور استفاده شده‌است. به طوری‌که یکی از پایه‌ها را به زمین و پایه مقابل آن به پایه 4 آردوینو وصل می‌شود. سایر اتصالات در جدول زیر بیان شده‌است.

اتصالات سنسور فاصله سنج التراسونیک MB1240  – مد تریگر

PinArduino
GNDGND
+V5V
Pin 2Pin 2
Pin 4Pin 3
Button pin 1Pin 4
Button pin 2GND

نمونه کد آردوینو برای راه اندازی سنسور فاصله سنج MaxBotix MB1240 – راه اندازی با کلید فشاری

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

/* Arduino example code for MaxBotix MB1240 XL-MaxSonar-EZ4 ultrasonic distance sensor with push button. More info: www.www.makerguides.com */

#define readPin 2
#define triggerPin 3
#define buttonPin 4

long distance = 0;
long duration = 0;

int buttonState = HIGH;
int previous = HIGH;
long time = 0;
long debounce = 200;

void setup() {
  pinMode(readPin, INPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
  Serial.begin(9600);
  delay(3000);
  Serial.println("Sensor is ready, waiting for button press!");
}

void read_sensor() {
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(triggerPin, LOW);
  duration = pulseIn(readPin, HIGH);
  distance = duration / 58;
  delay(100);
}

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" cm");
}

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW && previous == HIGH && millis() - time > debounce) {
    read_sensor();
    print_data();
    time = millis();
  }

  previous = buttonState;
}

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

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

توضیح کد

اولین گام تعریف اتصالات است. ما از خروجی پهنای پالس سنسور برای خواندن فاصله استفاده خواهیم کرد.

#define readPin 2
#define triggerPin 3
#define buttonPin 4

علاوه بر متغیرهای duration و distance که در مثال قبل استفاده شد، به منظور ذخیره‌ی وضعیت کلید به متغیرهای جدید time و debounce نیاز داریم. چنانچه تریگرهای نادرست دریافت می‌کنید، می‌توانید مقدار debounce را افزایش دهید.

long distance = 0;
long duration = 0;

int buttonState = HIGH;
int previous = HIGH;
long time = 0;
long debounce = 200;

در تابع triggerPin ،setup را به عنوان خروجی، read و buttonPin را نیز به عنوان ورودی تنظیم می‌کنیم. توجه داشته باشید که در تابع pinMode از INPUT_PULLUP استفاده شده‌است. مقاومت‌های 20 کیلویی درون تراشه‌ی Atmega تعبیه و پول آپ شده‌اند که از طریق نرم‌افزار قابل دسترس هستند. این تنظیمات پایه‌ی مربوط به کلید را هنگامی که فشرده نشده به وضعیت HIGH و زمانی که کلید فشرده شود به وضعیت LOW تغییر می‌دهد.

در مرحله‌ی بعد، پایه‌ی تریگر را بر روی LOW تنظیم می‌کنیم، بنابراین سنسور شروع به تغییر نخواهد کرد. به منظور چاپ داده‌های سنسور، ارتباط سریال را با بادریت 9600 آغاز می‌کنیم.

void setup() {
  pinMode(readPin, INPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
  Serial.begin(9600);
  delay(3000);
  Serial.println("Sensor is ready, waiting for button press!");
}

پس از آن، دو تابع read_sensor و print_data را تعریف می‌کنیم. همانطورکه در تابع read_sensor  مشاهده می‌کنید، triggerPin برای 20 میکروثانیه بر روی High تنظیم شده‌است. به سبب این امر، سنسور یک پالس سونار ارسال می‌کند. سپس طول پالس خروجی را خوانده و آن را به فاصله تبدیل می‌کنیم (مشابه مثال قبل). در اینجا یک تأخیر 100 میلی‌ثانیه اضافه شده، زیرا این حداقل زمان بین خواندن داده‌‌هاست. تابع print_data نیز مشابه مثال‌های قبل عمل می‌کند.

void read_sensor() {
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(triggerPin, LOW);
  duration = pulseIn(readPin, HIGH);
  distance = duration / 58;
  delay(100);
}

در حلقه‌ی loop، ابتدا وضعیت کلید را خوانده (اینکه فشرده شده یا خیر) و آن را به عنوان buttonState ذخیره می‌کنیم. خط بعدی بررسی می‌کند که اولاً، کلید فشرده شده یا خیر (یعنی ورودی از HIGH به LOW تغییر کرده‌است یا خیر) و ثانیاً، برای نادیده گرفتن نویز، مدت زمان کافی از آخرین باری که کلید فشرده شده‌است، می‌گذرد یا خیر. چنانچه صحیح باشند، تابع read_sensor و print_data را فراخوانی و تایمر ریست می‌شود. در نهایت، متغیر قبلی بر روی buttonState  فعلی تنظیم می‌شود.

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW && previous == HIGH && millis() - time > debounce) {
    read_sensor();
    print_data();
    time = millis();
  }

  previous = buttonState;
}

در این مقاله نحوه‌ی راه اندازی سنسور فاصله سنج التراسونیک MaxBotix MB1240 XL-MaxSonar-EZ4  با آردوینو به شما آموزش داده‌شد. امیدواریم برای شما مفید و آموزنده بوده‌باشد. ما علاقه‌مندیم بدانیم چه پروژه‌هایی را با کمک این سنسور انجام داده‌اید. چنانچه سوال یا پیشنهادی دارید، آن را با ما در میان بگذارید.

مقالات مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.
You need to agree with the terms to proceed

پر بازدید ترین مقالات