شِفر (کود) جستجو

APDS9960 حساس(حس کننده) ژست، RGB و مجاورت برای آردوینو

APDS9960 حساس(حس کننده) ژست، RGB و مجاورت برای آردوینو

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

APDS-9960 gesture sensor module -1

ماجیول 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).

دستورالعمل‌های سیم‌کشی

Arduino wiring for APDS9960 Gesture sensor
Arduino wiring for APDS9960 Gesture sensor

برای سیم‌کشی ماجیول حساس(حس کننده) 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نمایش تشخیص ژست

تصاویر

APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -1
APDS-9960 gesture sensor module -1
Arduino wiring for APDS9960 Gesture sensor
Arduino wiring for APDS9960 Gesture sensor
87-This is code for an APDS9960 gesture, RGB, and proximity sensor module (6-pin).
زبان: C++
++
/*
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
    }
  }
}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

منابع و مراجع

فایل‌ها📁

فایل فریزینگ

سایر فایل‌ها

  • کتابخانه فرمان APDS9960 از Robojax
    این کتابخانه برای حساس(حس کننده) حرکتی APDS9960 استفاده می‌شود تا حرکت دست شما را تشخیص دهد و رنگ حاضر را شناسایی کند.
    robojax-gesture-APDS9960-Library.zip