Arduino, Tutoriels

Comment utiliser le capteur APDS9960 de proximité, de gestes et de lumière ambiante avec l’Arduino

Comment Utiliser Le Capteur Apds9960 De Proximité, De Gestes Et De Lumière Ambiante Avec L'Arduino

Introduction

Le capteur APDS9960 est un capteur de proximité, de gestes et de lumière ambiante qui utilise une technologie de détection de gestes sophistiquée pour détecter les mouvements de la main et les gestes à proximité de l’appareil. Le capteur est un excellent choix pour les projets qui nécessitent une interaction homme-machine sans contact direct avec un écran tactile. Dans ce tutoriel, nous allons vous montrer comment interfacer le capteur APDS9960 avec Arduino.

Vue d’ensemble du matériel du capteur APDS9960

Le capteur APDS9960 est fourni avec une carte de développement compatible avec la breadboard et d’autres composants électroniques, comme celle illustrée ci-dessous.

 Capteur De Proximité, De Gestes Et De Lumière Ambiante Apds9960

Capteur de gestes APDS9960 RGB infrarouge

Il y a six connexions de broches, à savoir :

  • VL – Il s’agit d’une alimentation en option pour la LED IR. Elle est utilisée lorsque le cavalier PS est retiré et doit avoir une tension de 3,0 à 4,5 V CC.
  • GND – Connexion à la terre d’un microcontrôleur.
  • VCC – Alimentation connectée à 3,3 V du microcontrôleur.
  • SDA – Ligne de données I2C.
  • SCL – Ligne d’horloge I2C.
  • INT – Sortie d’interruption active LOW. La sortie est à collecteur ouvert et nécessite une résistance de pull-up et est connectée à une entrée d’interruption d’un microcontrôleur lorsqu’elle est utilisée.
Apds9960 Architecture
APDS9960 Architecture

La carte de développement comporte également deux tampons de cavaliers soudés.

  • PS – Ce cavalier soudé est fermé par défaut et est utilisé pour connecter les alimentations du capteur et de la LED IR ensemble, de sorte que vous n’ayez besoin de fournir de l’alimentation qu’à la broche VCC. Cependant, si le cavalier est ouvert, vous devez fournir des alimentations séparées pour VCC (2,4 à 3,6 V) et VL (3,0 à 4,5 V).
  • I2C PU – Il s’agit d’un cavalier soudé à 3 voies utilisé pour connecter les résistances de pull-up I2C 10K à la ligne SDA et SCL sur les circuits de la carte. Le cavalier est également fermé par défaut, mais si vous souhaitez utiliser des résistances de pull-up externes, vous pouvez l’ouvrir.

Comment fonctionne le capteur APDS9960

Le capteur APDS9960 est utilisé pour détecter les gestes, détecter la proximité et la couleur et mesurer l’intensité de la lumière ambiante. Ce capteur comporte quatre photodiodes et une LED IR disposée comme illustré ci-dessous.

Disposition des photodiodes du capteur de gestes APDS9960 et de la LED IR

Détection de gestes

La détection de gestes avec le capteur APDS9960 est possible grâce aux quatre photodiodes qui reflètent le rayonnement IR provenant de la LED IR intégrée. Ces photodiodes sont placées de telle manière qu’un objet se déplaçant d’une direction à l’autre approchera d’abord une photodiode, puis l’autre. La direction du mouvement de l’objet est déterminée par la photodiode que l’objet passe en premier.

Le rayonnement IR réfléchi par les photodiodes est converti en signaux qui sont traduits en mouvements ou gestes de base vers le haut, vers le bas, vers la gauche et vers la droite. La détection de gestes fonctionne mieux lorsque l’objet passe à une distance de 1 à 2 pouces du capteur.

Capteur de proximité

Le capteur de proximité utilise l’IR réfléchi pour déterminer la distance relative à un objet. Tant la LED émettrice IR que les détecteurs de photodiode sont situés dans le petit boîtier noir. Il a une portée de détection maximale d’environ 6 pouces en fonction de la surface, et une portée minimale d’environ 1 pouce.

Sans objet détecté, le capteur affichera une valeur de 255 ou quelque chose de proche de cette lecture. Lorsqu’un objet est détecté, la lecture approchera de 0 à mesure que l’objet se rapproche et sera de 0 à environ 1 pouce de distance du capteur.

Capteur de couleur et de lumière ambiante

La fonctionnalité de détection de couleur et de lumière ambiante utilise une série de photodiodes filtrées rouge/vert/bleu/clair avec des filtres IR pour minimiser l’impact de la lumière IR. Les données de mesure sont fournies sous forme de résultats de 16 bits.

Matériel requis

Voici la liste des composants matériels nécessaires pour ce tutoriel :

Connexion du capteur APDS9960

Capteur APDS9960Arduino
VCC5V
GNDGND
SDAA4
SCLA5
INT2
tableaux de Connexion du capteur APDS9960
Comment Utiliser Le Capteur Apds9960 De Proximité, De Gestes Et De Lumière Ambiante Avec L'Arduino
Connexion Du Capteur Apds9960

Téléchargement de la bibliothèque

Arduino pour le capteur APDS9960 Pour pouvoir interagir avec le capteur APDS9960, vous devez télécharger et installer la bibliothèque Arduino pour le capteur APDS9960. Voici comment faire :

  1. Ouvrez l’IDE Arduino.
  2. Cliquez sur le menu “Croquis”.
  3. Cliquez sur le menu “Inclure une bibliothèque”.
  4. Cliquez sur le menu “Gérer les bibliothèques”.
  5. Recherchez la bibliothèque “SparkFun APDS9960”.
  6. Sélectionnez la bibliothèque “SparkFun APDS9960” et cliquez sur le bouton “Installer”.
Installer La Bibliothèque Arduino Pour Le Capteur Apds9960
Comment Utiliser Le Capteur Apds9960 De Proximité, De Gestes Et De Lumière Ambiante Avec L'arduino 12

Code Arduino

Ouvrez un nouveau sketch dans l’IDE Arduino et ajoutez le code suivant :

#include <Wire.h>
#include <SparkFun_APDS9960.h>

SparkFun_APDS9960 apds = SparkFun_APDS9960();

void setup() {
  Serial.begin(9600);
  apds.init();
  apds.enableGestureSensor(true);
}

void loop() {
  if (apds.isGestureAvailable()) {
    int gesture = apds.readGesture();
    Serial.println(gesture);
  }
}

Ce code initialise le capteur APDS9960 et active la détection de gestes. Il lit ensuite les données de gestes et les affiche sur le moniteur série.

note:

Dans le code que vous avez fourni, les broches D2, A4 et A5 ne sont pas explicitement définies dans le code en utilisant la fonction pinMode(). À la place, la bibliothèque SparkFun_APDS9960 utilise les broches I2C par défaut de l’Arduino (A4 et A5) et la broche D2 pour la gestion des interruptions.

Si vous utilisez une carte Arduino qui suit la disposition standard des broches, comme l’Uno ou le Mega, alors les broches I2C sont sur A4 et A5 et la broche D2 est la broche d’interruption pour la broche numérique 2. Par conséquent, vous n’avez pas besoin de définir ces broches dans votre code.

Cependant, si vous utilisez une carte différente ou avez modifié la disposition des broches de votre carte, vous devrez peut-être définir explicitement les broches dans votre code en utilisant la fonction pinMode() avant de les utiliser pour la communication I2C ou la gestion des interruptions.

Test du capteur de gestes

Téléversez le code sur la carte Arduino et ouvrez le moniteur série. Vous devriez voir des valeurs s’afficher lorsque vous bougez votre main devant le capteur APDS9960. Les valeurs correspondent aux gestes détectés. Les gestes disponibles sont LEFT, RIGHT, UP, DOWN, NEAR et FAR.

#include <Wire.h> 
#include <SparkFun_APDS9960.h>

#define APDS9960_INT    2 
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {
  pinMode(APDS9960_INT, INPUT);  
  attachInterrupt(0, interruptRoutine, FALLING); 
  apds.init();   
  apds.enableGestureSensor(true);  
}

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
    
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        delay (1000);
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        delay (1000);
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        delay (1000);
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        delay (1000);
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        delay (1000);
        break;
      case DIR_FAR:
        Serial.println("FAR");
        delay (1000);
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Contrôle des LED

Le capteur de gestes APDS9960 peut être utilisé pour contrôler des LED. Nous allons maintenant apprendre à connecter les LED et à les contrôler en fonction des gestes détectés.

Configuration des LED

Tout d’abord, nous devons configurer les LED que nous allons contrôler. Pour cela, connectez les broches positives des LED à des broches de sortie numériques de la carte Arduino et les broches négatives à la masse.

Écriture du code

Ajoutez le code suivant à votre sketch Arduino pour contrôler les LED en fonction des gestes détectés :

#include <Wire.h>
#include <SparkFun_APDS9960.h>

#define LED_PIN_1 3
#define LED_PIN_2 5
#define LED_PIN_3 6
#define LED_PIN_4 9

SparkFun_APDS9960 apds = SparkFun_APDS9960();

void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN_1, OUTPUT);
  pinMode(LED_PIN_2, OUTPUT);
  pinMode(LED_PIN_3, OUTPUT);
  pinMode(LED_PIN_4, OUTPUT);

  if (apds.init()) {
    Serial.println("APDS-9960 initialization complete");
  } else {
    Serial.println("APDS-9960 initialization failed");
  }

  apds.enableGestureSensor(true);
}

void loop() {
  if (apds.isGestureAvailable()) {
    int gesture = apds.readGesture();
    switch (gesture) {
      case DIR_UP:
        digitalWrite(LED_PIN_1, HIGH);
        break;
      case DIR_DOWN:
        digitalWrite(LED_PIN_2, HIGH);
        break;
      case DIR_LEFT:
        digitalWrite(LED_PIN_3, HIGH);
        break;
      case DIR_RIGHT:
        digitalWrite(LED_PIN_4, HIGH);
        break;
      case DIR_NEAR:
        digitalWrite(LED_PIN_1, HIGH);
        digitalWrite(LED_PIN_2, HIGH);
        digitalWrite(LED_PIN_3, HIGH);
        digitalWrite(LED_PIN_4, HIGH);
        break;
      case DIR_FAR:
        digitalWrite(LED_PIN_1, LOW);
        digitalWrite(LED_PIN_2, LOW);
        digitalWrite(LED_PIN_3, LOW);
        digitalWrite(LED_PIN_4, LOW);
        break;
    }
    Serial.print("Gesture: ");
    switch (gesture) {
      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");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
    }
  }
}

Ce code allume les LED connectées aux broches 3, 5, 6 et 9 de la carte Arduino en fonction des gestes détectés par le capteur APDS9960. Lorsque le geste UP est détecté, la LED connectée à la broche 3 s’allume, lorsque le geste DOWN est détecté, la LED connectée à la broche 5 s’allume, et ainsi de suite. Si le geste NEAR est détecté, toutes les LED s’allument, et si le geste FAR est détecté, toutes les LED s’éteignent.

Code de détection couleur Arduino utilisant le capteur APDS9960

Le code suivant permet de détecter la couleur à l’aide du capteur de couleur SparkFun APDS-9960 et d’afficher les valeurs de lumière ambiante, rouge, verte et bleue sur le moniteur série :

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Variables globales
SparkFun_APDS9960 apds = SparkFun_APDS9960();
uint16_t ambient_light = 0;
uint16_t red_light = 0;
uint16_t green_light = 0;
uint16_t blue_light = 0;

void setup() {
  
  // Initialisation du port série
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - ColorSensor"));
  Serial.println(F("--------------------------------"));
  
  // Initialisation du capteur APDS-9960 (configuration I2C et valeurs initiales)
  if ( apds.init() ) {
    Serial.println(F("Initialisation du capteur APDS-9960 réussie"));
  } else {
    Serial.println(F("Une erreur s'est produite lors de l'initialisation du capteur APDS-9960!"));
  }
  
  // Démarrage du capteur de lumière APDS-9960 (sans interruptions)
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("Le capteur de lumière est maintenant en marche"));
  } else {
    Serial.println(F("Une erreur s'est produite lors de l'initialisation du capteur de lumière!"));
  }
  
  // Attente de la fin de l'initialisation et de l'étalonnage
  delay(500);
}

void loop() {
  
  // Lecture des niveaux de lumière (ambiante, rouge, verte, bleue)
  if (  !apds.readAmbientLight(ambient_light) ||
        !apds.readRedLight(red_light) ||
        !apds.readGreenLight(green_light) ||
        !apds.readBlueLight(blue_light) ) {
    Serial.println("Erreur de lecture des valeurs de lumière");
  } else {
    Serial.print("Ambient: ");
    Serial.print(ambient_light);
    Serial.print(" Rouge: ");
    Serial.print(red_light);
    Serial.print(" Vert: ");
    Serial.print(green_light);
    Serial.print(" Bleu: ");
    Serial.println(blue_light);
  }
  
  // Attente de 1 seconde avant la prochaine lecture
  delay(1000);
}

Le code utilise la bibliothèque SparkFun_APDS9960 pour interfacer le capteur de couleur APDS-9960 avec l’Arduino. Les variables globales ambient_light, red_light, green_light et blue_light stockent les niveaux de lumière ambiante, rouge, verte et bleue respectivement. La fonction setup() initialise le port série, le capteur APDS-9960 et le capteur de lumière du capteur. La fonction loop() lit les valeurs de lumière et les affiche sur le moniteur série. Le programme attend ensuite une seconde avant de lire les valeurs à nouveau.

Utilisation de l’interruption de proximité avec le capteur APDS9960

Ce code utilise une broche d’interruption (interrupt pin) pour détecter les événements de proximité. Il est important de connecter la broche INT du capteur APDS9960 à une broche d’interruption de l’Arduino.

Le code initialise le capteur APDS9960 et configure le niveau de seuil pour déclencher l’interruption de proximité. Lorsque le capteur détecte une proximité supérieure au seuil défini, une interruption se produit, et la valeur de la proximité est affichée sur le moniteur série. En même temps, une LED connectée à la broche 13 s’allume pendant une demi-seconde.

Voici le code :

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Pins
#define APDS9960_INT    2  // Needs to be an interrupt pin
#define LED_PIN         13 // LED for showing interrupt

// Constants
#define PROX_INT_HIGH   50 // Proximity level for interrupt
#define PROX_INT_LOW    0  // No far interrupt

// Global variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
uint8_t proximity_data = 0;
int isr_flag = 0;

void setup() {
  
  // Set LED as output
  pinMode(LED_PIN, OUTPUT);
  pinMode(APDS9960_INT, INPUT);
  
  // Initialize Serial port
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("---------------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - ProximityInterrupt"));
  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!"));
  }
  
  // Adjust the Proximity sensor gain
  if ( !apds.setProximityGain(PGAIN_2X) ) {
    Serial.println(F("Something went wrong trying to set PGAIN"));
  }
  
  // Set proximity interrupt thresholds
  if ( !apds.setProximityIntLowThreshold(PROX_INT_LOW) ) {
    Serial.println(F("Error writing low threshold"));
  }
  if ( !apds.setProximityIntHighThreshold(PROX_INT_HIGH) ) {
    Serial.println(F("Error writing high threshold"));
  }
  
  // Start running the APDS-9960 proximity sensor (interrupts)
  if ( apds.enableProximitySensor(true) ) {
    Serial.println(F("Proximity sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during sensor init!"));
  }
}

void loop() {
  
  // If interrupt occurs, print out the proximity level
  if ( isr_flag == 1 ) {
  
    // Read proximity level and print it out
    if ( !apds.readProximity(proximity_data) ) {
      Serial.println("Error reading proximity value");
    } else {
      Serial.print("Proximity detected! Level: ");
      Serial.println(proximity_data);
    }
    
    // Turn on LED for a half a second
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    
    // Reset flag and clear APDS-9960 interrupt (IMPORTANT!)
    isr_flag = 0;
    if ( !apds.clearProximityInt() ) {
      Serial.println("Error clearing interrupt");
    }
    
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

Conclusion

Le capteur de gestes APDS9960 est un composant très utile pour ajouter des fonctionnalités interactives à vos projets Arduino. Dans ce tutoriel, nous avons vu comment connecter le capteur APDS9960 à une carte Arduino, et comment détecter les gestes en utilisant la bibliothèque SparkFun_APDS9960.

Nous avons également vu comment utiliser les données de gestes détectées pour contrôler les LED connectées à la carte Arduino. Avec ce capteur, vous pouvez créer des projets interactifs, tels que des lampes à commande gestuelle, des robots qui répondent à des gestes, ou des systèmes de contrôle d’éclairage pour les bâtiments.

Nous espérons que ce tutoriel vous a été utile pour comprendre comment utiliser le capteur de gestes APDS9960 avec Arduino. Si vous avez des questions ou des commentaires, n’hésitez pas à nous contacter.

Pour plus d’article : https://www.moussasoft.com/tutoriels-electroniques

Twitter: Moussa Lhoussaine (@Moussasoft_com) / Twitter

Liens utiles

Bibliothèque Arduino : https://github.com/sparkfun/SparkFun_APDS-9960_Sensor_Arduino_Library/archive/V_1.4.2.zip

APDS9960 Datasheet : apds9960.pdf (sparkfun.com)

Arduino – Home

Tutoriel vidéo