APDS9960 حساس(حس کننده) ژست، RGB و مجاورت برای آردوینو
در این آموزش به نحوه استفاده از ماجیول حساس(حس کننده) APDS9960 میپردازیم که قابلیتهای تشخیص ژست، حساس(حس کننده) رنگ RGB و تشخیص مجاورت را با هم ترکیب کرده است. این حساس(حس کننده) چندمنظوره میتواند حرکتها را در جهات مختلف تشخیص دهد و قابل ادغام در پروژههایی برای کنترل موتورها، چراغها یا سایر دستگاهها بر اساس ژستهای دست است. تا پایان این آموزش، خواهید دانست چگونه حساس(حس کننده) را سیمکشی کنید و تشخیص پایهای ژستها را در پروژههای آردوینو پیادهسازی نمایید.

ماجیول APDS9960 جمعوجور است و سیمکشی کمی نیاز دارد، که آن را به گزینهای عالی برای پروژههای تعاملی تبدیل میکند. ما از Arduino IDE برای برنامهنویسی حساس(حس کننده) استفاده خواهیم کرد و ژستهای تشخیصدادهشده را در نمایشگر مسلسل نمایش خواهیم داد. برای راهنمای تصویری، به ویدیو (در 00:00) مراجعه کنید.
شرح سختافزار
عنصر کلیدی این پروژه ماجیول حساس(حس کننده) APDS9960 است. این ماجیول قادر به تشخیص ژستهایی مانند کشیدن به چپ، کشیدن به راست، کشیدن به بالا و کشیدن به پایین است. همچنین مقادیر رنگ RGB و فاصله تا اشیاء نزدیک را اندازهگیری میکند. این حساس(حس کننده) از طریق I2C با آردوینو ارتباط برقرار میکند که سیمکشی و کدنویسی را ساده میکند.
APDS9960 شامل چندین حساس(حس کننده) داخلی است: یک حساس(حس کننده) ژست، یک حساس(حس کننده) رنگ RGB و یک حساس(حس کننده) نور محیط. حساس(حس کننده) ژست از یک LED مادونقرمز و یک فتودتکتور برای تشخیص حرکات دست استفاده میکند، در حالی که حساس(حس کننده) RGB شدتهای نور قرمز، سبز و آبی را برای شناسایی رنگها اندازهگیری میکند. حساس(حس کننده) مجاورت مشخص میکند که یک جسم چقدر به حساس(حس کننده) نزدیک است که میتواند در کاربردهای مختلف مفید باشد.
جزئیات دیتاشیت
| تولیدکننده | اواگو تکنولوژیز |
|---|---|
| شماره قطعه | APDS-9960 |
| ولتاژ منطق/ورودی/خروجی | 1.8 V تا 3.6 V |
| ولتاژ تغذیه | 3.3 ولت |
| جریان خروجی (به ازای هر کانال) | حداکثر 20 mA |
| جریان پیک (برای هر کانال) | 100 میلیآمپر |
| راهنمای فرکانس PWM | قابل اعمال نیست |
| آستانههای منطقی ورودی | 0.3 V (پایین)، 0.7 V (بالا) |
| افت ولتاژ / Rمقاومت درین-سورس در حالت روشن/ اشباع | حداکثر 0.5 V |
| محدودیتهای حرارتی | -40 تا 85 °C |
| بسته | 6-پایه LGA |
| یادداشتها / واریانتها | هیچ |
- همیشه APDS9960 را با 3.3V تغذیه کنید؛ ولتاژهای بالاتر میتوانند به حساس(حس کننده) آسیب برسانند.
- اگر چندین دستگاه را متصل میکنید، از وجود مقاومتهای pull-up مناسب روی خطوط I2C اطمینان حاصل کنید.
- حساس(حس کننده) را از نور مستقیم خورشید دور نگه دارید تا از تداخل جلوگیری شود.
- برای پایداری، یک خازن دکوپلینگ را نزدیک پایههای تغذیه قرار دهید.
- از محدوده تشخیص نزدیکی آگاه باشید (معمولاً حدود 20 cm).
دستورالعملهای سیمکشی

برای سیمکشی ماجیول حساس(حس کننده) APDS9960 به آردوینو خود، مراحل زیر را دنبال کنید:
- وصل کنید
VCCپایه APDS9960 به پایه 3.3V روی آردوینو. - وصل کنید
GNDپایه را به یکی از پایههای GND روی آردوینو متصل کنید. - وصل کنید
SDAپایه به آردوینوA4پایه (خط داده I2C). - وصل کنید
SCLپایه به آردوینوA5پایه (خط کلاک I2C). - متصل کنید
INTپایه به پایه دیجیتال2روی آردوینو برای مدیریت وقفهها.
توجه داشته باشید که اگر از مدل Arduino دیگری استفاده میکنید، پایههای SDA و SCL ممکن است متفاوت باشند (مثلاً در Arduino Mega ازSDAروی پایه 20 وSCLروی پایه 21). مطمئن شوید نقشهبندی دقیق پایهها برای برد خود را بررسی کنید. برای پیکربندیهای مختلف، به ویدئو (در 02:30) مراجعه کنید.
نمونههای شِفر (کود) و راهنمای گامبهگام
در تابع setup، ارتباط سریال و حساس(حس کننده) APDS9960 را مقداردهی اولیه میکنیم. پایه وقفه برای گوش دادن به رویدادهای ژست تنظیم شده است. در اینجا یک قطعه از شِفر (کود) setup آمده است:
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
Serial.println(F("APDS-9960 initialization..."));
if (apds.init()) {
Serial.println(F("Initialization complete"));
} else {
Serial.println(F("Initialization failed"));
}
}این شِفر (کود) تنظیمات لازم را انجام میدهد تا اطمینان حاصل کند که حساس(حس کننده) آمادهٔ استفاده است و بازخورد را در نمایشگر مسلسل نمایش میدهد.
در مرحله بعد، نحوهٔ پردازش ژستهایی که توسط حساس(حس کننده) تشخیص داده شدهاند را تعریف میکنیم. اینhandleGestureاین تابع از یک عبارت switch برای تعیین جهت ژست استفاده میکند. در اینجا یک بخشِ متمرکز آمده است:
void handleGesture() {
if (apds.isGestureAvailable()) {
switch (apds.readGesture()) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
// Additional cases for left, right, near, and far
}
}
}این تابع بررسی میکند که آیا ژست در دسترس است و جهت آن را میخواند و نتیجه را برای بازخورد در نمایشگر مسلسل چاپ میکند. برای جزئیات کامل پیادهسازی حتماً به شِفر (کود) کامل بارگذاریشده در پایینِ مقاله مراجعه کنید.
نمایش / آنچه باید انتظار داشته باشید
وقتی برنامه را اجرا میکنید، باید ژستهای شناساییشده را هنگام حرکت دستتان در جهتهای مختلف روی نمایشگر مسلسل مشاهده کنید. برای مثال، کشیدن دست به سمت بالا باید "UP" را نمایش دهد، در حالی که کشیدن به سمت پایین "DOWN" را نشان میدهد. مطمئن شوید هنگام اجرای ژستهای نزدیک و دور، دستتان را برای یک ثانیه ثابت نگه دارید (در ویدئو در 10:00).
در مورد تشخیص نزدیکی حساس(حس کننده) محتاط باشید؛ اگر دستتان را خیلی سریع یا خیلی دور از حساس(حس کننده) حرکت دهید، ممکن است ژست بهدرستی ثبت نشود. این یک مشکل رایج است که میتواند عملکرد را تحت تأثیر قرار دهد.
برچسبهای زمانی ویدیو
- 00:00- مقدمهای بر حساس(حس کننده) APDS9960
- 02:30- دستورالعملهای سیمکشی
- 05:15- توضیحات شِفر (کود)
- 10:00نمایش تشخیص ژست
++
/*
This is code for an APDS9960 Gesture, RGB, Proximity sensor module (6 pin).
* Watch the video on how to use APDS9960: https://youtu.be/jjXx0V13rNs
*/
/*
* This code has been modified from the Arduino library.
* Explained by Ahmad S. on March 25, 2018 at 21:19
* in Ajax, Ontario, Canada
* for Robojax.com
*
*/
/****************************************************************
GestureTest.ino
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
Tests the gesture sensing abilities of the APDS-9960. Configures
APDS-9960 over I2C and waits for gesture events. Calculates the
direction of the swipe (up, down, left, right) and displays it
on a serial console.
To perform a NEAR gesture, hold your hand
far above the sensor and move it close to the sensor (within 2
inches). Hold your hand there for at least 1 second and move it
away.
To perform a FAR gesture, hold your hand within 2 inches of the
sensor for at least 1 second and then move it above (out of
range) of the sensor.
Hardware Connections:
IMPORTANT: The APDS-9960 can only accept 3.3V!
Arduino Pin APDS-9960 Board Function
3.3V VCC Power
GND GND Ground
A4 SDA I2C Data
A5 SCL I2C Clock
2 INT Interrupt
Resources:
Include Wire.h and SparkFun_APDS-9960.h
Development environment specifics:
Written in Arduino 1.0.5
Tested with SparkFun Arduino Pro Mini 3.3V
This code is beerware; if you see me (or any other SparkFun
employee) at the local, and you've found our code helpful, please
buy us a round!
Distributed as-is; no warranty is given.
****************************************************************/
#include <Wire.h>
#include <SparkFun_APDS9960.h>
// Pins
#define APDS9960_INT 2 // Needs to be an interrupt pin
// Constants
// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
// Set interrupt pin as input
// Robojax Video Tutorial
pinMode(APDS9960_INT, INPUT);
// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Initialize interrupt service routine
attachInterrupt(0, interruptRoutine, FALLING);
// Initialize APDS-9960 (configure I2C and initial values)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// Robojax Video Tutorial
// Start running the APDS-9960 gesture sensor engine
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);
// Robojax Video Tutorial
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
// Robojax Video Tutorial
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
// Robojax Video Tutorial
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 Video Tutorial
}
}
}
مواردی که ممکن است به آنها نیاز داشته باشید
-
آمازون
-
علیاکسپرسحساس(حس کننده) AM2302 یا DHT11 یا DHT22 را از علیاکسپرس خریداری کنیدs.click.aliexpress.com
منابع و مراجع
-
خارجیکتابخانه Adafruit APDS9960 (از گیتهاب)github.com
فایلها📁
فایل فریزینگ
-
حساس(حس کننده) RGB و حرکتی APDS 9960
apds_9960_rgb_and_gesture_sensor.fzpz0.01 MB
سایر فایلها
-
کتابخانه فرمان APDS9960 از Robojaxاین کتابخانه برای حساس(حس کننده) حرکتی APDS9960 استفاده میشود تا حرکت دست شما را تشخیص دهد و رنگ حاضر را شناسایی کند.
robojax-gesture-APDS9960-Library.zip