كود البحث

APDS9960، مستشعر الإيماءات وRGB والقرب لأردوينو

APDS9960، مستشعر الإيماءات وRGB والقرب لأردوينو

في هذا الدرس سنستكشف كيفية استخدام وحدة المستشعر APDS9960، التي تجمع بين كشف الإيماءات واستشعار الألوان RGB وقدرات استشعار القرب. هذا المستشعر متعدد الاستخدامات يمكنه اكتشاف الحركات في اتجاهات مختلفة ويمكن دمجه في مشاريع للتحكم بالمحركات أو الأضواء أو أجهزة أخرى بناءً على إيماءات اليد. بنهاية هذا الدرس ستفهم كيفية توصيل أسلاك المستشعر وتنفيذ كشف الإيماءات الأساسي في مشاريع أردوينو الخاصة بك.

APDS-9960 gesture sensor module -1

وحدة APDS9960 صغيرة الحجم وتتطلب توصيلات قليلة، مما يجعلها خيارًا ممتازًا للمشاريع التفاعلية. سنستخدم Arduino IDE لبرمجة المستشعر وعرض الإيماءات المكتشفة على المراقب التسلسلي. للحصول على دليل بصري، راجع الفيديو عند (00:00).

شرح الأجهزة

المكون الرئيسي في هذا المشروع هو وحدة المستشعر APDS9960. تستطيع هذه الوحدة اكتشاف الإيماءات مثل السحب لليسار، السحب لليمين، السحب للأعلى، والسحب للأسفل. كما تقيس قيم ألوان RGB والقرب من الأجسام القريبة. يتواصل المستشعر مع لوحة Arduino عبر واجهة 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
حزمةLGA ذو 6 دبابيس
ملاحظات / متغيراتلا شيء

  • زوّد جهاز APDS9960 دائمًا بجهد 3.3V؛ الجهد الأعلى قد يتلف المستشعر.
  • تأكد من وجود مقاومات سحب مناسبة على خطوط I2C عند توصيل عدة أجهزة.
  • أبقِ المستشعر بعيدًا عن أشعة الشمس المباشرة لتجنب التداخل.
  • استخدم مكثف فصل بالقرب من دبابيس الطاقة لتحقيق الاستقرار.
  • كن على دراية بنطاق الاستشعار للكشف عن القرب (عادةً حوالي 20 سم).

تعليمات الأسلاك

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. تم إعداد دبوس المقاطعة للاستماع إلى أحداث الإيماءات. فيما يلي مقتطف من كود الإعداد:

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
    }
  }
}

الأشياء التي قد تحتاجها

الموارد والمراجع

ملفات📁

Fritzing File

ملفات أخرى