در قسمت سی و یکم از آموزش آردوینو به بررسی تشخیص نور و تشخیص حرکت موجودات زنده پرداختیم. در این قسمت قصد داریم درباره اندازهگیری فاصله در آردوینو صحبت کنیم.
فرض کنید میخواهید فاصله تا چیزی را اندازهگیری کنید، مانند یک دیوار یا فردی که به سمت آردوینو حرکت میکند.
در این پروژه از سنسور فاصلهسنج التراسونیک Parallax PING))) برای اندازهگیری فاصله یک جسم در بازهای از ۲ سانتیمتر تا حدود ۳ متر استفاده میشود. فاصله اندازهگیریشده روی سریال مانیتور نمایش داده میشود و همچنین، هرچه جسم به سنسور نزدیکتر شود، یک LED با سرعت بیشتری چشمک میزند (اتصالات در شکل 1 نشان داده شدهاند.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /* Ping))) Sensor * prints distance and changes LED flash rate * depending on distance from the Ping))) sensor */ const int pingPin = 5; const int ledPin = LED_BUILTIN; // LED pin void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { int cm = ping(pingPin); Serial.println(cm); digitalWrite(ledPin, HIGH); delay(cm * 10); // each centimeter adds 10 ms delay digitalWrite(ledPin, LOW); delay(cm * 10); } // Measure distance and return the result in centimeters int ping(int pingPin) { long duration; // This will store the measured duration of the pulse // Set the pingPin to output. pinMode(pingPin, OUTPUT); digitalWrite(pingPin, LOW); // Stay low for 2μs to ensure a clean pulse delayMicroseconds(2); // Send a pulse of 5μs digitalWrite(pingPin, HIGH); delayMicroseconds(5); digitalWrite(pingPin, LOW); // Set the pingPin to input and read the duration of the pulse. pinMode(pingPin, INPUT); duration = pulseIn(pingPin, HIGH); // convert the time into a distance return duration / 29 / 2; } |
شکل 1: سنسور اتصالات
سنسورهای اولتراسونیک، مدت زمانی را اندازهگیری میکنند که طول میکشد صدا به یک جسم برخورد کرده و به سنسور بازگردد.
پالس صوتی “پینگ” زمانی تولید میشود که پین pingPin به مدت دو میکروثانیه در وضعیت HIGH قرار گیرد. پس از آن، سنسور یک پالس ایجاد میکند که با بازگشت صدا به سنسور پایان مییابد.
عرض (مدتزمان) این پالس متناسب با مسافتی است که صدا طی کرده و برنامه با استفاده از تابع pulseIn این مدت را اندازهگیری میکند.
سرعت صوت حدود ۳۴۰ متر بر ثانیه است که معادل ۲۹ میکروثانیه برای هر سانتیمتر میباشد.
فرمول محاسبه فاصله برای رفت و برگشت صدا به این صورت است:
فاصله (سانتیمتر) = مدتزمان (میکروثانیه) ÷ ۲۹
بنابراین، فرمول محاسبه فاصله یکطرفه (رفت) در واحد سانتیمتر به این صورت است:
فاصله = مدتزمان (میکروثانیه) ÷ 29 ÷ 2
عدد 340 متر بر ثانیه، سرعت تقریبی صوت در دمای 20 درجه سانتیگراد (68 درجه فارنهایت) است.
اگر دمای محیط شما به طور قابلتوجهی با این مقدار تفاوت دارد، میتوانید از ماشینحساب سرعت صوت مانند آنچه توسط سازمان ملی هواشناسی آمریکا (NWS) ارائه شده، استفاده کنید تا مقدار دقیقتری به دست آورید.
یک جایگزین ارزانتر برای سنسور Parallax PING)))، سنسور HC-SR04 است که توسط بسیاری از فروشندگان و همچنین در سایتهایی مانند eBay قابلتهیه میباشد.
اگرچه HC-SR04 دقت و برد کمتری نسبت به PING))) دارد، اما در مواردی که قیمت اهمیت بیشتری نسبت به عملکرد دارد، میتواند گزینه مناسبی باشد.
برخلاف PING)))، در سنسور HC-SR04 پینهای جداگانهای برای ارسال پالس صوتی (Trigger) و دریافت بازتاب آن (Echo) وجود دارد.
کد اصلاحشدهی زیر، نمونهای از استفاده این سنسور را نشان میدهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /* HC-SR04 Sensor * prints distance and changes LED flash rate * depending on distance from the HC-SR04 sensor */ const int trigPin = 5; // Pin to send the ping from const int echoPin = 6; // Pin to read the response from const int ledPin = LED_BUILTIN; // LED pin void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { int cm = calculateDistance(trigPin); Serial.println(cm); digitalWrite(ledPin, HIGH); delay(cm * 10); // each centimeter adds 10 ms delay digitalWrite(ledPin, LOW); delay(cm * 10); delay(60); // datasheet recommends waiting at least 60ms between measurements } int calculateDistance(int trigPin) { long duration; // This will store the measured duration of the pulse digitalWrite(trigPin, LOW); delayMicroseconds(2); // Stay low for 2μs to ensure a clean pulse digitalWrite(trigPin, HIGH); delayMicroseconds(10); // Send a pulse of 10μs to ensure a clean pulse digitalWrite(trigPin, LOW); // Read the duration of the response pulse duration = pulseIn(echoPin, HIGH); // convert time into distance return duration / 29 / 2; } |
بر اساس دیتاشیت سنسور HC-SR04، توصیه میشود که حداقل ۶۰ میلیثانیه بین هر اندازهگیری فاصله باشد. البته، چون در این پروژه چشمکزدن LED خودش مقداری زمان صرف میکند، استفاده از delay(60); باعث ایجاد تأخیری بیش از حد نیاز میشود.
اما اگر در کد شما هیچ تأخیر دیگری وجود نداشته باشد، بهتر است همان تأخیر ۶۰ میلیثانیهای را حفظ کنید تا سنسور بهدرستی و بادقت کار کند.
سنسور HC-SR04 بهترین عملکرد را با ولتاژ ۵ ولت دارد، اما میتوان از آن در بردهایی با ولتاژ ۳٫۳ ولت نیز استفاده کرد، به شرطی که آن بردها نسبت به ۵ ولت مقاوم 5-volt tolerant باشند؛ مانند برد Teensy 3.
شکل 2 نحوهی سیمکشی این سنسور را برای یک برد ۵ ولتی نشان میدهد:
شکل 2: اتصالات سنسور HC-SR04
سنسور اولتراسونیک دیگری که میتوان برای اندازهگیری فاصله استفاده کرد، MaxBotix EZ1 است.
این سنسور نسبت به Ping))) یا HC-SR04 راحتتر قابلاستفاده است، زیرا نیازی به ارسال پالس “پینگ” ندارد و میتواند با ولتاژ ۳.۳ یا ۵ ولت کار کند.
این سنسور اطلاعات فاصله را بهصورت مداوم ارائه میدهد که میتواند به شکل ولتاژ آنالوگ یا پالس با عرض متناسب باشد.
شکل 3 نحوه اتصال این سنسور را نشان میدهد.
شکل 3: اتصال خروجی PW سنسور EZ1 به یک پین ورودی دیجیتال
کد (اسکچ) زیر، از خروجی عرض پالس (PW) سنسور EZ1 استفاده میکند تا خروجیای مشابه با کد قبلی تولید کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /* * EZ1Rangefinder Distance Sensor * prints distance and changes LED flash rate * depending on distance from the sensor */ const int sensorPin = 5; const int ledPin = LED_BUILTIN; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { long value = pulseIn(sensorPin, HIGH) ; int cm = value / 58; // pulse width is 58 microseconds per cm Serial.println(cm); digitalWrite(ledPin, HIGH); delay(cm * 10 ); // each centimeter adds 10 ms delay digitalWrite(ledPin, LOW); delay( cm * 10); delay(20); } |
سنسور EZ1 از طریق پایههای +5 ولت و زمین (GND) تغذیه میشود که باید به پایههای متناظر در آردوینو متصل شوند.
پایه PW سنسور EZ1 را به پایه دیجیتال شماره ۵ آردوینو وصل کنید.
کد، عرض پالس را با استفاده از فرمان pulseIn اندازهگیری میکند.
عرض پالس معادل ۵۸ میکروثانیه بهازای هر سانتیمتر یا ۱۴۷ میکروثانیه بهازای هر اینچ است.
اگر از سیمهای اتصال بلند برای سنسور استفاده میکنید، ممکن است نیاز باشد که یک خازن بین پایههای +5V و GND قرار دهید تا منبع تغذیه سنسور پایدارتر شود.
اگر خوانشهای سنسور نابسامان یا ناپایدار بود، یک خازن ۱۰ میکروفاراد (10 µF) را در نزدیکی سنسور بین +5 ولت و زمین وصل کنید.
شما همچنین میتوانید مقدار فاصله را از طریق خروجی آنالوگ سنسور EZ1 دریافت کنید.
برای این کار، پایه AN را به یکی از پایههای ورودی آنالوگ آردوینو متصل کرده و مقدار آن را با تابع analogRead بخوانید.
کد زیر مقدار ورودی آنالوگ را خوانده و آن را به سانتیمتر تبدیل کرده و چاپ میکند:
1 2 3 4 5 6 | int value = analogRead(A0); float mv = (value / 1024.0) * 5000 ; float inches = mv / 9.8; // 9.8mv per inch per datasheet float cm = inches * 2.54; Serial.print("in: "); Serial.println(inches); Serial.print("cm: "); Serial.println(cm); |
مقدار بهدستآمده از تابع analogRead تقریباً معادل ۴.۸ میلیولت بهازای هر واحد است.
طبق دیتاشیت، خروجی آنالوگ سنسور EZ1 در ولتاژ ۵ ولت برابر با ۹.۸ میلیولت بهازای هر اینچ و در ولتاژ ۳.۳ ولت برابر با ۶.۴ میلیولت بهازای هر اینچ است.
برای تبدیل فاصله از اینچ به سانتیمتر، کافی است مقدار بهدستآمده را در ۲.۵۴ ضرب کنید.
فرض کنید میخواهید فاصله اجسام تا آردوینو را با دقت بیشتری نسبت به روش گفتهشده اندازهگیری کنید.
سنسورهای فاصلهی Time of Flight (ToF) از یک لیزر کوچک و سنسور استفاده میکنند تا مدت زمانی را که طول میکشد پرتوی نور لیزری به جسم برخورد کرده و به سنسور بازگردد، اندازهگیری کنند.
اگرچه این نوع سنسورها زاویه دید باریکتری نسبت به سنسورهای التراسونیک دارند، اما دقت آنها بسیار بیشتر است.
بااینحال، برد آنها معمولاً کمتر است.
بهعنوانمثال:
سنسور HC-SR04 میتواند فاصلهای بین ۲ سانتیمتر تا ۴ متر را اندازهگیری کند، درحالیکه سنسور VL6180X از نوع ToF تنها میتواند فاصلهای بین ۵ تا ۱۰ سانتیمتر را اندازهگیری کند.
کدی که در ادامه این بخش آمده از سنسور VL6180X ساخت شرکت Adafruit (شناسه محصول 3316) استفاده میکند.
شکل 4 نحوه اتصال سنسور را نشان میدهد.
برای استفاده از این کد، لازم است که کتابخانه Adafruit_VL6180X را نصب کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /* tof-distance sketch * prints distance and changes LED flash rate based on distance from sensor */ #include <Wire.h> #include "Adafruit_VL6180X.h" Adafruit_VL6180X sensor = Adafruit_VL6180X(); const int ledPin = LED_BUILTIN; // LED pin void setup() { Serial.begin(9600); while (!Serial); if (! sensor.begin()) { Serial.println("Could not initialize VL6180X"); while (1); } } void loop() { // Read the range and check the status for any errors byte cm = sensor.readRange(); byte status = sensor.readRangeStatus(); if (status == VL6180X_ERROR_NONE) { Serial.println(cm); digitalWrite(ledPin, HIGH); delay(cm * 10); // each centimeter adds 10 ms delay digitalWrite(ledPin, LOW); delay(cm * 10); } else { // Major errors are worth mentioning if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) { Serial.println("System error"); } } delay(50); } |
شکل 4: اتصال سنسور فاصلهیابی VL6180X (Time of Flight)
سنسور VL6180X از پروتکل I2C برای ارتباط با آردوینو استفاده میکند. برای این ارتباط، لازم است پایههای SCL و SDA سنسور به پایههای متناظر آردوینو متصل شوند.
در کد مربوطه:
کتابخانهی Wire برای پشتیبانی از ارتباط I2C اضافه شده است.
همچنین کتابخانهی Adafruit_VL6180X نیز اضافه شده که توابع لازم برای کار با سنسور را فراهم میکند.
قبل از تابع setup، یک شیء مثلاً با نام sensor از کلاس مربوط به سنسور تعریف میشود تا بتوان با آن کار کرد.
سپس در داخل تابع setup، سنسور مقداردهی اولیه (initialize) میشود تا آماده خواندن دادهها باشد.
تابع setup پورت سریال را راهاندازی میکند و تلاش میکند سنسور را نیز مقداردهی اولیه کند.
اگر مقداردهی اولیه سنسور با شکست مواجه شود، یک پیام خطا از طریق پورت سریال چاپ میشود و سپس برنامه با واردشدن به یک حلقه (loop) بینهایت (infinite while) متوقف میشود تا از ادامه اجرای کد جلوگیری شود.
در هر بار اجرای حلقه loop، برنامه فاصله را از سنسور میخواند و همچنین وضعیت سنسور را بررسی میکند تا مطمئن شود که در حالت خطا قرار ندارد.
اگر خوانش خوبی دریافت شود، فاصله را روی پورت سریال نمایش میدهد و LED را با سرعتی که بر اساس مقدار فاصله اندازهگیری شده تنظیم شده، چشمک میزند.
مثالی که همراه کتابخانه Adafruit_VL6180X ارائه شده، بررسیهای دقیقتری روی تمام حالتهای خطا انجام میدهد. به جز خطاهای سیستمی که این برنامه بررسی میکند، بیشتر خطاها موقتی هستند و در خوانشهای بعدی خودبهخود رفع میشوند.
سنسور های داخلی آردوینو + سنسور تشخیص حرکت...
من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!
مقالات بیشتر
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.