Code de recherche

Leçon 100 : Contrôler un servomoteur avec les gestes de la main

Leçon 100 : Contrôler un servomoteur avec les gestes de la main

Imaginez contrôler un servomoteur avec rien de plus qu'un geste de la main. Ce projet utilise le capteur de gestes APDS-9960 pour détecter les mouvements de la main (gauche, droite, haut, bas, proche et loin) et les traduit en positions du servomoteur. C'est une façon amusante et intuitive d'ajouter un contrôle basé sur les gestes à vos projets Arduino. Vous pouvez l'utiliser pour créer une nacelle de caméra mains libres, un bras robotique contrôlé par gestes, un bouton de volume sans contact pour un lecteur de musique, ou une installation artistique interactive qui réagit au mouvement. Le capteur détecte la direction de votre main et le servomoteur la suit, tandis que le moniteur série affiche le geste détecté en temps réel.

APDS-9960 gesture sensor -3
Capteur de gestes APDS-9960 -3

Composants matériels

  • Arduino Uno (ou toute carte compatible)
  • Capteur RVB et de gestes APDS-9960
  • Servomoteur (par exemple, SG90 ou similaire)
  • Fils de connexion

Le capteur APDS-9960 est un composant polyvalent qui peut détecter les gestes, la proximité et la lumière ambiante. La carte spécifique que vous possédez peut varier en forme ou en couleur, mais le capteur sous-jacent et les fonctions des broches restent les mêmes. Pour ce projet, nous nous concentrerons sur les capacités de détection de gestes et utiliserons les broches I2C (SDA et SCL) ainsi que la broche d'interruption pour communiquer avec l'Arduino. Le capteur doit être alimenté en 3,3 V, car il ne tolère pas le 5 V. Le servomoteur est un servo analogique standard que nous contrôlerons à l'aide d'une broche compatible PWM.

Guide de câblage

Câblage Arduino de l'APDS9960 pour contrôler un servomoteur avec un geste de la main

Voici le schéma de câblage pour connecter le capteur APDS-9960 et le servomoteur à l'Arduino Uno. (dans la vidéo à 01:45)

Connexions du capteur de gestes APDS-9960

  • VCC → Arduino 3,3 V (le capteur ne tolère pas le 5 V)
  • GND → Arduino GND
  • SDA → Arduino A4 (données I2C)
  • SCL → Arduino A5 (horloge I2C)
  • INT → Arduino Broche 2 (doit être une broche compatible interruption)

Connexions du servomoteur

  • Signal (fil orange ou blanc) → Arduino Broche 9 (broche compatible PWM)
  • Alimentation (fil du milieu, généralement rouge) → Arduino 5 V
  • Masse (fil marron ou noir) → Arduino GND

Il est crucial de connecter la broche d'interruption du capteur à l'une des broches d'interruption de l'Arduino (broches 2 ou 3 sur l'Uno). Cela permet au capteur de signaler immédiatement au microcontrôleur lorsqu'un geste est détecté, plutôt que d'interroger constamment le capteur. Pour le servomoteur, assurez-vous d'utiliser une broche compatible PWM (marquée du symbole tilde "~" sur la carte). Connecter le servomoteur à une broche non PWM, comme la broche 4, l'empêchera de fonctionner correctement. (dans la vidéo à 02:14)

Explication du code

Avant de téléverser le code, vous devrez installer la bibliothèque SparkFun APDS-9960. Dans l'IDE Arduino, allez dans Croquis → Inclure une bibliothèque → Gérer les bibliothèques, recherchez "APDS9960" et installez la bibliothèque de SparkFun. (dans la vidéo à 02:38)

Le code de ce projet est simple. Les parties clés configurables par l'utilisateur sont les variables en haut du croquis. Vous pouvez les ajuster pour modifier le comportement du servomoteur sans toucher au reste du code.

int servoPin  = 9;          // Broche pour le signal du servomoteur
int downAngle = 135;        // Angle du servomoteur pour le geste BAS
int upAngle = 45;           // Angle du servomoteur pour le geste HAUT
int rightAngle = 0;         // Angle du servomoteur pour le geste DROITE
int leftAngle = 180;        // Angle du servomoteur pour le geste GAUCHE
int angleStep = 2;          // Taille du pas pour le balayage du servomoteur
int angle = 90;             // Angle initial du servomoteur

Ces variables définissent les positions cibles du servomoteur pour chaque geste. Par exemple, leftAngle est défini à 180 degrés, donc lorsque vous balayez votre main vers la gauche, le servomoteur tournera à 180 degrés. Vous pouvez modifier ces valeurs pour les adapter à votre configuration mécanique. La variable angleStep contrôle la vitesse et la fluidité du balayage du servomoteur lorsqu'un geste PROCHE est détecté ; une valeur plus petite entraîne un mouvement plus lent et plus fluide.

APDS-9960 gesture sensor -3

La fonction nearAction() est une routine personnalisée qui fait balayer le servomoteur de son angle minimum à son angle maximum, puis de nouveau en arrière. Elle est déclenchée lorsque vous approchez votre main du capteur. La fonction farAction() est un espace réservé où vous pouvez ajouter votre propre code pour définir ce qui se passe lorsqu'un geste LOIN est détecté.

Démonstration en direct du projet

Une fois le code téléchargé, le capteur est prêt. Dans la démonstration, lorsqu'une main est balayée vers la gauche, le servo se déplace vers la gauche (180 degrés) ; lorsqu'elle est balayée vers la droite, il se déplace vers la droite (0 degrés). Le moniteur série affiche le geste détecté. Pour les gestes HAUT et BAS, le servo se déplace vers les angles que vous avez définis. Un geste PROCHE déclenche un mouvement de balayage de 0 à 180 degrés et retour, tandis qu'un geste LOIN est détecté lorsque votre main est éloignée. Le système répond de manière fiable à tous les gestes, ce qui en fait un excellent point de départ pour des projets plus complexes contrôlés par gestes. (dans la vidéo à 03:26)

Chapitres vidéo

  • [00:00] Introduction et démonstration du projet
  • [00:47] Aperçu du matériel : capteur APDS-9960 et servo
  • [01:45] Guide de câblage pour le capteur et le servo
  • [02:38] Installation de la bibliothèque SparkFun APDS-9960
  • [03:26] Démonstration en direct et sortie du moniteur série
  • [04:27] Remarques finales et soutien

Images

SG90 Mini Servo Motor
SG90 Mini Servo Motor
Arduino wiring of APDS9960 to control Servo motor using hand gesture
Arduino wiring of APDS9960 to control Servo motor using hand gesture
APDS-9960 gesture sensor -3
APDS-9960 gesture sensor -3
SG90 servo
SG90 servo
414-Lesson 100: Control a Servo Motor with Your Hand Gestures
Langue: C++
/*
 * Arduino Step by Step Course by Robojax 
 * Lesson 100: Control Servo Motor with your hand gesture 
 * Using hand gesture RIGHT, LEFT, UP, DOWN, FAR, NEAR we control the motor in any way we want
 * video details: https://youtu.be/BUSqppjNw-Y
 * Code written based on sample from this code https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
 * on February 13, 2022 by Ahmad Shamshiri.
 * 
 * This code is part of Arduino Step by Step Course which starts here:  https://youtu.be/-6qSrDUA5a8
 * 
 * for library of this code visit http://robojax.com/
 * 
If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal by credit card https://bit.ly/donate-robojax
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor

Tests the gesture sensing abilities of the APDS-9960. Configures
APDS-9960 over I2C and waits for gesture events. Calculates the
direction of the swipe (up, down, left, right) and displays it
on a serial console. 

To perform a NEAR gesture, hold your hand
far above the sensor and move it close to the sensor (within 2
inches). Hold your hand there for at least 1 second and move it
away.

To perform a FAR gesture, hold your hand within 2 inches of the
sensor for at least 1 second and then move it above (out of
range) of the sensor.

Hardware Connections:

IMPORTANT: The APDS-9960 can only accept 3.3V!
 
 Arduino Pin  APDS-9960 Board  Function
 
 3.3V         VCC              Power
 GND          GND              Ground
 A4           SDA              I2C Data
 A5           SCL              I2C Clock
 2            INT              Interrupt

Resources:
Include Wire.h and SparkFun_APDS-9960.h

This code is beerware; if you see me (or any other SparkFun 
employee) at the local, and you've found our code helpful, please
buy us a round!

Distributed as-is; no warranty is given.
****************************************************************/

#include <Wire.h>
#include <Servo.h>
#include <SparkFun_APDS9960.h>
//see details in this video: https://youtu.be/BUSqppjNw-Y
int servoPin  =9;
int downAngle =135;
int upAngle = 45;
int rightAngle = 0;
int leftAngle = 180;

int angleStep =2;
int angle =90; //initial Angle

const int minAngle = 0;
const int maxAngle = 180;
Servo myservo;  // create servo object to control a servo

// Pins
#define APDS9960_INT    2 // Needs to be an interrupt pin

// Constants

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

void setup() {
 myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
  // Set interrupt pin as input
  pinMode(APDS9960_INT, INPUT);

  // Initialize Serial port
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  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!"));
  }
  
  // Start running the APDS-9960 gesture sensor engine
  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");
        myservo.write(upAngle); 
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        myservo.write(downAngle);  
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        myservo.write(leftAngle);  
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(rightAngle);  
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        nearAction();
        break;
      case DIR_FAR:
        Serial.println("FAR");
        farAction();
        break;
      default:
        Serial.println("NONE");
    }
  }
}

void nearAction()
{

  for (angle = minAngle; angle <= maxAngle; angle += angleStep) { 
    // in steps of angleStep degree
    myservo.write(angle); 
    delay(15);                   
  }
  for (angle = maxAngle; angle >= minAngle; angle -= angleStep) { 
    myservo.write(angle);              
    delay(15);                      
  }  
}//nearAction() ends


 void farAction()
{

 //do something here
}//farAction() ends

Ressources et références

Aucune ressource pour le moment.

Fichiers📁

Autres fichiers