Cerca codice

Controllare la posizione del servo con gesti della mano per Arduino

Controllare la posizione del servo con gesti della mano per Arduino

In questo tutorial, impareremo come controllare un servomotore utilizzando gesti della mano. Muovendo la mano a sinistra o a destra, puoi far rispondere il servomotore di conseguenza. Questo progetto utilizza il sensore di gesti APDS-9960 per rilevare i movimenti della mano e tradurli in posizioni del servomotore. Per una spiegazione visiva dettagliata, assicurati di controllare il video (nel video a :30).

APDS-9960 gesture sensor module -1

I componenti principali che utilizzeremo includono un servomotore e il sensore di gesti APDS-9960. Il servomotore ruoterà a angoli specifici in base ai gesti rilevati, mentre il sensore APDS-9960 interpreterà i movimenti della mano. Questa configurazione consente un modo intuitivo per controllare il servomotore senza contatto fisico.

Hardware Spiegato

Il servomotore è un piccolo dispositivo che può ruotare a angoli specifici, rendendolo ideale per applicazioni che richiedono un posizionamento preciso. Ha tipicamente tre fili: alimentazione (rosso), terra (nero) e segnale (arancione). Il filo del segnale riceve comandi per muovere il servomotore a un angolo specificato.

L'APDS-9960 è un sensore versatile in grado di rilevare gesti, luce ambientale e colore. Comunica con l'Arduino tramite I2C e richiede alcuni pin per l'alimentazione e il trasferimento dei dati. Il sensore può rilevare movimenti come su, giù, sinistra e destra, che utilizzeremo per controllare il servo.

Dettagli della scheda tecnica

ProduttoreBroadcom
Numero di parteAPDS-9960
Tensione di logica/IO2,4 - 3,6 V
Tensione di alimentazione2,4 - 3,6 V
Corrente di uscita (per canale)20 mA max
Linee guida sulla frequenza PWMNon applicabile
Soglie logiche di ingresso0,3 V (basso), 0,7 V (alto)
Caduta di tensione / RDS(on)/ saturazioneNon applicabile
Limiti termici-40 a 85 °C
Pacchetto6,0 x 3,0 mm
Note / variantiRilevamento dei gesti, rilevamento della luce RGB
  • Assicurati che il servo sia alimentato con una tensione adeguata (tipicamente 5V).
  • Collegare l'APDS-9960 all'Arduino utilizzando la comunicazione I2C.
  • Fai attenzione al pin di interruzione per il sensore di gesti.
  • Utilizzare resistori di pull-up se necessario per una rilevazione del segnale stabile.
  • Assicurati di calibrare il sensore in diverse condizioni di illuminazione per una maggiore precisione.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Per cablare i componenti, inizia con il servo motore. Collega il filo rosso al pin 5V dell'Arduino, il filo nero a terra (GND) e il filo di segnale arancione al pin.9Questo permetterà all'Arduino di controllare la posizione del servo.

Successivamente, collega il sensore di gesti APDS-9960. Collega ilV_Ncollegare al 3.3V dell'Arduino, e ilGNDpin to ground. TheINTil pin deve essere collegato al pin2sull'Arduino, mentre ilSDAeSCLi perni vanno ai perniA4eA5, rispettivamente. Questa configurazione consente al sensore di comunicare efficacemente con l'Arduino.

Esempi di codice e guida passo passo

Nella funzione di setup, inizializziamo il servo e il sensore di gesti. La lineamyservo.attach(9);collega il servo al pin 9, che abbiamo precedentemente connesso. Questo consente al servo di ricevere comandi dall'Arduino.

APDS-9960 gesture sensor -3
void setup() {
 myservo.attach(9);  // 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);
}

Successivamente, definiamo come il sistema gestisce i gesti nella funzione loop. Il metodohandleGesture();controlla i gesti disponibili ed esegue le azioni corrispondenti. Ad esempio, se il gesto rilevato è a sinistra, il servo si muoverà a 180 gradi.

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_LEFT:
        myservo.write(180);  // added by RoboJax
        break;
      case DIR_RIGHT:
        myservo.write(0);   // added by RoboJax
        break;
    }
  }
}

Infine, il ciclo controlla continuamente i gesti e aggiorna la posizione del servo in base al gesto rilevato. Assicurati di testare l'impostazione in diverse condizioni di illuminazione per ottenere un riconoscimento dei gesti accurato.

Dimostrazione / Cosa Aspettarsi

Una volta che tutto è cablato e il codice è caricato, dovresti essere in grado di controllare il servo muovendo la mano a sinistra o a destra. Il servo ruoterà di 180 gradi per un gesto a sinistra e tornerà a 0 gradi per un gesto a destra. Se i gesti non vengono rilevati, controlla il posizionamento del sensore e le condizioni di luce circostanti (nel video alle 05:30).

Capitoli

  • Introduzione - 00:00
  • Panoramica dell'hardware - 01:30
  • Istruzioni di cablaggio - 03:00
  • Spiegazione del codice - 04:30
  • Dimostrazione - 06:00

Immagini

APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -1
APDS-9960 gesture sensor module -1
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
12-Source code for controlling a servo with your hand
Lingua: C++
++
/*
 * Modificato per RoboJax da A.B.S. il 09 maggio 2017  
 * ad Ajax, Ontario, Canada. www.RoboJax.com  
 * 
 * Fonte originale:  
 * APDS-9960 Sensore RGB e di Gestures  
 * Shawn Hymel @ SparkFun Electronics  
 * 30 maggio 2014  
 * https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor  
 * 
 * Distribuito così com'è; non viene fornita alcuna garanzia.
 */

#include <Wire.h>

 // aggiunto da RoboJax
#include <Servo.h>

#include <SparkFun_APDS9960.h>


Servo myservo; // crea un oggetto servo per controllare un servo // aggiunto da RoboJax

 // Spilli
#define APDS9960_INT    2 // Deve essere un pin di interruzione.

 // Costanti

 // Variabili Globali
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {
 myservo.attach(9); // collega il servo al pin 9 all'oggetto servo
 // Imposta il pin di interrupt come ingresso
  pinMode(APDS9960_INT, INPUT);

 // Inizializza la porta seriale
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));

 // Inizializza la routine di servizio per le interruzioni
  attachInterrupt(0, interruptRoutine, FALLING);

 // Inizializza APDS-9960 (configura I2C e valori iniziali)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

 // Avvia il motore del sensore di gesti 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); // aggiunto da RoboJax
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(0); // aggiunto da RoboJax
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Risorse e riferimenti

Nessuna risorsa ancora.

File📁

Nessun file disponibile.