Search Code

Senzor gestov, RGB a proximity APDS9960 pre Arduino

Senzor gestov, RGB a proximity APDS9960 pre Arduino

V tomto návode si ukážeme, ako používať modul snímača APDS9960, ktorý kombinuje detekciu gest, snímanie farieb RGB a snímanie blízkosti. Tento všestranný snímač dokáže detekovať pohyby v rôznych smeroch a možno ho integrovať do projektov na ovládanie motorov, svetiel alebo iných zariadení na základe gest rúk. Na konci tohto návodu budete rozumieť, ako zapojiť snímač a implementovať základnú detekciu gest vo vašich projektoch Arduino.

APDS-9960 gesture sensor module -1

Modul APDS9960 je kompaktný a vyžaduje minimálne zapojenie, čo z neho robí vynikajúcu voľbu pre interaktívne projekty. Na programovanie snímača budeme používať Arduino IDE a zobrazenie detekovaných gest na sériovom monitore. Pre vizuálny návod si pozrite video (vo videu o 00:00).

Vysvetlenie hardvéru

Kľúčovým komponentom tohto projektu je modul snímača APDS9960. Tento modul dokáže detekovať gestá, ako je potiahnutie doľava, doprava, nahor a nadol. Taktiež meria hodnoty farieb RGB a blízkosť k blízkym objektom. Snímač komunikuje s Arduinom pomocou I2C, čo zjednodušuje proces zapojenia a kódovania.

APDS9960 obsahuje viacero vnútorných snímačov: snímač gest, snímač farieb RGB a snímač okolitého svetla. Snímač gest používa infračervenú LED a fotodetektor na detekciu pohybov rúk, zatiaľ čo RGB snímač meria intenzity červeného, zeleného a modrého svetla na identifikáciu farieb. Snímač blízkosti určuje, ako blízko je objekt k snímaču, čo môže byť užitočné v rôznych aplikáciách.

Podrobnosti z datasheetu

Výrobca Avago Technologies
Označenie dielu APDS-9960
Logické/IO napätie 1,8 V až 3,6 V
Napájacie napätie 3,3 V
Výstupný prúd (na kanál) max. 20 mA
Špičkový prúd (na kanál) 100 mA
Odporúčanie pre PWM frekvenciu Neuplatňuje sa
Vstupné logické prahy 0,3 V (nízka), 0,7 V (vysoká)
Pokles napätia / RDS(on) / saturácia max. 0,5 V
Tepelné limity -40 až 85 °C
Puzdro 6-pinové LGA
Poznámky / varianty Žiadne

 

  • APDS9960 vždy napájajte napätím 3,3 V; vyššie napätia môžu snímač poškodiť.
  • Pri pripájaní viacerých zariadení zabezpečte správne pull-up rezistory na linkách I2C.
  • Udržujte snímač mimo priameho slnečného svetla, aby ste predišli rušeniu.
  • Pre stabilitu použite blokovací kondenzátor blízko napájacích pinov.
  • Uvedomte si rozsah snímania pre detekciu blízkosti (zvyčajne okolo 20 cm).

Pokyny na zapojenie

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

Na zapojenie modulu snímača APDS9960 k Arduinu postupujte podľa týchto krokov:

  • Pripojte pin VCC modulu APDS9960 na pin 3,3 V na Arduine.
  • Pripojte pin GND na jeden z pinov GND na Arduine.
  • Pripojte pin SDA na pin A4 Arduina (linka dát I2C).
  • Pripojte pin SCL na pin A5 Arduina (linka hodín I2C).
  • Pripojte pin INT na digitálny pin 2 na Arduine na spracovanie prerušení.

Upozorňujeme, že ak používate iný model Arduina, piny SDA a SCL sa môžu líšiť (napr. na Arduino Mega použite SDA na pine 20 a SCL na pine 21). Skontrolujte konkrétne mapovanie pinov pre vašu dosku. Pre rôzne konfigurácie si pozrite video (vo videu o 02:30).

Príklady kódu a vysvetlenie

Vo funkcii setup inicializujeme sériovú komunikáciu a snímač APDS9960. Pin prerušenia je nastavený na počúvanie udalostí gest. Tu je ukážka kódu setup:

void setup() {
  pinMode(APDS9960_INT, INPUT);
  Serial.begin(9600);
  Serial.println(F("APDS-9960 inicializácia..."));
  if (apds.init()) {
    Serial.println(F("Inicializácia dokončená"));
  } else {
    Serial.println(F("Inicializácia zlyhala"));
  }
}

Tento kód nastaví potrebné konfigurácie, aby sa zabezpečilo, že snímač je pripravený na použitie, a poskytuje spätnú väzbu v sériovom monitore.

Ďalej definujeme, ako spracovať gestá detekované snímačom. Funkcia handleGesture používa príkaz switch na určenie smeru gesta. Tu je zameraný výňatok:

void handleGesture() {
  if (apds.isGestureAvailable()) {
    switch (apds.readGesture()) {
      case DIR_UP:
        Serial.println("HORE");
        break;
      case DIR_DOWN:
        Serial.println("DOLU");
        break;
      // Ďalšie prípady pre doľava, doprava, blízko a ďaleko
    }
  }
}

Táto funkcia skontroluje, či je gesto dostupné, a prečíta jeho smer, pričom výsledok vytlačí do sériového monitora na spätnú väzbu. Pre úplnú implementáciu si pozrite celý kód načítaný nižšie pod článkom.

Demonštrácia / Čo očakávať

Keď spustíte program, mali by ste vidieť detekované gestá vytlačené na sériovom monitore, keď pohybujete rukou v rôznych smeroch. Napríklad potiahnutie nahor by malo zobraziť "HORE", zatiaľ čo potiahnutie nadol zobrazí "DOLU". Pri vykonávaní gest blízko a ďaleko držte ruku na sekundu stabilne (vo videu o 10:00).

Buďte opatrní s detekciou blízkosti snímača; ak pohybujete rukou príliš rýchlo alebo príliš ďaleko od snímača, nemusí gesto presne zaregistrovať. Toto je bežný problém, ktorý môže ovplyvniť výkon.

Časové značky videa

  • 00:00 - Úvod do senzora APDS9960
  • 02:30 - Pokyny na zapojenie
  • 05:15 - Vysvetlenie kódu
  • 10:00 - Ukážka rozpoznávania gest

Images

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).
Language: 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
    }
  }
}

Things you might need

Resources & references

Files📁

Fritzing File

Other files

  • APDS9960 Gesture Library from Robojax
    This library used for Gesture Sensor APDS9960 to detect movement of your hand and detect present color.
    robojax-gesture-APDS9960-Library.zip 0.30 MB
  • APDS9960 Datasheet
    this is the datasheet for APDS9960 chip. have a look at this file to learn more about it.
    robojax-gesture-APDS9960_datasheet.pdf 0.89 MB
  • APDS9960 Gesture Library
    Arduino library for the APDS9960 gesture, proximity, and color sensor. Provides functions to initialize the sensor, read gesture data, and configure detection thresholds. Supports I2C interface and operates at 3.3V.
    robojax-APDS9960-gesture-library.zip 0.30 MB
  • APDS9960 Gesture Datasheet
    Datasheet for the APDS9960 digital proximity, ambient light, RGB and gesture sensor. Features I2C interface, gesture detection with directional output, and operates at 2.4-3.6V.
    robojax-APDS9960-gesture-datasheet.pdf 0.89 MB