Code de recherche

Capteur de gestes APDS-9960 avec Arduino

Capteur de gestes APDS-9960 avec Arduino

Le capteur de gestes APDS-9960 permet de détecter des gestes de la main tels que les balayages et la proximité. Dans ce tutoriel, nous allons montrer comment connecter l'APDS-9960 à un Arduino et le programmer pour reconnaître les gestes. Le résultat sera une configuration simple capable de détecter les mouvements et de les signaler via le moniteur série. Ce guide vous aidera à comprendre le câblage et le code nécessaires pour commencer avec le capteur de gestes. (dans la vidéo à 00:30)

APDS-9960 gesture sensor module -1

Le matériel expliqué

L'APDS-9960 est un capteur polyvalent qui combine la détection des couleurs RGB, la mesure de la lumière ambiante, la détection de proximité et la détection de gestes. Il communique avec l'Arduino via I2C, ce qui permet une intégration facile avec un câblage minimal. Le capteur fonctionne uniquement à 3,3 V, il est donc essentiel de s'assurer que les niveaux de tension sont appropriés pour éviter d'endommager l'appareil. Dans ce montage, nous utiliserons l'Arduino pour lire les données de gestes. Le capteur transmet les informations de gestes par des interruptions, ce qui permet à l'Arduino de répondre rapidement aux mouvements de la main. L'intégration de l'APDS-9960 avec l'Arduino ouvre de nombreuses possibilités pour des projets interactifs, y compris des dispositifs contrôlés par gestes.

Détails de la fiche technique

FabricantBroadcom
Numéro de pièceAPDS-9960
Tension logique/E/S2,7 - 3,6 V
Tension d'alimentation3,3 V
Courant de sortie (par canal)1 mA
Courant de crête (par canal)10 mA
Recommandations de fréquence PWM100 Hz
Seuils logiques d'entrée0,3 × VDD(bas), 0.7 x VDD(élevé)
Chute de tension sur RDS(on)/ saturation0.5 V max
Limites thermiques-40 à +85 °C
PaquetLGA à 6 broches
Notes / variantesPrend en charge la communication I2C

  • Veillez à ce que la tension d'alimentation ne dépasse pas 3.6 V afin d'éviter tout dommage.
  • Utilisez des résistances pull-up sur les lignes I2C pour une communication fiable.
  • Tenez le capteur à l'abri de la lumière directe du soleil pour des mesures précises.
  • Assurez-vous d'initialiser correctement le capteur dans le code.
  • Vérifiez les connexions de câblage pour éviter les entrées flottantes.

Instructions de câblage

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

Pour câbler l'APDS-9960 à l'Arduino, commencez par connecter l'alimentation. Utilisez un fil rouge pour relier la broche VCC de l'APDS-9960 à la broche 3.3V de l'Arduino. Ensuite, connectez la broche GND du capteur à une broche de masse de l'Arduino à l'aide d'un fil noir. Pour la communication I2C, connectez la broche SDA de l'APDS-9960 à la broche A4 de l'Arduino. De même, connectez la broche SCL à la broche A5 de l'Arduino. Enfin, connectez la broche INT du capteur à la broche 2 de l'Arduino. Cela permettra à l'Arduino de répondre aux interruptions générées par le capteur.

Exemples de code et guide pas à pas

Le code fourni initialise le capteur APDS-9960 et configure l'Arduino pour lire les gestes. Voici un bref extrait de la fonction setup :

void setup() {
  pinMode(APDS9960_INT, INPUT);
  Serial.begin(9600);
  attachInterrupt(0, interruptRoutine, FALLING);
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  }
}

Dans cet extrait, nous initialisons le moniteur série et configurons la broche d'interruption. Le capteur est initialisé et un message de confirmation est affiché sur la console. Ensuite, nous vérifions les gestes dans la fonction loop :

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

Ici, la boucle vérifie en continu les gestes. Lorsqu'un geste est détecté, l'interruption est désactivée et la fonction handleGesture est appelée pour traiter le geste. Enfin, la fonction handleGesture traite les gestes détectés :

void handleGesture() {
  if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        break;
      // Additional cases...
    }
  }
}

Dans cette fonction, le geste est lu et l'action correspondante est exécutée en fonction de la direction détectée. Cela permet un contrôle interactif basé sur les mouvements de la main. Pour une compréhension complète du code, veuillez consulter le programme complet placé sous l'article.

APDS-9960 gesture sensor -3

Démonstration / À quoi s'attendre

Lorsque l'installation est terminée, vous pouvez vous attendre à ce que l'Arduino lise les gestes et affiche la direction détectée sur le moniteur série. Des tests simples consistent à déplacer votre main vers le haut, le bas, la gauche ou la droite devant le capteur. Si tout est correctement câblé, vous devriez voir la sortie correspondante sur le moniteur série, confirmant la reconnaissance des gestes. Faites attention aux entrées flottantes, car elles peuvent entraîner des lectures instables (dans la vidéo à 05:20).

Horodatages vidéo

  • 00:00- Introduction
  • 01:15- Aperçu du matériel
  • 03:00- Instructions de câblage
  • 04:30- Parcours du code
  • 06:15- Démonstration

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
APDS-9960 gesture sensor -3
APDS-9960 gesture sensor -3
Arduino wiring for APDS9960 Gesture sensor
Arduino wiring for APDS9960 Gesture sensor
1-Code for an APDS-9960 gesture sensor for Arduino
Langue: C++
/*
 * Code pour le capteur de gestes APDS-9960 pour Arduino  
 * Ce code détecte les gestes de votre main, que ce soit en la déplaçant vers le haut, vers le bas, à gauche ou à droite ; d'autres gestes peuvent être détectés et utilisés pour contrôler autre chose.  
 * 
 * Regardez la vidéo du capteur de gestes APDS-9960 https://youtu.be/qzSgZV_fbxI  
 * Obtenez ce code sur https://robojax.com  
 * 
 * Code utilisé dans la vidéo par Ahmad Shamshiri pour Robojax.com  
 * le 31 décembre 2016, à 6h53, à Ajax, Ontario, Canada  
 * Permission accordée de partager ce code, à condition que cette  
 * note soit conservée avec le code.  
 * Avertissement : ce code est "EN L'ÉTAT" et à des fins éducatives uniquement.  
 * 
 * GestureTest.ino  
 * Capteur RGB et de gestes APDS-9960  
 * Shawn Hymel @ SparkFun Electronics  
 * 30 mai 2014  
 * https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor  
 * 
 * Teste les capacités de détection de gestes de l'APDS-9960. Configure  
 * l'APDS-9960 via I2C et attend des événements de gestes. Calcule  
 * la direction du glissement (haut, bas, gauche, droite) et l'affiche  
 * sur un console série.  
 * 
 * Pour effectuer un geste PROCHE, tenez votre main  
 * haut au-dessus du capteur et rapprochez-la du capteur (dans les 2  
 * pouces). Tenez votre main là pendant au moins 1 seconde, puis éloignez-la.  
 * 
 * Pour effectuer un geste LOIN, tenez votre main dans les 2 pouces du  
 * capteur pendant au moins 1 seconde, puis éloignez-la (hors de  
 * portée) du capteur.  
 * 
 * Connexions matérielles :  
 * 
 * IMPORTANT : L'APDS-9960 ne peut accepter que 3,3V !  
 * 
 * Broche Arduino Fonction du tableau APDS-9960  
 * 
 * 3.3V VCC Alimentation  
 * GND GND Masse  
 * A4 SDA Données I2C  
 * A5 SCL Horloge I2C  
 * 2 INT Interruption  
 * 
 * Ressources :  
 * Inclure Wire.h et SparkFun_APDS-9960.h  
 * 
 * Spécificités de l'environnement de développement :  
 * Écrit dans Arduino 1.0.5  
 * Testé avec le SparkFun Arduino Pro Mini 3.3V  
 * 
 * Ce code est en mode bière ; si vous me voyez (ou tout autre employé de SparkFun) au local et que vous avez trouvé notre code utile, veuillez nous offrir un verre !  
 * 
 * Distribué tel quel ; aucune garantie n'est donnée.
 */
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // créer un objet servo pour contrôler un servo

 // Épingles
#define APDS9960_INT    2 // Doit être une broche d'interruption.

 // Constantes

 // Variables globales
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {

 // Configurer la broche d'interruption en entrée
  pinMode(APDS9960_INT, INPUT);

 // Initialiser le port série
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));

 // Initialiser la routine de service d'interruption
  attachInterrupt(0, interruptRoutine, FALLING);

 // Initialiser l'APDS-9960 (configurer l'I2C et les valeurs initiales)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

 // Démarrer le moteur du capteur de gestes APDS-9960
  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);
  }
}

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");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}
2-Source code for controlling a servo with your hand
Langue: C++
/*
 * Modifié pour RoboJax par A.B.S. le 9 mai 2017 à Ajax, Ontario, Canada. www.RoboJax.com
 * 
 * Source originale :
 * Capteur RGB et de gestes APDS-9960
 * Shawn Hymel @ SparkFun Electronics
 * 30 mai 2014
 * https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
 * 
 * Distribué tel quel ; aucune garantie n'est donnée.
 */
#include <Wire.h>

 // ajouté par RoboJax
#include <Servo.h>

#include <SparkFun_APDS9960.h>


Servo myservo; // créer un objet servo pour contrôler un servo // ajouté par RoboJax

 // Épingles
#define APDS9960_INT    2 // Doit être une broche d'interruption

 // Constantes

 // Variables globales
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {
 myservo.attach(9); // attache le servo sur la broche 9 à l'objet servo
 // Configurer la broche d'interruption en entrée
  pinMode(APDS9960_INT, INPUT);

 // Initialiser le port série
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));

 // Initialiser la routine de service d'interruption
  attachInterrupt(0, interruptRoutine, FALLING);

 // Initialiser l'APDS-9960 (configurer l'I2C et les valeurs initiales)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

 // Démarrez le moteur du capteur de geste APDS-9960.
  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);
  }
}

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");
        myservo.write(180); // ajouté par RoboJax
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(0); // ajouté par RoboJax
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Ressources et références

Aucune ressource pour le moment.

Fichiers📁

Autres fichiers