Search Code

Ovládanie pozície serva pomocou gest rúk pre Arduino

Ovládanie pozície serva pomocou gest rúk pre Arduino

V tomto tutoriále sa naučíme, ako ovládať servomotor pomocou pohybov rúk. Pohybovaním ruky doľava alebo doprava môžete spôsobiť, že servomotor zareaguje zodpovedajúcim spôsobom. Tento projekt využíva senzor pohybu APDS-9960 na detekciu pohybov rúk a ich preklad do pozícií servomotora. Pre podrobnú vizuálnu ukážku sa uistite, že si pozriete video (vo videu o 00:30).

APDS-9960 gesture sensor module -1

Hlavné komponenty, ktoré budeme používať, zahŕňajú servomotor a senzor gest APDS-9960. Servomotor sa otočí na konkrétne uhly na základe detekovaných gest, zatiaľ čo senzor APDS-9960 bude interpretovať pohyby rúk. Toto usporiadanie umožňuje intuitívny spôsob ovládania serva bez fyzického dotyku.

Vysvetlenie hardvéru

Servomotor je malý zariadenie, ktoré sa môže otáčať na konkrétne uhly, čo ho robí ideálnym pre aplikácie, ktoré vyžadujú presné polohovanie. Zvyčajne má tri vodiče: napájanie (červený), zem (čierny) a signál (oranžový). Signálny vodič prijíma príkazy na pohyb serva na určený uhol.

APDS-9960 je všestranný senzor, ktorý dokáže detekovať gestá, ambientné svetlo a farbu. Komunikuje s Arduinom cez I2C a vyžaduje niekoľko pinov na napájanie a prenos dát. Senzor dokáže detekovať pohyby ako hore, dole, vľavo a vpravo, ktoré použijeme na ovládanie serva.

Technické údaje

VýrobcaBroadcom
Číslo dieluAPDS-9960
Logika/IO napätie2.4 - 3.6 V
Napájacie napätie2.4 - 3.6 V
Výstupný prúd (na kanál)20 mA max
Pokyny pre PWM frekvenciuNedá sa použiť
Vstupné logické prahy0,3 V (nízke), 0,7 V (vysoké)
Pokles napätia / RDS(on)/ saturáciaNedá sa použiť
Tepelné limity-40 až 85 °C
Balík6,0 x 3,0 mm
Poznámky / variantySnímanie gest, snímanie RGB svetla
  • Uistite sa, že servo je napájané dostatočným napätím (typicky 5V).
  • Pripojte APDS-9960 k Arduinu pomocou I2C komunikácie.
  • Ven pozornosť na prerušenie pinu pre senzor gest.
  • Použite pull-up rezistory, ak je to potrebné na stabilné detekovanie signálu.
  • Uistite sa, že senzor kalibrujete v rôznych svetelných podmienkach pre lepšiu presnosť.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Na zapojenie komponentov začnite so servomotorom. Pripojte červený vodič k 5V pinu Arduina, čierny vodič k zemi (GND) a oranžový signálny vodič k pinu.9. To umožní Arduinu ovládať polohu serva.

Ďalej pripojte senzor gest APDS-9960. PripojteV_Npripojte k 3,3V na Arduine aGNDuzemniť. TenINTpin by mal byť pripojený k pin2na Arduine, zatiaľ čoSDAaSCLkolíky idú na kolíkyA4aA5, resp. Táto konfigurácia umožňuje senzoru efektívne komunikovať s Arduinom.

Príklady kódu a návod

V nastavovacej funkcii inicializujeme servo a senzor pohybu. Riadokmyservo.attach(9);pripája servomotor k pinu 9, ktorý sme predtým pripojili. To umožňuje servomotoru prijímať príkazy z Arduina.

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

Ďalej definujeme, ako systém spracováva gestá v slučkovej funkcii. MetódahandleGesture();kontroluje dostupné gestá a vykonáva zodpovedajúce akcie. Napríklad, ak je zistené gesto vľavo, servo sa posunie na 180 stupňov.

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

Nakoniec, slučka neustále kontroluje gestá a aktualizuje polohu serva na základe zisteného gesta. Uistite sa, že ste nastavenie otestovali v rôznych svetelných podmienkach, aby ste dosiahli presné rozpoznávanie gest.

Demonštrácia / Čo očakávať

Akonáhle je všetko zapojené a kód je nahraný, mali by ste byť schopní ovládať servo pohybom ruky doľava alebo doprava. Servo sa otočí na 180 stupňov pri gesto doľava a vráti sa na 0 stupňov pri gesto doprava. Ak sa gesta nezaznamenajú, skontrolujte umiestnenie senzora a okolité svetelné podmienky (vo videu o 05:30).

Kapitoly

  • Úvod - 00:00
  • Prehľad hardvéru - 01:30
  • Inštrukcie na zapojenie - 03:00
  • Vysvetlenie kódu - 04:30
  • Demonstrácia - 06:00

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
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
Language: 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");
    }
  }
}

Resources & references

No resources yet.

Files📁

No files available.