Touchless Heart

În cadrul acestui proiect vom exemplifica utilizarea senzorului APDS-9960. Acest senzor poate fi utilizat în aplicații diverse de detecție a luminii, a culorilor, a proximității dar și a gesturilor. Detecția gesturilor utilizatorului este funcționalitatea inedită oferită de senzorul APDS-9960. Această funcționalitate o vom utiliza pentru a controla prin gesturi o inimă de hârtie semitransparentă în care vom introduce un LED brick RGB. La pornirea sistemului LED-ul va pulsa roșu. Dacă vom apropria mâna de montaj LED-ul va pulsa din ce în ce mai rapid sugerând  emoție. Dacă vom depărta mâna LED-ul își va schima culoare din roșu în verde sugerând dezamăgire. Există 6 gesturi ce pot fi captate de senzor: apropierea și depărtarea mâinii, mișcare la dreapta, stânga, sus și jos. Având în vedere acest lucru, sistemul propus poate fi complicat mai ales că LED-ul utilizat poate genera o multitudine de culori și moduri de funcționare. Puteți crea o poveste proprie în care să îmbinați gesturi, culori și o „inimă de neatins”.

Pentru implementarea algoritmului de funcționare vom utiliza o placă de dezvoltare Arduino Uno dar poate fi utilizată orice placă Arduino. Conectarea dintre senzor și placa de dezvoltare se va face utilizând magistrala I2C, schema de interconectare este următoarea:

3

Pinul INT al senzorului se va conecta la pinul D2 al plăcii de dezvoltare, SCL la A5, SDA la A4, VCC la 3.3V și GND la GND. Pentru mai multe informații despre funcționarea senzorului APDS-9960 puteți consulta: „APDS-9960 RGB and Gesture Sensor Hookup Guide”.

Brick-ul LED RGB se conectează la placa de dezvoltare prin intermediul pinilor D5 (red), D6 (green) și D9 (blue) – toți cei trei pini ai plăcii de dezvoltare au capabilitatea de a genera semnal PWM adică puteți folosi și efecte de aprindere parțială a oricărei dintre cele trei culori (roșu, verde, albastru).

Programul sistemului este derivat din exemplul GestureTest.ino al bibliotecii Sparkfun APDS-9960 RGB and Gesture Sensor. Programul a fost testat utilizând Arduino IDE 1.8.5 și biblioteca Sparkfun APDS-9960 RGB and Gesture Sensor 1.4.2. În consola serială se va afișa interpretarea gesturilor recunoscute de senzor (FAR, NEAR, UP, DOWN, LEFT, RIGHT) chiar dacă pentru comanda inimii sunt folosite doar două (FAR și NEAR). NONE semnifică nerecunoaștere gestului.

4

#include <Wire.h>

#include <SparkFun_APDS9960.h>

#define APDS9960_INT    2

#define redPin   5

#define greenPin 6

#define bluePin 9

SparkFun_APDS9960 apds = SparkFun_APDS9960();

int isr_flag = 0;

byte r,g,b;

int beat;

void setup() {

  pinMode(APDS9960_INT, INPUT);

  pinMode(redPin, OUTPUT);

  pinMode(greenPin, OUTPUT);

  pinMode(bluePin, OUTPUT);

  Serial.begin(9600);

  Serial.println();

  Serial.println(F(“——————————–“));

  Serial.println(F(“Touchless Heart – Start beating…”));

  Serial.println(F(“——————————–“));

  attachInterrupt(0, interruptRoutine, FALLING);

  if ( apds.init() ) {

    Serial.println(F(“APDS-9960 initialization

complete”));

  } else {

    Serial.println(F(“Something went wrong during APDS-

9960 init!”));

  }

  if ( apds.enableGestureSensor(true) ) {

    Serial.println(F(“Gesture sensor is now running”));

  } else {

    Serial.println(F(“Something went wrong during gesture

sensor init!”));

  }

  r=255;

  g=0;

  b=0;

  beat = 1000;

}

Programul pornește cu un beat (interval de timp aprins / stins) de 1000 ms (1 secundă). La fiecare semn de apropriere (NEAR) recunoscut din acesta se scade 100 ms. La semnul de îndepărtare (FAR) intervalul revine la 1000 ms.

void loop() {

  if( isr_flag == 1 ) {

    detachInterrupt(0);

    handleGesture();

    isr_flag = 0;

    attachInterrupt(0, interruptRoutine, FALLING);

  }

  color(r,g,b);

  delay(beat);

  color(0,0,0);

  delay(beat);

}

void color(byte red, byte green, byte blue) {

  analogWrite(redPin, red);

  analogWrite(greenPin, green);

  analogWrite(bluePin, blue);

}

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”);

        r=255;

        g=0;

        beat-=100;

        break;

      case DIR_FAR:

        Serial.println(“FAR”);

        r=0;

        g=255;

        beat = 1000;

        break;

      default:

        Serial.println(“NONE”);

    }

  }

}

Vă recomandăm și un proiect interesant ce utilizează senzorul APDS-9960 pentru a detecta culorile: „Arduino Color Differentiate /with Apds-9960”.