تشخیص سرعت با برد آردوینو و سنسور مادون قرمز

محتویات
آیا تا به حال به این فکر کرده اید که دستگاه ها چگونه سرعت وسایل نقلیه در حال حرکت را اندازه گیری می کنند یا سرعت یک ورزشکار چگونه ثبت می شود؟ معمولاً این سنسورهای سرعت با فناوری رادار یا لیزری کار می کنند تا امواج رادیویی یا نور مادون قرمز را از اجسام برگردانند و سرعت را بر اساس زمان صرف شده برای بازتاب نور یا موج محاسبه کنند. در این مقاله یاد می گیریم که چگونه سنسور سرعت را با استفاده از آردوینو و سنسور IR راه اندازی کنیم.
با قرار دادن دو سنسور IR در یک فاصله ثابت از یکدیگر، میتوانیم مدت زمان حرکت جسم بین آنها را ردیابی کنیم. با زمان ثبت شده و فاصله شناخته شده بین آنها، می توانیم سرعت جسم را با استفاده از یک فرمول به طور دقیق محاسبه کنیم.
چیزی که این پروژه را جالب تر می کند، کاربردی بودن آن است. نه تنها میتوانیم سرعت ماشینهای متحرک یا اشیاء دیگر را اندازهگیری کنیم، بلکه میتوانیم از این سنسور سرعت مبتنی بر آردوینو در آزمایشهای علمی برای مطالعه حرکت، شتاب یا اصطکاک با اندازهگیری سرعت اجسام مختلف در یک محیط کنترلشده استفاده کنیم. پس بیایید شروع کنیم.
قطعات مورد نیاز
ساخت پروژه اندازه گیری سرعت با آردوینو و سنسور مادون قرمز بسیار مقرون به صرفه و ارزان قیمت است. همچنین ساخت این پروژه خیلی ساده است و فقط با چند قطعه ساده میتوانید آن را راه اندازی کنید. قطعات مورد نیاز در لیست زیر آورده شده است.
- برد آردوینو UNO R3
- دو سنسور مادون قرمز (تشخیص مانع)
- نمایشگر LCD 16×2 با ماژول I2C
- برد بورد
- سیم های اتصال
- آداپتور برق 12 ولت با جک DC
این قطعات برای ساخت پروژه اندازه گیری سرعت با آردوینو ضروری هستند.
مدار آشکارساز سرعت آردوینو
یک شماتیک مدار ساده مبتنی بر برد بورد در زیر نشان داده شده است تا به شما در ایجاد اتصالات کمک کند. همانطور که می بینید مدار بسیار ساده است و فقط از دو سنسور IR، آردوینو Uno، صفحه نمایش LCD و برد بورد تشکیل شده است.
همچنین توجه داشته باشید که برای تغذیه این مدار به یک آداپتور برق 12 ولت خارجی نیاز دارید. زیرا این پروژه جریان بیشتری مصرف میکند و پورتهای USB معمولی کامپیوتر نمیتوانند آن را تحویل دهند. آداپتور برق به سادگی باید به Arduino UNO متصل شود و در مدار بالا نشان داده نشده است.
در تصویر زیر، می توانید تنظیمات سخت افزاری واقعی را که با استفاده از مدار سنسور آردوینو ما به عنوان مرجع توسعه یافته است، مشاهده کنید. در اینجا می توانید ببینید که من کل این قطعات را از آداپتور برق خارجی از طریق یک جک 12 ولت DC تغذیه می کنم. همچنین توجه داشته باشید که LED های IR روی سنسور را با یک نوار مشکی پوشانده ایم تا فقط به سمت جلو باشد، بعداً در مورد آن بیشتر بحث خواهیم کرد.
میتوانید کنترلکننده اصلی ما، “Arduino UNO R3” را ببینید که وظیفه کنترل سیگنالهای حسگرهای IR و انجام برخی محاسبات برای محاسبه سرعت جسم را بر عهده دارد.
نحوه قرار دادن سنسور IR برای اندازه گیری سرعت
در مرحله بعد می خواهیم اطمینان حاصل کنیم که فاصله بین دو سنسور IR در مضرب 10 یا به گونه ای است که میکروکنترلر عملیات تقسیم را بدون هیچ خطایی انجام دهد. زیرا به طور کلی، آردوینو UNO R3 از پشتیبانی سخت افزاری پیچیده ای برای عملیات های ریاضی روی اعداد اعشاری برخوردار نیست. برای این کار، تصمیم گرفتم فاصله 10 سانتی متری بین دو سنسور مادون قرمز تنظیم کنم.
همچنین میتوانیم اطمینان حاصل کنیم که فاصله بین سنسور IR باید بزرگتر از اندازه جسم متحرک واقعی باشد که در تصویر زیر نشان داده شده است. اجباری نیست، اما به عملکرد دقیق سیستم ما کمک می کند.
به حداقل رساندن خطا سنسور IR با چسب برق
همانطور که می دانیم سنسورهای IR به شرایط محیطی خارجی مانند نور خورشید، نور اتاق و … حساس هستند که می تواند به طور قابل توجهی بر دقت آنها تأثیر بگذارد و باعث ایجاد ثبت های کاذب شود. برای به حداقل رساندن آن، ایده ای به ذهنم رسید که LED حسگر مادون قرمز را با استفاده از نوار مشکی بپوشانم و نقطه فوکوس آن را بدون پوشش بگذارم.
این اقدام احتیاطی باعث می شود سنسور سرعت ما در شرایط نور محیطی بدون هیچ مشکلی به درستی کار کند.
مفاهیم اندازه گیری سرعت با سنسور IR
هنگام اندازه گیری سرعت یک جسم متحرک با استفاده از دو حسگر IR، این فرآیند بر اساس محاسبه زمان صرف شده برای حرکت یک جسم متحرک بین آن حسگرهای مادون قرمز است. بعداً می توان سرعت را با تقسیم مسافت طی شده توسط جسم بر زمان صرف شده محاسبه کرد.
اصل اساسی پشت تنظیم سنسور IR:
دو سنسور IR در فاصله مشخصی از یکدیگر قرار می گیرند. هنگامی که یک جسم حرکت می کند، باید از اولین سنسور IR عبور کند. در حالی که جسم از اولین حسگر IR عبور می کند، اولین سنسور IR به آردوینو سیگنال می دهد تا تایمر را راه اندازی کند.
بعداً جسم از سنسور IR دوم عبور می کند و هنگام عبور از سنسور مادون قرمز دوم به آردوینو سیگنال می دهد تا تایمر را متوقف کند. این در نهایت به ما کمک می کند تا زمان صرف شده توسط جسم بین دو سنسور IR را محاسبه کنیم.
محاسبه سرعت واقعی شی متحرک:
ما از قبل فاصله موجود بین دو سنسور مادون قرمز را می دانیم. پس از محاسبه زمان عبور اجسام بین حسگرهای IR، به راحتی میتوانیم سرعت جسم متحرک را با استفاده از “فرمول سرعت” محاسبه کنیم.
فرمول محاسبه سرعت:
سرعت = فاصله بین دو سنسور / زمان صرف شده
به عنوان مثال، اگر فاصله بین دو سنسور 1 متر باشد و جسم 0.5 ثانیه طول بکشد تا بین آنها حرکت کند، آنگاه سرعت خواهد بود.
سرعت = 1 متر / 0.4 ثانیه => 2.5 متر بر ثانیه
کد آردوینو برای اندازه گیری سرعت
به طور کلی کد زیر باعث می شود آردوینو با استفاده از دو سنسور مادون قرمز سرعت جسم متحرک را اندازه گیری کند و سرعت جسم را در صفحه نمایش LCD 16×2 I2C نمایش دهد.
پس از آن، آردوینو سرعت را با استفاده از فاصله بین دو سنسور مادون قرمز و فاصله زمانی بین دو سنسور IR محاسبه می کند. بعداً سرعت را روی صفحه نمایش LCD I2C نشان می دهد.
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در اینجا قسمت های مختلف کد را توضیح میدهیم.
#include <Wire.h> #include <LiquidCrystal_I2C.h>
در اینجا “Wire.h” و “LiquidCrystal_I2C.h” گنجانده شده است تا برد Arduino UNO R3 با صفحه نمایش LCD 16×2 I2C ارتباط برقرار کند و آن را به راحتی بدون نیاز به نوشتن کتابخانه های پیچیده سخت افزاری خاص کنترل کند.
LiquidCrystal_I2C lcd(0x27, 16, 2);
این خط آبجکت LCD را با استفاده از پروتکل I2C با یک ماژول نمایشگر LCD 16×2 تنظیم می کند. پس از مقداردهی اولیه، میتوانیم از آبجکت «LCD» آن برای تعامل با نمایشگر استفاده کنیم، مانند نمایش متن، پاک کردن صفحه، یا تنظیم نور پسزمینه و غیره.
#define SENSOR_1_PIN 2 // پین خروجی سنسور اول #define SENSOR_2_PIN 3 // پین خروجی سنسور دوم
این خط “SENSOR_1_PIN” را به عنوان پایه 2 و “SENSOR_2_PIN” را به عنوان پایه 3 در برد آردوینو، جایی که دو پین سیگنال سنسور IR وصل میشوند، تعریف میکند. در اینجا پین 2 آردوینو با وقفه خارجی INT0 مرتبط است و پایه 3 با وقفه خارجی INT1 مطابقت دارد. با تعریف پین ها با استفاده از ماکروها به جای متغیر، می توانیم فضای حافظه بیشتری را ذخیره کنیم.
volatile unsigned long timeSensor1 = 0; volatile unsigned long timeSensor2 = 0; volatile bool sensor1Triggered = false; volatile bool sensor2Triggered = false; const float distanceBetweenSensors = 0.1; // فاصله بین دو سنسور (متر) float speed = 0; // سرعت
این متغیرها زمان هایی را که حسگرهای IR فعال میشوند، ذخیره میکنند “timeSensor1” و “timeSensor2”. متغیرهای “sensor1Triggered” و “sensor2Triggered” به عنوان یک پرچم برای ردیابی وضعیت راه اندازی سنسور استفاده می شوند. فاصله ثابت بین دو سنسور مادون قرمز در متغیر ثابت “distanceBetweenSensors” ذخیره می شود و سرعت محاسبه شده جسم متحرک در متغیر “speed” ذخیره می شود.
void sensor1ISR() { if (!sensor1Triggered) { timeSensor1 = micros(); // ثبت زمان اول sensor1Triggered = true; } } void sensor2ISR() { if (!sensor2Triggered) { بررسی ثبت شدن زمان اول timeSensor2 = micros(); // ثبت زمان دوم sensor2Triggered = true; } }
ما دو سرویس وقفه را برای سنسور های خود در نظر میگیریم. این ISR ها تشخیص محرک های سنسور IR را انجام می دهند. هنگامی که یک شی از یک سنسور عبور می کند، ISR زمان را با استفاده از تابع micros() ثبت می کند و یک پرچم تنظیم می کند تا از پردازش چندین ثبت جلوگیری کند.
void setup() { // پیکربندی ال سی دی lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Speed Gun"); delay(2000); // نمایش متن برای دو ثانیه lcd.clear(); pinMode(SENSOR_1_PIN, INPUT); pinMode(SENSOR_2_PIN, INPUT); // اختصاص دادن وقفه ها به سنسور ها attachInterrupt(digitalPinToInterrupt(SENSOR_1_PIN), sensor1ISR, RISING); attachInterrupt(digitalPinToInterrupt(SENSOR_2_PIN), sensor2ISR, RISING); }
در این تابع setup() ال سی دی مقدار دهی اولیه می شود و پیام Speed Gun را به مدت دو ثانیه نمایش می دهد، سپس صفحه را با استفاده از کتابخانه های LCD از پیش تعریف شده پاک می کند. پایه های سنسور اول و دوم با استفاده از تابع pinMode() به عنوان ورودی تنظیم می شوند.
وقفههای سختافزاری بعدی با استفاده از تابع “attachInterrupt()” روی پینهای سنسور پیکربندی میشوند، بنابراین هنگامی که یک سیگنال LOW به HIGH (سیگنال تشخیص شی حسگر IR) رخ میدهد، توابع روتین سرویس وقفه مربوطه، یعنی “sensor1ISR()” و “sensor2ISR( )» فراخوانی می شوند. این تابع setup() تضمین میکند که سیستم برای شناسایی شی در حالی که از هر دو سنسور مادون قرمز بدون هیچ تأخیر در زمان پاسخ عبور میکند، آماده است.
void loop() { if (sensor1Triggered && sensor2Triggered) { sensor1Triggered = false; sensor2Triggered = false; unsigned long timeDifference = abs(timeSensor2 - timeSensor1); // Time in microseconds lcd.clear(); if (timeDifference > 0) { speed = distanceBetweenSensors / (timeDifference / 1000000.0); // Convert µs to seconds lcd.setCursor(0, 0); lcd.print("Speed:"); lcd.setCursor(0, 1); lcd.print(speed, 2); // Display speed with 2 decimal places lcd.print(" m/s"); } else { lcd.setCursor(0, 0); lcd.print("Invalid Reading!"); } } }
در این تابع ()loop، کد وضعیت پرچم را بررسی می کند تا بداند آیا شی از آن عبور می کند یا خیر. اگر بله، آنگاه شروع به محاسبه اختلاف زمانی با استفاده از هر دو حسگر IR می کند و سرعت جسم متحرک را با استفاده از متغیرهای شناخته شده distanceBetweenSensors و timeDifference محاسبه می کند.
پس از آن، سرعت محاسبه شده با دو رقم اعشار روی صفحه LCD نمایش داده می شود. اگر اختلاف زمانی نامعتبر باشد، “Invalid Reading” را روی صفحه نمایش چاپ می کند. فرآیند فوق تا زمانی که هر دو سنسور فعال شده باشند تکرار می شود.
تست عملکرد تشخیص سرعت با برد آردوینو
کد را روی برد خود آپلود کنید و اکنون ما در مرحله نهایی آزمایش پروژه سنسور سرعت آردوینو برای اندازه گیری سرعت اجسام متحرک هستیم. در GIF زیر، می توانید عملکرد واقعی پروژه ما را ببینید.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود