Test du capteur APDS-9960 : Détection de gestes – couleurs – proximité – luminosité

Sommaire

Présentation du capteur APDS-9960

Le capteur APDS9960 est un module polyvalent qui regroupe plusieurs fonctionnalités intéressantes pour les projets électroniques : il permet la détection de gestes, la détection de proximité, ainsi que la mesure de la lumière ambiante et des couleurs. Grâce à cette combinaison de capteurs, il est souvent utilisé dans les interfaces interactives, les dispositifs portables ou encore les systèmes d’éclairage intelligent.

On trouve sur le marché deux grandes versions de ce capteur : la version originale, produite par des fabricants reconnus comme SparkFun, et une version clone, plus économique et très répandue sur les plateformes de vente en ligne. Si les deux modèles reposent sur la même puce APDS9960, la version clone se distingue par son prix plus abordable et sa large disponibilité, ce qui en fait le choix privilégié des makers et des débutants en Arduino.

Dans cet article, nous verrons comment monter et programmer le capteur APDS9960 avec une carte Arduino Uno, afin d’exploiter tout le potentiel de ce petit composant multifonction.

Capteur de gestes APDS-9960
Capteur APDS-9960 pour la détection des gestes, des couleurs, de la proximité et de la luminosité

Préparation du capteur APDS-9960

La première étape consiste à vérifier la présence de brasure sur les ponts de soudure “PS” et “I2C PU” du capteur APDS-9960.

Si votre module provient de notre boutique en ligne, aucune action n’est nécessaire : ces ponts sont déjà soudés en atelier, vous pouvez donc passer directement à l’étape suivante du tutoriel.

En revanche, si vous utilisez un module acheté ailleurs, assurez-vous de réaliser la brasure sur ces deux ponts avant de poursuivre.

Capteur APDS-9960 détection de gestes et couleurs
Brasure des "Ponts de soudure" du capteur de gestes et couleurs APDS-9960

Cette action va permettre d’une part d’activer  la LED infrarouge pour la détection de proximité (PS), et d’autre part d’activer les résistances dites de “Pull-Up” qui assurent la stabilité du module lors des échanges de données avec la carte Arduino UNO (I2C PU).  

Montage et programmation

Nous allons configurer et tester le module APDS-9960 avec une Arduino Uno, afin de :

  • Détecter des gestes 
  • Détecter des couleurs
  • Détecter la proximité
  • Détecter la luminosité

Librairies nécessaires

  • SparkFun_APDS9960.h (Version 1.4.2)
  • Wire.h  (inclus par défaut dans l’IDE Arduino)

Matériel nécessaire :

  • 1 Carte Arduino UNO

  • 1 Carte shield APDS9960 pour Arduino UNO
  • 1 Capteur APDS-9960

  • Câble USB Type C

  •  

Le montage

Montage de la carte UNO avec le shield APDS-9960 et le capteur de gestes APDS-9960
  1. Carte shield pour APDS-9960 compatible Arduino UNO
  2. Capteur APDS-9960
  3. Carte arduino UNO

Préparation logicielle

La préparation logicielle est nécessaire afin de s’assurer que le module APDS-9960 est bien fonctionnel. Cette étape permet aussi de déterminer si le capteur APDS-9960 est un Original ou un Clone.

Si le capteur APDS-9960 est une version Cloneune modification de la librairie “SparkFun_APDS9960″ sera nécessaire afin de pouvoir activer les fonctionnalités du capteur (Gestes, couleurs, proximité, luminosité). Autrement le capteur APDS_9960 ne s’initialisera pas et sera inutilisable.

Adresse I2C du module APDS-9960

La première étape de notre préparation logicielle consiste à rechercher l’adresse I2C du capteur APDS-9960. Il s’agit de l’adresse à laquelle la carte Arduino UNO se connecte pour communiquer avec le module APDS-9960.

Le code Arduino suivant va scanner 128 adresses I2C afin de déterminer l’adresse du capteur APDS-9960. Si l’adresse reçue est 0x39 alors tout va bien (pour l’instant!), sinon cela veut dire que votre module est surement défectueux : 

				
					#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Scan du bus I2C...");
}

void loop() {
  byte error, address;
  int nDevices = 0;

  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("Appareil trouvé à l’adresse 0x");
      if (address < 16) Serial.print("0");
      Serial.print(address, HEX);
      Serial.println(" !");
      nDevices++;
    }
  }

  if (nDevices == 0) Serial.println("Aucun appareil I2C détecté");
  else Serial.println("Scan terminé.");

  delay(2000);
}

				
			
Adresse I2C du capteur APDS-9960
Adresse I2C du capteur APDS-9960 : 0x39

Numéro ID du module APDS-9960

La seconde étape consiste à retrouver le numéro d’identification (ID) de la puce du module APDS-9960.  Cet ID  va permettre de déterminer si la capteur APDS-9960 est un Original ou un Clone.

Si le numéro ID est:

  • 0xAB ou 0x9C : Puce Originale => Aucune modification nécessaire.
  • 0xA8 ou 0x9E : Puce Clone => Modification de la librairie SparkFun_APDS9960 obligatoire.
  • Autre : Puce défectueuse.
				
					#include <Wire.h>

#define APDS9960_I2C_ADDR 0x39
#define APDS9960_ID_REG   0x92

void setup() {
  Serial.begin(115200);
  Wire.begin();

  Wire.beginTransmission(APDS9960_I2C_ADDR);
  Wire.write(APDS9960_ID_REG);
  Wire.endTransmission();

  Wire.requestFrom(APDS9960_I2C_ADDR, 1);
  if (Wire.available()) {
    byte id = Wire.read();
    Serial.print("ID lu = 0x");
    Serial.println(id, HEX);
  } else {
    Serial.println("Échec lecture ID !");
  }
}

void loop() {}

				
			
Affichage de l'ID du capteur APDS-9960
Affichage de l'ID du capteur APDS-9960

Notre module a un ID 0xA8, ce qui signifie qu’il s’agit ici d’un clone et qu’une modification de la librairie SparkFun_APDS9960 est obligatoire.

Modification de la librairie "SparkFun_APDS9960"

Avant de commencer la modification de la librairie SparkFun_APDS9960, un logiciel permettant de lire et modifier les fichiers en .cpp ou .h  est nécessaire. Il existe une pléthore de logiciels permettant cela mais nous vous conseillons l’éditeur Notepad++. Il s’agit d’un logiciel entièrement gratuit et dont le lien de téléchargement est disponible ici : https://notepad-plus-plus.org/downloads/ .

Une fois le logiciel Notepad++ téléchargé et installé, ouvrez-le puis cliquez sur “Fichier -> Ouvrir”. Allez dans le dossier où se situe la librairie SparkFun_APDS9960 :  C:\Users\…\Arduino\Librairies\SparkFun_APDS9960_RGB_and_Gesture_Sensor\src\SparkFun_APDS9960.cpp . Cliquez sur “Ouvrir”

Selection du fichier SparkFun_ADPS9960.cpp

Allez ensuite dans la fonction “SparkFun_APDS9960::init()” (voir ligne 55). Cette fonction permet d’initialiser les ID des capteurs APDS_9960 autorisées par la librairie. 

De base, seules les ID 0xAB (ID_1) et 0x90C (ID_2) sont reconnues dans la librairie SparkFun_APDS9960. Ce sont les ID des modules APDS_9960 Originaux.  Nous allons donc rajouter manuellement les ID des modules APDS-9960 Clones en insérant les informations suivantes dans la parenthèse à la ligne 66 : 

  • || id == 0x9E || id == 0xA8
Ajout des ID 0x9E et 0xA8 dans la librairie SparFun_APDS9960

Puis on sauvegarde en cliquant sur “Fichier -> Enregistrer” ou sur l’icône représentant une disquette : 

Enregistrement de la modification du fichier SparkFun_APDS9960.cpp

Fermez le logiciel Notepad++ et redémarrez le logiciel Arduino afin que la modification de la librairie soit prise en compte.

Code Arduino 1: Détection de gestes

Ce code Arduino va  permettre au capteur APDS_9960 de faire de la détection de gestes et d’afficher le résultat dans le moniteur série de l’IDE Arduino. Les gestes reconnus sont : HAUT, BAS, GAUCHE, DROITE, PROCHE, LOIN :

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

// Objet capteur
SparkFun_APDS9960 apds = SparkFun_APDS9960();

int gesture = 0;

void setup() {
  Serial.begin(115200);
  Wire.begin();

  Serial.println("Initialisation du APDS-9960...");

  // Initialisation
  if (apds.init()) {
    Serial.println("APDS-9960 initialisé avec succès !");
  } else {
    Serial.println("ERREUR: échec initialisation APDS-9960");
    while (1);
  }

  // Démarre la reconnaissance de gestes
  if (apds.enableGestureSensor(true)) {
    Serial.println("Détection de gestes activée !");
  } else {
    Serial.println("Impossible d'activer la détection de gestes !");
    while (1);
  }
}

void loop() {
  // Vérifie s'il y a un geste disponible
  if (apds.isGestureAvailable()) {
    gesture = apds.readGesture();

    switch (gesture) {
      case DIR_UP:
        Serial.println("Geste : HAUT");
        break;
      case DIR_DOWN:
        Serial.println("Geste : BAS");
        break;
      case DIR_LEFT:
        Serial.println("Geste : GAUCHE");
        break;
      case DIR_RIGHT:
        Serial.println("Geste : DROITE");
        break;
      default:
        Serial.println("Gest inconnu / impossible à déterminer");
        break;
    }
  }
}

				
			
Affichage des résultats de détection de gestes du APDS9960
Affichage des résultats de détection de gestes du capteur APDS9960

Code Arduino 2 : Détection de proximité

Dans ce mode, le capteur APDS9960 renvoi une valeur comprise entre 0 et 255 avec :

  • 0 – 10 : Rien devant le capteur
  • 11 – 120 : Main approchée à quelques cm
  • 121 – 255 : Main juste devant le capteur . 
				
					#include <Wire.h>
#include <SparkFun_APDS9960.h>

SparkFun_APDS9960 apds = SparkFun_APDS9960();

void setup() {
  Serial.begin(115200);
  Wire.begin();

  Serial.println("Initialisation du APDS-9960...");

  // Initialise le capteur
  if (apds.init()) {
    Serial.println("APDS-9960 initialisé !");
  } else {
    Serial.println("Erreur : impossible d'initialiser le APDS-9960");
    while (1);
  }

  // Réglages pour la proximité
  apds.setProximityGain(PGAIN_4X);     // Gain maximum
  apds.setLEDDrive(LED_DRIVE_100MA);   // Puissance LED IR maximale
  apds.setProximityIntLowThreshold(0); // Plage complète
  apds.setProximityIntHighThreshold(255);

  // Active le mode de proximité
  if (apds.enableProximitySensor(true)) {
    Serial.println("Détection de proximité activée !");
  } else {
    Serial.println("Impossible d'activer le mode proximité !");
    while (1);
  }
}

void loop() {
  uint8_t prox;

  // Lecture de la valeur de proximité
  if (!apds.readProximity(prox)) {
    Serial.println("Erreur lecture proximité !");
    delay(200);
    return;
  }

  Serial.print("Proximité : ");
  Serial.println(prox);

  delay(100);
}

				
			
Affichage de la détection de proximité du capteur APDS9960

En réglant un seuil de déclenchement ( par exemple 180), il est possible de réaliser des applications diverses comme: 

  • Ouverture /Fermeture de porte
  • Allumage / extinction de lumière
  • Déclenchement de système de sécurité

Code Arduino 3 : Détection de couleurs

Ce code permet de détecter les composantes Rouges (R) Vert (G) et Bleu (B) afin de déterminer la couleur de l’objet mis en face du capteur. Il est important d’éclairer l’objet en question afin d’améliorer le facteur de détection de couleurs.

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

SparkFun_APDS9960 apds;

uint16_t amb, r, g, b;

String detectColor(uint16_t r, uint16_t g, uint16_t b, uint16_t amb);

void setup() {
  Serial.begin(115200);
  Wire.begin();

  if (!apds.init()) {
    Serial.println("ERREUR init APDS-9960");
    while (1);
  }

  if (!apds.enableLightSensor(false)) {
    Serial.println("ERREUR activation capteur lumière");
    while (1);
  }

  Serial.println("Détection de couleur APDS-9960 prête.");
  delay(300);
}

void loop() {
  apds.readAmbientLight(amb);
  apds.readRedLight(r);
  apds.readGreenLight(g);
  apds.readBlueLight(b);

  String color = detectColor(r, g, b, amb);

  Serial.println(color);
  delay(200);
}


// -----------------------------------------------------
//      FONCTION : détection de couleur calibrée
// -----------------------------------------------------
String detectColor(uint16_t r, uint16_t g, uint16_t b, uint16_t amb) {

  // Trop peu de lumière ?
  if (amb < 20) return "NOIR";

  // Normalisation (réduit l'effet de lumière ambiante)
  float rn = (float)r / amb;
  float gn = (float)g / amb;
  float bn = (float)b / amb;

  // --- Couleurs primaires ---
  if (rn > 0.40 && rn > gn * 1.4 && rn > bn * 1.4) return "ROUGE";
  if (gn > 0.40 && gn > rn * 1.4 && gn > bn * 1.4) return "VERT";
  if (bn > 0.40 && bn > rn * 1.4 && bn > gn * 1.4) return "BLEU";

  // --- Couleurs secondaires ---
  if (rn > 0.35 && gn > 0.35 && bn < 0.25) return "JAUNE / ORANGE";
  if (bn > 0.35 && rn > 0.35 && gn < 0.25) return "VIOLET / MAGENTA";
  if (gn > 0.35 && bn > 0.35 && rn < 0.25) return "CYAN";

  // --- Blanc / gris ---
  if (rn > 0.25 && gn > 0.25 && bn > 0.25) return "BLANC / GRIS";

  return "COULEUR INCONNUE";
}

				
			

Une bonne détection de lumière dépend entièrement du bon éclairage de l’objet observé par le capteur APDS9960.

Code Arduino 4 : Mesure de lumière ambiante

Ce code va nous permettre de mesurer et d’afficher dans le moniteur série de l’IDE Arduino la lumière ambiante exprimée en LUX : 

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

SparkFun_APDS9960 apds;

uint16_t ambient_light = 0;

void setup() {
  Serial.begin(115200);
  Wire.begin();

  Serial.println("Initialisation APDS-9960...");

  // Init capteur
  if (!apds.init()) {
    Serial.println("ERREUR: impossible d'initialiser le capteur !");
    while (1);
  }

  // Active le capteur de lumière (ALS + couleurs)
  if (!apds.enableLightSensor(false)) {
    Serial.println("ERREUR: impossible d'activer le capteur lumière !");
    while (1);
  }

  Serial.println("Capteur lumière actif.");
  delay(500); // temps de stabilisation
}

void loop() {

  // ---- Lumière ambiante ----
  if (apds.readAmbientLight(ambient_light)) {
    Serial.print("Lumière ambiante : ");
    Serial.print(ambient_light);
    Serial.println(" lux approx.");
  }

  Serial.println("---------------------------");
  delay(300);
}

				
			
Affichage de la luminosité du capteur APDS9960 en LUX

Applications possibles en définissant un seuil de luminosité : 

  • Volets roulants
  • Éclairage
  • Arrosage automatique de plantes

Conclusion

Nous avons à présent finalisé l’assemblage et la programmation du module APDS9960 avec la carte Arduino Uno. Les différents modes — reconnaissance de gestes, détection de proximité, détection des couleurs et mesure de la luminosité ambiante — s’affichent correctement dans le Moniteur série de l’IDE Arduino, attestant du bon fonctionnement du capteur. Ce projet offre une base solide pour aller plus loin, par exemple en l’intégrant à notre kit DIY permettant de piloter un système Pan-Tilt équipé de servomoteurs MG995 à l’aide du capteur APDS9960 et de la carte shield dédiée :

Bonjour ! 🌟 Rejoignez notre newsletter pour ne rien manquer.

Recevez nos offres spéciales et les derniers articles directement dans votre boîte de réception

Nous ne faisons pas de spam, promis ! Consultez notre politique de confidentialité pour en savoir plus.

Panier
Retour en haut