حساس(حس کننده) ژست APDS-9960 با آردوینو
حساس(حس کننده) ژست APDS-9960 امکان تشخیص حرکات دست مانند کشیدن انگشت و مجاورت را فراهم می کند. در این آموزش نحوه اتصال APDS-9960 به آردوینو و برنامه ریزی آن برای تشخیص حرکات را نشان خواهیم داد. نتیجه یک راه اندازی ساده خواهد بود که می تواند حرکات را تشخیص داده و آنها را از طریق نمایشگر مسلسل گزارش دهد. این راهنما به شما کمک می کند سیم کشی و شِفر (کود) مورد نیاز برای شروع کار با حساس(حس کننده) ژست را درک کنید. (در ویدیو ساعت 00:30)

سخت افزار توضیح داده شده است
APDS-9960 یک حساس(حس کننده) همه کاره است که ترکیبی از حساس(حس کننده) رنگ RGB، حساس(حس کننده) نور محیط، حساس(حس کننده) مجاورت و قابلیت های تشخیص ژست است. از طریق I2C با آردوینو ارتباط برقرار می کند ، که امکان ادغام آسان با حداقل سیم کشی را فراهم می کند. حساس(حس کننده) فقط با فرکانس 3.3 ولت کار می کند و اطمینان از سطوح ولتاژ مناسب برای جلوگیری از آسیب رساندن به دستگاه ضروری است. در این بیلد، ما از آردوینو برای خواندن داده های ژست استفاده خواهیم کرد. این حساس(حس کننده) اطلاعات ژست را از طریق وقفه ها خروجی می دهد، که به آردوینو اجازه می دهد تا به سرعت به حرکات دست پاسخ دهد. ادغام APDS-9960 با آردوینو امکانات زیادی را برای پروژه های تعاملی از جمله دستگاه های کنترل شده با ژست باز می کند.
جزئیات برگه داده
| تولید کننده | Broadcom |
|---|---|
| شماره قطعه | APDS-9960 |
| ولتاژ منطق / IO | 2.7 - 3.6 ولت |
| ولتاژ منبع تغذیه | 3.3 ولت |
| جریان خروجی (در هر کانال) | 1 میلی آمپر |
| حداکثر جریان (در هر کانال) | 10 میلی آمپر |
| هدایت فرکانس PWM | 100 هرتز |
| آستانه های منطق ورودی | 0.3 x ولتDd(کم)، 0.7 x VDd(بالا) |
| افت ولتاژ / RDS(روشن)/اشباع | حداکثر 0.5 ولت |
| محدودیت های حرارتی | -40 تا +85 درجه سانتی گراد |
| بسته | LGA 6 پایه |
| یادداشت ها / انواع | پشتیبانی از ارتباطات I2C |
- اطمینان حاصل کنید که ولتاژ منبع تغذیه از 3.6 ولت تجاوز نمی کند تا از آسیب جلوگیری شود.
- برای برقراری ارتباط قابل اعتماد از مقاومت های کششی در خطوط I2C استفاده کنید.
- حساس(حس کننده) را از نور مستقیم خورشید دور نگه دارید تا قرائت دقیق داشته باشید.
- مطمئن شوید که حساس(حس کننده) را به درستی در شِفر (کود) مقداردهی اولیه کنید.
- اتصالات سیم کشی را بررسی کنید تا از ورودی های شناور جلوگیری کنید.
دستورالعمل سیم کشی

برای سیم کشی APDS-9960 به آردوینو ، با اتصال برق شروع کنید. از یک سیم قرمز برای اتصال پایه VCC APDS-9960 به پایه 3.3 ولت آردوینو استفاده کنید. در مرحله بعد، پایه GND روی حساس(حس کننده) را با استفاده از یک سیم سیاه به یک پایه زمین روی آردوینو وصل کنید. اکنون، برای ارتباط I2C، پایه SDA APDS-9960 را به پایه A4 آردوینو وصل کنید. به طور مشابه، پایه SCL را به پایه A5 روی آردوینو وصل کنید. در نهایت، پایه INT حساس(حس کننده) را به پایه 2 روی آردوینو وصل کنید. این به آردوینو اجازه می دهد تا به وقفه های ایجاد شده توسط حساس(حس کننده) پاسخ دهد.
مثال های شِفر (کود) و بررسی
شِفر (کود) ارائه شده حساس(حس کننده) APDS-9960 را مقداردهی اولیه می کند و آردوینو را برای خواندن حرکات تنظیم می کند. در اینجا گزیده ای کوتاه از عملکرد راه اندازی آورده شده است:
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
attachInterrupt(0, interruptRoutine, FALLING);
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
}
}در این قطعه ، نمایشگر مسلسل را مقداردهی اولیه می کنیم و پایه وقفه را تنظیم می کنیم. حساس(حس کننده) مقداردهی اولیه می شود و یک پیام تأیید در کنسول چاپ می شود. در مرحله بعد، حرکات موجود در تابع حلقه را بررسی می کنیم:
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}در اینجا، حلقه به طور مداوم حرکات را بررسی می کند. هنگامی که حرکتی شناسایی می شود، وقفه غیرفعال می شود و تابع "handleGesture" برای پردازش ژست فراخوانی می شود. در نهایت، تابع 'handleGesture' حرکات شناسایی شده را پردازش می کند:
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
// Additional cases...
}
}
}در این عملکرد ، ژست خوانده می شود و اقدام مربوطه بر اساس جهت شناسایی شده انجام می شود. این امکان کنترل تعاملی بر اساس حرکات دست را فراهم می کند. برای درک کامل شِفر (کود)، لطفا به برنامه کامل بارگذاری شده در زیر مقاله مراجعه کنید.

تظاهرات / چه انتظاری باید داشت
پس از اتمام راه اندازی، می توانید انتظار داشته باشید که آردوینو حرکات را بخواند و جهت شناسایی شده را روی نمایشگر مسلسل نمایش دهد. امتحان های ساده شامل حرکت دادن دست به بالا، پایین، چپ یا راست جلوی حساس(حس کننده) است. اگر همه چیز به درستی سیم کشی شده باشد، باید خروجی مربوطه را روی نمایشگر مسلسل ببینید که تشخیص ژست را تأیید می کند. مراقب ورودی های شناور باشید، زیرا می توانند منجر به خوانش های متناقض شوند (در ویدیو در ساعت 05:20).
مهرهای زمانی ویدئو
- 00:00-مقدمه
- 01:15- بررسی اجمالی سخت افزار
- 03:00- دستورالعمل سیم کشی
- 04:30- راهنمای شِفر (کود)
- 06:15-تظاهرات
/*
* کد مربوط به سنسور حرکت APDS-9960 برای آردوینو
* این کد برای تشخیص حرکات دست شما، چه حرکت دادن آن به بالا، پایین، چپ یا راست باشد و چه حرکات دیگر، استفاده میشود.
*
* میتوان آن را تشخیص داد و برای کنترل چیز دیگری استفاده کرد.
*
* فیلم سنسور حرکت APDS-9960 را تماشا کنید https://youtu.be/qzSgZV_fbxI
* این کد را از https://robojax.com دریافت کنید
*
* کد استفاده شده در ویدیو توسط احمد شمشیری برای Robojax.com
* در تاریخ ۳۱ دسامبر ۲۰۱۶، ساعت ۶:۵۳ صبح در آژاکس، انتاریو، کانادا
* با توجه به اینکه این یادداشت همراه با کد نگه داشته میشود، اجازه اشتراکگذاری این کد داده شده است.
*
* سلب مسئولیت: این کد "به همین شکل" است و فقط برای اهداف آموزشی است.
*
* GestureTest.ino
* سنسور RGB و ژست APDS-9960
* Shawn Hymel @ SparkFun Electronics
* 30 مه 2014
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* تواناییهای حسگر ژست APDS-9960 را آزمایش میکند. APDS-9960 را از طریق I2C پیکربندی میکند و منتظر رویدادهای ژست میماند. جهت کشیدن انگشت (بالا، پایین، چپ، راست) را محاسبه کرده و آن را روی یک کنسول سریال نمایش میدهد.
*
* برای انجام یک ژست NEAR، دست خود را در فاصله بسیار دور از حسگر نگه دارید و آن را به حسگر نزدیک کنید (در فاصله 2 اینچی). دست خود را حداقل 1 ثانیه در آنجا نگه دارید و سپس آن را دور کنید.
*
* برای انجام یک ژست FAR، دست خود را حداقل 1 ثانیه در فاصله 2 اینچی از حسگر نگه دارید و سپس آن را از حسگر دور کنید (خارج از محدوده). اتصالات سختافزاری:
*
* مهم: APDS-9960 فقط میتواند 3.3 ولت را بپذیرد!
*
* عملکرد برد پین آردوینو APDS-9960
*
* تغذیه VCC 3.3 ولت
* GND GND Ground
* A4 SDA I2C Data
* A5 SCL I2C Clock
* 2 INT Interrupt
*
* منابع:
* شامل Wire.h و SparkFun_APDS-9960.h
*
* مشخصات محیط توسعه:
* نوشته شده با Arduino 1.0.5
* آزمایش شده با SparkFun Arduino Pro Mini 3.3V
*
* این کد بیارزش است؛ اگر من (یا هر کارمند SparkFun دیگری) را در فروشگاه محلی دیدید و کد ما را مفید یافتید، لطفاً یک دور از ما بخرید!
*
* به همین صورت توزیع شده است؛ هیچ ضمانتی ارائه نمیشود.
*/
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // ایجاد شیء سروو برای کنترل یک سروو
// پینها
#define APDS9960_INT 2 // باید یک پین وقفه باشد
// ثابتها
// متغیرهای سراسری
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
// پین وقفه را به عنوان ورودی تنظیم کنید
pinMode(APDS9960_INT, INPUT);
// مقداردهی اولیه پورت سریال
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// مقداردهی اولیه روال سرویس وقفه
attachInterrupt(0, interruptRoutine, FALLING);
// مقداردهی اولیه APDS-9960 (پیکربندی I2C و مقادیر اولیه)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// شروع به اجرای موتور حسگر حرکت APDS-9960 کنید
if ( apds.enableGestureSensor(true) ) {
Serial.println(F("Gesture sensor is now running"));
} else {
Serial.println(F("Something went wrong during gesture sensor init!"));
}
}
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
break;
case DIR_RIGHT:
Serial.println("RIGHT");
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
/*
* بهروزرسانی شده برای RoboJax توسط A.B.S. در ۹ مه ۲۰۱۷ در آژا، انتاریو، کانادا. www.RoboJax.com
*
* منبع اصلی:
* حساس(حس کننده) RGB و حرکتی APDS-9960
* شاون هایمل @ SparkFun Electronics
* ۳۰ مه ۲۰۱۴
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* به صورت فعلی توزیع شده است؛ هیچ ضمانتی داده نمیشود.
*/
#include <Wire.h>
// اضافه شده توسط RoboJax
#include <Servo.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // یک شیء سروو برای کنترل یک سروو ایجاد کنید // توسط RoboJax افزود شده است
// پایهها
#define APDS9960_INT 2 // باید یک پایه وقفه باشد
// ثابتها
// متغیرات جهانی
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
myservo.attach(9); // سرو را به پایه 9 متصل میکند به شیء سرو
// پایه قطع را به عنوان ورودی تنظیم کنید
pinMode(APDS9960_INT, INPUT);
// پورت سریال را راهاندازی کنید
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// روال خدمات وقفه را راهاندازی کنید
attachInterrupt(0, interruptRoutine, FALLING);
// راهاندازی APDS-9960 (پیکربندی I2C و مقادیر اولیه)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// اجرای موتور حساس(حس کننده) حرکت APDS-9960 را آغاز کنید
if ( apds.enableGestureSensor(true) ) {
Serial.println(F("Gesture sensor is now running"));
} else {
Serial.println(F("Something went wrong during gesture sensor init!"));
}
}
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
myservo.write(180); // اضافه شده توسط RoboJax
break;
case DIR_RIGHT:
Serial.println("RIGHT");
myservo.write(0); // اضافه شده توسط RoboJax
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
منابع و مراجع
هنوز هیچ منبعی موجود نیست.