- Composants requis
- Introduction au capteur de proximité RVB et de mouvement numérique APDS-9960
- Schéma
- Programmation Arduino pour la détection des gestes et des couleurs
Aujourd'hui, la plupart des téléphones sont livrés avec une fonction de contrôle gestuel pour ouvrir ou fermer n'importe quelle application, démarrer de la musique, participer à des appels, etc. Nous utilisions auparavant un accéléromètre pour construire un robot contrôlé par geste et une souris Air contrôlée par geste. Mais aujourd'hui, on apprend à interfacer un capteur gestuel APDS9960 avec Arduino. Ce capteur dispose également d'un capteur RVB pour détecter les couleurs, qui sera également utilisé dans ce tutoriel. Vous n'avez donc pas besoin d'utiliser des capteurs séparés pour la détection des gestes et des couleurs, bien qu'un capteur dédié pour la détection des couleurs soit disponible - le capteur de couleur TCS3200 que nous avons déjà utilisé avec Arduino pour construire une machine de tri des couleurs.
Composants requis
- Arduino UNO
- Capteur RVB et gestuel APDS9960
- Écran LCD 16x2
- Commutateur DPDT
- Pot 100K et résistance 10K
- Câbles de démarrage
Introduction au capteur de proximité RVB et de mouvement numérique APDS-9960
APDS9960 est un capteur multifonction. Il peut détecter les gestes, la lumière ambiante et les valeurs RVB à la lumière. Ce capteur peut également être utilisé comme capteur de proximité et est principalement utilisé dans les smartphones, pour désactiver l'écran tactile lors d'un appel.
Ce capteur se compose de quatre photodiodes. Ces photodiodes détectent l'énergie IR réfléchie qui est transmise par une LED embarquée. Ainsi, chaque fois qu'un geste est effectué, cette énergie infrarouge est obstruée et se reflète vers le capteur, maintenant le capteur détecte les informations (direction, vitesse) sur le geste et les convertit en informations numériques. Ce capteur peut être utilisé pour mesurer la distance d'obstacle en détectant la lumière IR réfléchie. Il dispose de filtres de blocage UV et IR pour détecter les couleurs RVB et produit des données 16 bits pour chaque couleur.
Le brochage du capteur APDS-9960 est illustré ci-dessous. Ce capteur fonctionne sur le protocole de communication I 2 C. Il consomme 1µA de courant et est alimenté par 3,3V donc soyez prudent et ne le connectez pas avec une broche 5V. La broche INT ici est la broche d'interruption, qui est utilisée pour piloter la communication I 2 C. Et la broche VL est une broche d'alimentation en option pour la LED intégrée si le cavalier PS n'est pas connecté. Si le cavalier PS est fermé, il vous suffit d'alimenter la broche VCC, elle alimentera les deux - le module et la LED IR.
Schéma
Les connexions pour APDS960 avec Arduino sont très simples. Nous utiliserons un bouton DPDT pour basculer entre les deux modes de détection RVB et de détection de geste. Tout d'abord, les broches de communication I2C SDA et SCL de l'APDS9960 sont respectivement connectées aux broches Arduino A4 et A5. Comme indiqué précédemment, la tension de fonctionnement du capteur est de 3,3 V, donc VCC et GND de l'APDS9960 sont connectés à 3,3 V et GND d'Arduino. La broche d'interruption (INT) de APDS9960 est connectée à la broche D2 d'Arduino.
Pour l' écran LCD, les broches de données (D4-D7) sont connectées aux broches numériques D6-D3 d'Arduino et les broches RS et EN sont connectées à D6 et D7 d'Arduino. Le V0 de l'écran LCD est connecté au pot et un pot de 100K est utilisé pour contrôler la luminosité de l'écran LCD. Pour les boutons DPDT, nous n'avons utilisé que 3 broches. La deuxième broche est connectée à la broche D7 d'Arduino pour l'entrée et les deux autres sont connectés à GND et VCC suivis d'une résistance 10K.
Programmation Arduino pour la détection des gestes et des couleurs
La partie programmation est simple et facile et le programme complet avec une vidéo de démonstration est donné à la fin de ce tutoriel.
Nous devons d'abord installer une bibliothèque créée par Sparkfun. Pour installer cette bibliothèque, accédez à Sketch-> Inclure la bibliothèque-> Gérer les bibliothèques.
Maintenant, dans la barre de recherche, tapez "Sparkfun APDS9960" et cliquez sur le bouton d'installation lorsque vous voyez la bibliothèque.
Et nous sommes prêts à partir. Commençons.
Nous devons donc d'abord inclure tous les fichiers d'en-tête requis. Le premier fichier d'en-tête LiquidCrystal.h est utilisé pour les fonctions LCD. Le deuxième fichier d'en-tête Wire.h est utilisé pour la communication I 2 C et le dernier SparkFun_APDS996.h est utilisé pour le capteur APDS9960.
#comprendre
Dans les lignes suivantes, nous avons défini les broches pour le bouton et l'écran LCD.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal LCD (rs, en, d4, d5, d6, d7);
Dans la partie suivante, nous avons défini une macro pour la broche d'interruption qui est connectée sur la broche numérique 2 et une variable buttonState pour l'état actuel du bouton et isr_flag pour la routine de service d'interruption.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Ensuite, un objet est créé pour le SparkFun_APDS9960, afin que nous puissions accéder aux mouvements gestuels et récupérer les valeurs RVB.
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;
Dans la fonction de configuration , la première ligne est de récupérer la valeur du bouton (bas / haut) et les deuxième et troisième lignes définissent l'interruption et la broche du bouton comme entrée. apds.init () initialise le capteur APDS9960 et lcd.begin (16,2) initialise l'écran LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
Dans la fonction de boucle , la première ligne récupère les valeurs de bouton et les stocke dans la variable buttonState définie précédemment. Maintenant, dans les lignes suivantes, nous vérifions les valeurs du bouton, s'il est élevé, nous activons le capteur de lumière et s'il est bas, initialisons le capteur de geste.
La fonction attachInterrupt () est une fonction utilisée pour l'interruption externe qui dans ce cas est l'interruption du capteur. Le premier argument de cette fonction est le numéro d'interruption. Dans Arduino UNO, il existe deux broches numériques d'interruption - 2 et 3 désignées par INT.0 et INT.1. Et nous l'avons connecté à la broche 2, nous y avons donc écrit 0. Le deuxième argument appelle la fonction interruptRoutine () qui est définie ultérieurement. Le dernier argument est FALLING afin de déclencher l'interruption lorsque la broche passe de haut en bas. En savoir plus sur les interruptions Arduino ici.
boucle vide () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
Dans la partie suivante, nous vérifions la broche du bouton. S'il est élevé, démarrez le processus pour le capteur RVB. Vérifiez ensuite si le capteur de lumière lit les valeurs ou non. S'il n'est pas en mesure de lire les valeurs, dans ce cas, imprimez cette " Erreur de lecture des valeurs de la lumière". Et s'il peut lire les valeurs, comparez les valeurs des trois couleurs et, selon celle qui est la plus élevée, imprimez cette couleur sur l'écran LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Erreur lors de la lecture des valeurs de lumière"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); retard (1000); lcd.clear (); } ……. ………..
Dans les lignes suivantes, vérifiez à nouveau la broche du bouton, et si elle est faible, le processus du capteur de mouvement. Vérifiez ensuite isr_flag et s'il vaut 1, une fonction detachInterrupt () est appelée. Cette fonction est utilisée pour désactiver l'interruption. La ligne suivante appelle le handleGesture () qui est la fonction définie plus tard. Dans les lignes suivantes, définissez isr_flag à zéro et attachez l'interruption.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptionRoutine, FALLING); } }
Le suivant est la fonction interruptRoutine () . Cette fonction est utilisée pour transformer la variable isr_flag 1, afin que le service d'interruption puisse être initialisé.
void interruptRoutine (). { isr_flag = 1; }
La fonction handleGesture () est définie dans la partie suivante. Cette fonction vérifie d'abord la disponibilité du capteur de gestes. S'il est disponible, il lit les valeurs de geste et vérifie de quel geste il s'agit (HAUT, BAS, DROITE, GAUCHE, LOIN, PROCHE) et imprime les valeurs correspondantes sur l'écran LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); retard (1000); lcd.clear (); Pause; case DIR_DOWN: lcd.print ("DOWN"); retard (1000); lcd.clear (); Pause; case DIR_LEFT: lcd.print ("LEFT"); retard (1000); lcd.clear (); Pause; case DIR_RIGHT: lcd.print ("RIGHT"); retard (1000); lcd.clear (); Pause; case DIR_NEAR: lcd.print ("NEAR"); retard (1000); lcd.clear (); Pause; case DIR_FAR: lcd.print ("FAR"); retard (1000); lcd.clear (); Pause; par défaut: lcd.print ("NONE"); retard (1000); lcd.clear (); } } }
Enfin, téléchargez le code sur Arduino et attendez que le capteur s'initialise. Maintenant, lorsque le bouton est désactivé, cela signifie qu'il est en mode gestuel. Alors essayez de déplacer vos mains dans les directions gauche, droite, haut, bas. Pour les gestes lointains , gardez votre main à une distance de 2 à 4 pouces du capteur pendant 2 à 3 secondes et retirez-la. Et pour les gestes rapprochés , gardez votre main loin du capteur, puis approchez-la et retirez-la.
Maintenant, activez le bouton pour le mettre en mode de détection de couleur et prenez les objets rouges, bleus et verts un par un à proximité du capteur. Il imprimera la couleur de l'objet.