محاسبه فاصله با سنسور فراصوت در آردوینو

Ratings
(0)

 

 محاسبه ی فاصله ها، به طور اتوماتیک و به صورت پیوسته، در موقعیت های زیادی به کمک ما می آید. به یک ربات فکر کنید که به طور اتوماتیک تلاش می کند تا راه خود را پیدا کند. یا اینکه به یک دزدگیر(burglar alarm) فکر کنید که وقتی که فردی بسیار به خانه ی شما نزدیک می شود، زنگ می زند یا با پلیس تماس می گیرد. این کارها به وسیله ی آردوینو امکان پذیر است. اما قبل از اینکه ما بتوانیم آن ربات یا دزدگیر را ایجاد کنیم، باید با برخی مفاهیم کلیدی آشنا شویم. انواع مختلفی از سنسورها برای اندازه گیری فاصله وجود دارند، و آردوینو با اکثر آنها به خوبی کار می کند. برخی از سنسورها از فراصوت(ultrasound) استفاده می کنند، در حالی که دیگر سنسورها از فروسرخ( infrared) یا حتی لیزر استفاده می کنند.

اما به طور کلی، تمام سنسورها به یک صورت کار می کنند: آنها یک سیگنال را انتشار می دهند و صبر می کنند تا بازتاب آن برگردانده شود، و زمان رفت و برگشت را محاسبه می می کنند. چون که ما می دانیم که سرعت صوت و نور در هوا چقدر است، می توانیم زمان محاسبه شده ی مورد نظر را به فاصله(distance) تبدیل کنیم.

 ما در اولین پروژه ی خود، قصد داریم یک دستگاه ایجاد کنیم که فاصله را نسبت به نزدیک ترین شیء به خود محاسبه می کند و سپس مقدار این فاصله را در پورت سریال(serial port) بعنوان خروجی نشان می دهد. برای این پروژه، ما از سنسور فراصوت Parallax PING استفاده می کنیم، زیرا استفاده از آن آسان است، و مستندات جذابی دارد و  یک مجموعه از ویژگی های خوبی دارد. این دستگاه می تواند اشیاء را در محدوده ی 2 سانتی متر تا 3 متر تشخیص دهد و ما از آن مستقیما در یک برد برد استفاده می کنیم؛ پس نیازی به لحیم کاری نداریم.

با استفاده از سنسور PING ما به سادگی می توانیم یک ردیاب آوایی یا یک ربات بسازیم که به طور اتوماتیک راه خود را از بین یک مارپیچ بدون برخورد با دیوار پیدا می کند. همان طور که قبلا گفته شد، سنسورهای فراصوت معمولا فاصله ی نزدیک ترین شیء را برنمی گردانند. بلکه آنها زمانی را که صوت نیاز دارد تا به شیء مورد نظر برخورد کند و دوباره به سنسور برگردد را به ما می دهند. سنسور PING نیز همین طور است و قسمت های داخلی آن نسبتا پیچیده هستند. خوشبختانه این سنسور سه پایه به نام های power و ground و signal دارد. این کار باعث می شود که اتصال سنسور به آردوینو ساده تر شود.

ابتدا سیم ground آردوینو و  سیم 5 ولت را به پین های مربوطه در سنسور PING وصل کنید. سپس پین سنسور(حسگر) PING را به یکی از پین های دیجیتال IO آردوینو وصل کنید. (ما از پین 7 بدون هیچ علت خاصی استفاده می کنیم). برای دیدن یک تصویر از مدار حاصل شده، به تصویر 15 و 16 نگاه کنید).  برای اینکه این سنسور شروع به کار کند، ما کمی به کدنویسی احتیاج داریم تا با سنسور Ping  ارتباط برقرار کنیم:

 

 

const unsigned int PING_SENSOR_IO_PIN = 7;
const unsigned int BAUD_RATE = 9600;

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

void loop() {
  pinMode(PING_SENSOR_IO_PIN, OUTPUT); 
  digitalWrite(PING_SENSOR_IO_PIN, LOW);
  delayMicroseconds(2); 

  digitalWrite(PING_SENSOR_IO_PIN, HIGH); 
  delayMicroseconds(5);
  digitalWrite(PING_SENSOR_IO_PIN, LOW); 

  pinMode(PING_SENSOR_IO_PIN, INPUT);
  const unsigned long duration = pulseIn(PING_SENSOR_IO_PIN, HIGH); 
  if (duration == 0) {
    Serial.println("Warning: We did not get a pulse from sensor.");
  } else {
    Serial.print("Distance to nearest object: ");
    Serial.print(microseconds_to_cm(duration));
    Serial.println(" cm");
  }
  
  delay(100);
}

unsigned long microseconds_to_cm(const unsigned long microseconds) {
  return microseconds / 29 / 2;
}

 این فایل در آدرس زیر قرار دارد:

InputDevices/Ultrasonic/Simple/Simple.ino

 

(تصویر 15)

 ابتدا ما یک ثابت(constant ) برای پین ورودی/خروجی PING که این سنسور به آن متصل است را تعریف می کنیم.  اگر می خواهید سنسور خود را به یک پین ورودی/خروجی دیگر متصل کنید، باید خط اول کدهای برنامه را تغییر دهید. در متد setup، ما نرخ دیتای(baud rate) پورت سریال را به 9600 تنظیم می کنیم، زیرا که ما می خواهیم برخی از داده های سنسور را روی سریال مانیتور( serial monitor) مشاهده کنیم. 

(تصویر 16)

 کار واقعی در حلقه ی loop انجام می شود؛ آنجایی که ما پروتکل PING را تکمیل می کنیم.  بر اساس این مستندات، ما می توانیم با استفاده از پالس ها  و نتایج بازگشت آنها به صورت پالس های با عرض متغیر، این سنسور را کنترل کنیم. در خط 9 تا 11 ما پین سیگنال سنسور را دو میکروثانیه به LOW تنظیم می کنیم تا  آن را به وضعیت مناسبی برسانیم. این کار باعث می شود که پالس های تمیزی از HIGH داشته باشیم؛ که در گام های بعدی مورد نیاز خواهند بود. ( در جهان الکترونیک، ما همواره باید آماده ی نوسان در منبع تغذیه باشیم.

در نهایت، زمان آن رسیده است که به سنسور بگوییم که کاری را برای ما انجام دهد. در خط های 13 تا 15، ما پین سیگنال سنسور را برای 5 میکروثانیه به HIGH تنظیم می کنیم، تا یک محاسبه ی شروع شود. پس از آن، ما دوباره  پین سیگنال را دوباره به LOW تنظیم می کنیم، زیرا این سنسور با یک پالس HIGH با طول متغیر روی همان پایه پاسخ خواهد داد. با یک پین دیجیتال، ما تنها تعدادی گزینه برای انتقال اطلاعات پیش رو داریم.

ما می توانیم پین مورد نظر را به HIGH یا LOW تنظیم کنیم و می توانیم کنترل کنیم که چه مدت اینها در یک حالت باقی بماند. برای بسیاری از اهداف ، این کاملاً کافی است ، و در مورد ما نیز کافی است.وقتی که سنسور PING صوت 40 کیلو هرتز خود را ارسال می کند، پین سیگنال به HIGH تنظیم می شود و سپس وقتی که انعکاس صدا را دریافت می کند، آن را به LOW تنظیم می کند. آزادانه بگویم که ما داریم  از یک پین دیجیتال، برای محاسبه ی یک سیگنال آنالوگ استفاده می کنیم. در تصویر زیر، نموداری را مشاهده می کنید که فعالیت عادی یک پین دیجیتال که به سنسور PING متصل شده است را نشان می دهد.

 ما می توانستیم مدتی که پین ما در حالت HIGH می ماند(duration) را به صورت دستی اندازه گیری کنیم، اما متد pulseIn  قبلا این کارهای پیش پا افتاده را برای ما انجام داده است. و در خط 19 از آن استفاده می کنیم.

متد pulseIn سه پارامتر را دریافت می کند.

pin : تعداد پین هایی که پالس باید از آنها خوانده شود.

type : نوع پالسی که باید خوانده شود. که می تواند HIGH یا LOW باشد.

timeout : وقفه(Timeout) ای که به میکروثانیه محاسبه می شود.

 اگر هیچ پالسی در مدت timeout (وقفه) تشخیص داده نشود، متد pulseIn مقدار 0 را برمی گرداند. این پارامتر اختیاری است و مقدار پیش فرض آن 1 ثانیه است.


توجه کنید که در تمام طول فرایند، تنها از یک پین برای ارتباط با سنسور PING استفاده می شود. دیر یا زود، متوجه خواهید شد که پین های I/O  منابعی کمیاب در آردوینو هستند، بنابراین اینکه سنسور PING تنها از یک پین دیجیتال استفاده می کندیک مزیت به حساب می آید. وقتی که  برای انجام یک کار، قصد دارید یکی را انتخاب کنید، سعی کنید گزینه ای را انتخاب کنید که تا جای امکان از پین های کمتری استفاده می کند.

تنها یک کار دیگر باقی مانده است که باید انجام دهیم: اینکه مدت زمان ای(duration) که اندازه گرفته ایم را به طول(فاصله یا length) تبدیل کنیم. صوت با سرعت 343 متر در ثانیه حرکت می کند، که یعنی صوت، یک سانتی متر را در 29.155 میکروثانیه، می پیماید. بنابراین ما باید مدت زمان رفت و برگشت(duration) را بر 29 و سپس بر 2 تقسیم کنیم، زیرا صوت مسیر را دوبار می پیماید. (رفت و برگشت). صوت، یک بار به سمت شیء حرکت می کند و سپس دوباره به سنسور PING برمی گردد. متد microseconds_to_cm محاسبات را انجام می دهد.

 بر اساس مشخصات سنسور PING، ما باید بین دو محاسبه، حداقل 200 میکروثانیه صبر کنیم. برای محاسبات با سرعت بالا، ما می توانیم با دقت بیشتر طول یک وقفه را با محاسبه ی زمانی که کدها انجام می شوند،  محاسبه کنیم. اما در این مورد، این کار اهمیتی ندارد، زیرا تمام دستوراتی که در طی اجرای دو محاسبه در متد loop انجام می شوند، چیزی  بیش از 200 میکرو ثانیه طول می کشند. و بیرون دادن داده به ارتباطات سریال نسبتاً گران است. علیرغم این، ما یک وقفه ی (delay ) 100 میکروثانیه ای در کدها اضافه کرده ایم تا خروجی را کند کنیم. ممکن است تعجب کنید که چرا ما از کلمه ی کلیدی  const در خیلی اوقات استفاده می کنیم. 

برای برنامه نویسی آردوینو، ما از C یا ++C استفاده می کنیم، و در این زبان ها، ما برای اینکه یک مقدار، ثابت باشد و تغییر نکند، از کلمه ی کلیدی const استفاده می کنیم. استفاده از کلمه ی کلیدی const، نه تنها برنامه را کوتاه تر می کند و از خطاهای منطقی جلوگیری می کند، بلکه به کامپایلر کمک می کند تا سایز برنامه ی ما را کمتر کند.

 با اینکه اکثر برنامه های آردوینو، کوچک هستند، اما توسعه ی نرم افزار آردوینو هنوز هم توسعه ی نرم افزار محسوب می شود و باید به بهترین وجه انجام شود. بنابراین وقتی که ما یک مقدار ثابت(constant) را  در برنامه ی خود تعریف می کنیم، از کلمه ی کلیدی const استفاده می کنیم نه از define# . این موضوع برای دیگر زبان های برنامه نویسی هم صادق است، بنابراین ما در برنامه های جاوا نیز از کلمه ی کلیدی final استفاده می کنیم.

 اکنون زمان آن رسیده است تا با سنسور مورد نظر بیشتر کار کنیم و با ضعف ها و قدرت های آن آشناتر شویم. برنامه را کامپایل و در برد آردوینو آپلود کنید و سریال مانیتور(serial monitor) را باز کنید(فراموش نکنید که نرخ دیتا یا baud rate را به 9600 تنظیم کنید). باید چیزی شبیه به زیر را مشاهده کنید: 

Distance to nearest object: 42 cm
Distance to nearest object: 33 cm
Distance to nearest object: 27 cm
Distance to nearest object: 27 cm
Distance to nearest object: 29 cm
Distance to nearest object: 36 cm

 علاوه بر خروجی در ترمینال، مشاهده خواهید کرد که LED روی سنسور PING وقتی که سنسور شروع به یک محاسبه ی جدید می کند، روشن می شود. با قرار دادن چیزهای بزرگ یا کوچک در مقابل سنسور، قابلیت های آن را تست کنید. سعی کنید اشیاء را از زاویه های مختلف تشخیص دهید و همچنین سعی کنید اشیائی که در زیر یا در بالای سنسور قرار دارند را تشخیص دهید. شما همچنین باید بر روی اشیائی که محیط مسطح ندارند نیز آزمایش هایی را انجام دهید. سعی کنید حیوانات اسباب بازی را تشخیص دهید و خواهید دید که این اسباب بازی ها، همانند اشیاء مسطح تشخیص داده نمی شوند.

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

 {module کمک نقدی به نویسنده}

  • بازدید: 563

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال