Search Code

Controlul poziției servo cu gesturi de mână pentru Arduino

Controlul poziției servo cu gesturi de mână pentru Arduino

În acest tutorial, vom învăța cum să controlăm un motor servo folosind gesturi cu mâinile. Prin mișcarea mâinii spre stânga sau dreapta, poți face motorul servo să răspundă corespunzător. Acest proiect utilizează senzorul de gesturi APDS-9960 pentru a detecta mișcările mâinii și a le traduce în poziții ale motorului servo. Pentru o explicație vizuală detaliată, asigură-te că verifici videoclipul la (în videoclip la 00:30).

APDS-9960 gesture sensor module -1

Componentele de bază pe care le vom folosi includ un motor servo și senzorul de gesturi APDS-9960. Motorul servo se va roti la unghiuri specifice în funcție de gesturile detectate, în timp ce senzorul APDS-9960 va interpreta mișcările mâinii. Această configurație permite o modalitate intuitivă de a controla motorul servo fără contact fizic.

Hardware explicat

Motorul servo este un dispozitiv mic care poate rota la unghiuri specifice, făcându-l ideal pentru aplicații care necesită poziționare precisă. De obicei, are trei fire: alimentare (roșu), masă (negru) și semnal (portocaliu). Firul de semnal primește comenzi pentru a muta servo-ul la un unghi specificat.

APDS-9960 este un senzor versatil care poate detecta gesturi, lumină ambientală și culoare. Acesta comunică cu Arduino prin I2C și necesită câteva pini pentru alimentare și transfer de date. Senzorul poate detecta mișcări precum sus, jos, stânga și dreapta, pe care le vom folosi pentru a controla servomotorul.

Detalii fișă tehnică

ProducătorBroadcom
Număr de parteAPDS-9960
Tensiune logică/IO2.4 - 3.6 V
Tensiune de alimentare2.4 - 3.6 V
Curent de ieșire (pe canal)20 mA max
Ghid pentru frecvența PWMNu este cazul
Praguri logici de intrare0,3 V (scăzut), 0,7 V (ridicat)
Cădere de tensiune / RDS(on)/ saturațieNu este cazul
Limite termice-40 până la 85 °C
Pachet6,0 x 3,0 mm
Note / varianteSenzor de gesturi, senzor de lumină RGB
  • Asigurați-vă că servomotorul este alimentat cu o tensiune adecvată (de obicei 5V).
  • Conectați APDS-9960 la Arduino folosind comunicația I2C.
  • Acordați atenție pinului de întrerupere pentru senzorul de gesturi.
  • Utilizați rezistențe de pull-up dacă este necesar pentru o detecție stabilă a semnalului.
  • Asigurați-vă că calibrați senzorul în diferite condiții de iluminare pentru o mai bună precizie.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Pentru a conecta componentele, începe cu motorul servo. Conectează firul roșu la pinul de 5V al Arduino-ului, firul negru la masă (GND) și firul de semnal portocaliu la pin.9Acest lucru va permite Arduino-ului să controleze poziția servomotorului.

Apoi, conectați senzorul de gesturi APDS-9960. Conectați-l laV_Nconectează la 3.3V al Arduino-ului, iarGNDpune la pământ. TheINTpinul ar trebui să fie conectat la pinul2pe Arduino, în timp ceSDAșiSCLpinii merg la piniA4șiA5, respectiv. Această configurație permite senzorului să comunice eficient cu Arduino.

Exemple de cod și ghiduri

În funcția de configurare, inițializăm servomotorul și senzorul de gesturi. Liniamyservo.attach(9);leagă servomotorul la pinul 9, pe care l-am conectat anterior. Acest lucru permite servomotorului să primească comenzi de la 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);
}

Apoi, definim cum sistemul gestionează gesturile în funcția loop. MetodahandleGesture();verifică gesturile disponibile și execută acțiunile corespunzătoare. De exemplu, dacă gestul detectat este la stânga, servomotorul se va deplasa la 180 de grade.

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;
    }
  }
}

În cele din urmă, bucla verifică continuu gesturile și actualizează poziția servomotorului pe baza gestului detectat. Asigurați-vă că testați configurația în diferite condiții de iluminare pentru a obține o recunoaștere precisă a gesturilor.

Demonstrație / Ce să aștepți

Odată ce totul este conectat și codul este încărcat, ar trebui să poți controla servomotorul mișcându-ți mâna la stânga sau la dreapta. Servomotorul se va roti la 180 de grade pentru un gest la stânga și va reveni la 0 grade pentru un gest la dreapta. Dacă gesturile nu sunt detectate, verifică poziționarea senzorului și condițiile de iluminare din jur (în video la 05:30).

Capitole

  • Introducere - 00:00
  • Prezentare generală a hardware-ului - 01:30
  • Instrucțiuni de cablare - 03:00
  • Explicație cod - 04:30
  • Demonstrație - 06:00

Imagini

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
Limba: C++
++
/****************************************************************
Modified for RoboJax by A.B.S. on May 09, 2017
in Ajax, Ontario, Canada. www.RoboJax.com


Original Source:
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor


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

#include <Wire.h>

// added by RoboJax
#include <Servo.h>

#include <SparkFun_APDS9960.h>


Servo myservo;  // create servo object to control a servo // added by RoboJax

// 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(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);
  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");
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        myservo.write(180);  // added by RoboJax
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(0);   // added by RoboJax
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Resurse și referințe

Încă nu sunt resurse.

Fișiere📁

Nu sunt disponibile fișiere.