برد آردوینو Arduino Nano 33 Sense از سنسور امبدد داخلی APDS-9960 بهره برده است. سنسور امبدد APDS9960 برای اندازه گیری دیجیتالی فاصله Proximity, نور محیط Ambient Light برای تشخیص رنگ های RGB و حرکت استفاده میشود. در بخش سوم از سری آموزش های برد آردوینو نانو ۳۳ به معرفی این سنسور و راه اندازی و کدنویسی آن خواهیم پرداخت. در ادامه راه اندزای سنسور APDS9960 با مرجع تخصصی آردوینو نانو به زبان فارسی، دیجی اسپارک همراه باشید.
سنسور نور رنگ حرکت APDS960
سنسور APDS9960 چند کار مختلف را انجام میدهد. یک سنسور تشخیص حرکت Gesture Detection, تشخیص فاصله Proximity Detection, تشخیص دیجیتال نور محیط ALS و تشخیص رنگ RGB است. سنسور اسلیم با ابعاد بسیار کوچک در حدود L 3.94 × W 2.36 × H 1.35 mm است. این سنسور از فبلتر مسدود کننده UV , IR برخوردار است.این سنسور قابلیت برنامه ریزی داشته و برای پروژه های بسیار دقیق مورد استفاده قرار میگیرد. از این سنسور جهت تشخیص از پشت شیشه های تاریک هم استفاده میشود. از سنسور فاصله و مجاورت برای تشخیص رد نور محیط، درایور قابل برنامه ریزی برای عبور جریان IR LED استفاده میکند. سنسور حرکتی Gesture از مجموع چهار دیود حساس به حرکت ساخته شده است و برای رد نور محیط هم کاربر دارد. از رابط i2c برای انتقال سریع دیتا استفاده میکند. در ادامه هر کدام از ماهیت های این سنسور را با کدنویسی و تست با هم بررسی میکنیم.
نصب کتابخانه Arduino_APDS9960
برای نصب کتابخانه Arduino_APDS9960 از منو نرم افزار آردوینو بر روی LIBARAY کلیک کنید. در آموزش تحلیل و بررسی کتابخانه APDS9960 توابع کاربردی و مورد استفاده در این سنسور را بررسی کردهایم. در تصویر زیر مراحل نصب کتابخانه در نرم افزار Arduino IDE2 را مشاهده میکنید. کتابخانه سنسور APDS9960 را نصب کنید و سپس در برنامه ها فراخوانی کنید.
راه اندازی سنسور Gesture Detection
سنسور تشخیص حرکت Gesture از چهار فتودیود جهت دار برای تشخیص انرژی IR منعکس شده به دیتای قابل فهم دیجیتال استفاده میکند. معماری از سنسور بر اساس نتایج دریافتی از ماهیت مجاروتی از تشخیص اتوماتیک برخوردار است که برای تشخیص حرکت استفاده میکند. از این قابلیت در ساخت تلفن های همراه هم برای تشخیص up down left right استفاده شده است. در ساخت این تراشه مصرف برق و نویز با زمان بندی LED قابل تنظیم IR به حداقل رسیده است. این ماهیت قابلیت تشخیص حالت های زیر را دارد.
- حرکت به بالا
- حرکت به پایین
- حرکت به راست
- حرکت به چپ
کد آردوینو تشخیص حرکت
کدهای زیر را به نرم افزار آردوینو منتقل کنید. خروجی آن را برد آردوینو نانو ۳۳ با تغییراتی که سنسور APDS9960 دارد، مشاهده خواهید کرد.
//APDS-9960 - Gesture Sensor // Gesture directions are as follows: //- UP: from USB connector towards antenna // - DOWN: from antenna towards USB connector //- LEFT: from analog pins side towards digital pins side //- RIGHT: from digital pins side towards analog pins side #include <Arduino_APDS9960.h> // فراخوانی کتابخانه void setup() { Serial.begin(9600); // فراخوانی سریال مانیتور while (!Serial); if (!APDS.begin()) { Serial.println("Error initializing APDS-9960 sensor!"); // در صورت عدم برقراری ارتباط } Serial.println("Detecting gestures ..."); } void loop() { if (APDS.gestureAvailable()) { // حرکت تشخیص داده شده است و بر روی سریال مانیتور نمایش داده میشود int gesture = APDS.readGesture(); switch (gesture) { case GESTURE_UP: // تشخیص حرکت بالا Serial.println("Detected UP gesture"); break; case GESTURE_DOWN: // تشخیص حرکت پایین Serial.println("Detected DOWN gesture"); break; case GESTURE_LEFT: //تشخیص حرکت چپ Serial.println("Detected LEFT gesture"); break; case GESTURE_RIGHT: // تشخیص حرکت راست Serial.println("Detected RIGHT gesture"); break; default: break; } } }
در ابتدا کتابخانه تراشه APDS9960 فراخوانی میشود. در این کد با توجه به اینکه میخواهیم حالت های مختلف از سنسور را بررسی کنیم بهترین انتخاب استفاده از ساختار تصمیم گیری Swich Case است. در این مرحله بهترین انتخاب استفاده از ساختار تصمیم switch است. برای Switch از حالت یا همان case استفاده میکنیم. ساختار Switch میتواند بدون default باشد. مقادیر case ها نمیتواند با هم مساوی باشد. اگر در یک case از دستور break استفاده نشود با مقدار case بعدی or میشود. تفاوت if , switch این است که در ساختار if میتوانید عبارت منطقی و رابطه ای را بررسی کنید و در ساختار switch فقط مساوی بودن مقادیر بررسی میشود.
switch (var) { case label1: // statements break; case label2: // statements break; default: // statements break; }
برای نمایش حرکت از ۴ کیس Case مختلف برای کد برنامه استفاده میکنیم.
switch (gesture) { case GESTURE_UP: // تشخیص حرکت بالا Serial.println("Detected UP gesture"); break; case GESTURE_DOWN: // تشخیص حرکت پایین Serial.println("Detected DOWN gesture"); break; case GESTURE_LEFT: //تشخیص حرکت چپ Serial.println("Detected LEFT gesture"); break; case GESTURE_RIGHT: // تشخیص حرکت راست Serial.println("Detected RIGHT gesture"); break; default: break;
دیتا توسط دستور زیر از سنسور خوانده شده و در یک متغیر با نام دلخواه ذخیره شده است.
int gesture = APDS.readGesture();
با دستور setGestureSensitivity(..) حساسیت سنسور بین ۱ تا ۱۰۰ است و بیشتر از این مقدار نویز و حساسیت را بالا میبرد و عددی کمتر تشخیص نادرست خواهد بود. به صورت پیشفرض عدد حساسیت را روی ۸۰ تنظیم میکنیم.
//APDS.setGestureSensitivity(80);
به همین ترتیبی که در کدها نوشته شده است، سنسور را در جهت های مخنلف حرکت دهید تا در سریال مانیتور پیغام تشخیص حرکت در راست، چپ، بالا و پایین نمایش داده شود. کد را کپی و به نرم افزار Arduino IDE 2 انتقال دهید. سپس سریال مانیتور را باز کرده و نتیجه را مشاهده کنید.
راه اندازی سنسور APDS9960
ویژگی تشخیص رنگ COLOR و ویژگی تشخیص ASL برای ما دیتای رنگ قرمز، سبز و آبی را تولید میکند. هر کانال RGBC دارای فیلتر مسدود کننده UV , IR اختصاصی هستند که در نهایت داده های ۱۶بیتی را شبیه سازی میکنند. معماری این سنسور این امکان را فراهم میکند تا نور محیط و رنگ ها با دقت بالا اندازه گیری شود. علاوه بر این قابلیت اندازه گیری دمای رنگ و کنترل نور پس زمینه هم فراهم است.
- تشخیص رنگ RGB
- کنترل نور پس زمینه
کد آردوینو تشخیص رنگ
//APDS-9960 - Color Sensor //Nano 33 BLE Sense and prints the color RGB (red, green, blue) values #include <Arduino_APDS9960.h> //فراخوانی کتابخانه void setup() { Serial.begin(9600); // فراخوانی سریال مانیتور while (!Serial); if (!APDS.begin()) { Serial.println("Error initializing APDS-9960 sensor."); } } void loop() { // بررسی میکنه اگر رنگ خوانده شده بود while (! APDS.colorAvailable()) { delay(5); } int r, g, b; // سه متغیر برای سه رنگ اصلی تعریف میکنیم. // توسط این دستور رنگ ها خوانده میشود APDS.readColor(r, g, b); //چاپ نتیجه دریافتی از رنگ ها Serial.print("r = "); // کد رنگ قرمز Serial.println(r); Serial.print("g = "); // کد رنگ سبز Serial.println(g); Serial.print("b = "); // کد رنگ آبی Serial.println(b); Serial.println(); // توقف کوتاه برای خواندن دیتای جدید از سنسور delay(1000); }
تحلیل کد آردوینو تشخیص رنگ
کد را کپی و به نرم افزار آردوینو ARDUINO IDE 2 انتقال دهید. در خط اول برنامه کتابخانه سنسور را اضافه کنید.
#include <Arduino_APDS9960.h> //فراخوانی کتابخانه
در دستور زیر مشخص میکنیم که اگر سنسور تشخیص رنگ را انجام دهد و یا ارتباط قطع شده باشد، با پیغام به ما نمایش دهد.
while (!Serial); if (!APDS.begin()) { Serial.println("Error initializing APDS-9960 sensor."); }
در حلقه برنامه در ابتدا اگر رنگ خوانده شده در دسترس بود، رنگ ها را خوانده و سپس برای هر رنگ اصلی یک متغیر برای تفکیک دیتاها تعریف میکند.
while (! APDS.colorAvailable()) { delay(5); } int r, g, b; // سه متغیر برای سه رنگ اصلی تعریف میکنیم.
دیتای رنگ توسط دستور زیر خوانده میشود.
APDS.readColor(r, g, b);
در نهایت کد رنگ خوانده شده R , G, B به صورت جداگانه بر روی سریال مانیتور نمایش داده میشود.
Serial.print("r = "); // کد رنگ قرمز Serial.println(r); Serial.print("g = "); // کد رنگ سبز Serial.println(g); Serial.print("b = "); // کد رنگ آبی Serial.println(b); Serial.println();
کد را کپی و به نرم افزار انتقال داده و کامپایل کنید. سپس سریال مانیتور Serial Monitor را باز کنید. سنسور را به رنگ های محتلف نزدیک کنید تا متوجه تغییر رنگ ها و نمایش کد هر رنگ بر روی سریال مانیتور شوید. با تغییر رنگ ها و قرار دادن اجسام رنگی در مقابل سنسور کد رنگ تشخیص داده شده نمایش داده میشود.
راه اندازی سنسور تشخیص فاصله Proximity
بله یکی دیگر از ویژگی های سنسور APDS9960 اندازه گیری فاصله مجاورت است که با قرار گرفتن یک شی در مقابل سنسور فاصله اندازه گیری شده و با جا به جایی شی فاصله تغییر کرده و قابل نمایش است. از سنسورهای کاربردی برای اجرای پروژه ها است و یک برد کامل در اختیار شما قرار میدهد. معماری این سنسور از فتودیود تشکیل شده که برای تشخیص دقیق کالیبره شده است.
- تشخیص فاصله
کد آردوینو تشخیص فاصله
// APDS-9960 - Proximity Sensor #include <Arduino_APDS9960.h> //فراخوانی کتابخانه void setup() { Serial.begin(9600); //فعال سازی سریال مانیتور while (!Serial); // درصورت عدم برقرای ارتباط پیام دهد if (!APDS.begin()) { Serial.println("Error initializing APDS-9960 sensor!"); } } void loop() { // بررسی میکنه اگردیتای خوانده شد در دسترس بود if (APDS.proximityAvailable()) { //دیتا را بخواند // - ۰ => به معنی عدم وجود تشخیص و فاصله // - ۲۵۵ => خیلی دور // - -۱ => ارور int proximity = APDS.readProximity(); // خواندن دیتا از سنسور // نمایش در سریال مانیتور Serial.println(proximity); } // توقف برای چند ثانیه و خواندن دیتای جدید delay(100); }
تحلیل کد آردوینو تشخیص فاصله
کد را کپی و به نرم افزار آردوینو ARDUINO IDE 2 انتقال دهید. در خط اول برنامه کتابخانه سنسور را اضافه کنید.
#include <Arduino_APDS9960.h> //فراخوانی کتابخانه
در دستور زیر مشخص میکنیم که اگر سنسور تشخیص فاصله را انجام دهد و یا ارتباط قطع شده باشد، با پیغام به ما نمایش دهد.
while (!Serial); // درصورت عدم برقرای ارتباط پیام دهد if (!APDS.begin()) { Serial.println("Error initializing APDS-9960 sensor!"); }
توسط این دستور بررسی میکند اگر دیتای خوانده شده در دسترس بود با نمایش هر عدد چه مفهومی را به ما میرساند. اگر صفر باشد، تشخیص انجام نشده است، اگر -۲۵۵ باشد دور است، اگر -۱ باشد ارور است.
if (APDS.proximityAvailable()) { //دیتا را بخواند // - ۰ => به معنی عدم وجود تشخیص و فاصله // - ۲۵۵ => خیلی دور // - -۱ => ارور
در نهایت توسط دستور زیر دیتای فاصله از سنسور خوانده شده و در یک متغیر با نام دلخواه ذخیره شده است.
int proximity = APDS.readProximity(); // خواندن دیتا از سنسور
سپس دیتای بر روی سریال مانیتور Serial Monitor نمایش داده میشود.
Serial.println(proximity);
کد را کپی و به نرم افزار انتقال داده و کامپایل کنید. سپس سریال مانیتور Serial Monitor را باز کنید.مانع ها را به سنسور نزدیک کرده و نتیجه را در سریال مانیتور رصد کنید.
جمع بندی لیدی پای
سنسور apds9960 به تنهایی قابلیت تشخیص رنگ، فاصله و حرکت را دارد. تصور کنید در یک پروژه برای اندازه گیری پارامترهای محیطی نیاز به تمامی این دیتاها دارید و برای هر کدام بایستی یک سنسور جداگانه تهیه و به برد میکروکنترلر متصل کنید! از خطای برقراری ارتباط سنسورها گرفته تا اتصال کابل، نویزها، کدنویسی هرکدام، همه و همه چالش هایی را در مسیر اجرای پروژه در پیش رو دارد. برد آردوینو Arduino nano 33 از این ماهیت امبدد استفاده کرده تا بدون نیاز به هیچ سنسوری که به صورت جداگانه به بردها وصل شود، چندین نیاز ما را در یک پروژه برطرف کند! در این آموزش به معرفی این سنسور پرداخته شده است و با هر کد و تحلیل آن به راحتی میتوانید از هر سنسور جداگانه دیتا دریافت کنید.
وسایل مورد نیاز
برد آردوینو Arduino Nano 33 Sense BLE
چنانچه در مراحل راه اندازی برد ARDUINO NANO 33 SENSE BLE و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
رنگ rgb رو هم تشخیص میده ؟
با سلام
بله از rgb پشتیبانی میکند.
سلام آیا پایه های GPIO با برد nano یکسانه؟
با سلام
بله عملکرد کدنویسی و اجرا دقیقا مشابه همان کاری است که برای برد آردوینو نانو انجام میدادیم.
چقدر عجیب شده این تراشه میتونه سه تا پارامتر فقط اندازه بگیره! خوب اینکه خیلی باصرفه است الکی جو میدن گرونه گرونه همین سنسورها رو بخوای تکی بخری دو برابر برد اصلی باید پول بدی
با سلام
کاربر گرامی
سپاس از همراهی شما امیدوارم مفید واقع شده باشد.