Search Code

Kontrola pozicije serva pomoću rukovnih gesti za Arduino

Kontrola pozicije serva pomoću rukovnih gesti za Arduino

U ovom tutorijalu naučićemo kako kontrolisati servo motor koristeći pokrete ruku. Pomeranjem ruke levo ili desno, možete naterati servo motor da odgovori u skladu s tim. Ovaj projekat koristi APDS-9960 senzor pokreta za detekciju pokreta ruku i prevođenje istih u pozicije servo motora. Za detaljno vizuelno objašnjenje, obavezno pogledajte video (u videu na 00:30).

APDS-9960 gesture sensor module -1

Osnovne komponente koje ćemo koristiti uključuju servo motor i APDS-9960 senzor pokreta. Servo motor će se okretati pod određenim uglovima na osnovu detektovanih pokreta, dok će APDS-9960 senzor interpretirati pokrete ruku. Ova postavka omogućava intuitivan način kontrole serva bez fizičkog dodira.

Objašnjena oprema

Servo motor je mali uređaj koji može rotirati na specifične uglove, što ga čini idealnim za primjene koje zahtijevaju precizno pozicioniranje. Obično ima tri žice: napajanje (crvena), uzemljenje (crna) i signal (narančasta). Signalna žica prima komande za pomjeranje serva na određeni ugao.

APDS-9960 je svestran senzor koji može detektovati geste, ambijentalnu svetlost i boje. Komunicira sa Arduinom putem I2C i zahteva nekoliko pinova za napajanje i prenos podataka. Senzor može detektovati pokrete kao što su gore, dole, levo i desno, koje ćemo koristiti za kontrolu serva.

Tehnički podaci

ProizvođačBroadcom
Broj dijelaAPDS-9960
Logika/IO napon2.4 - 3.6 V
Napon napajanja2.4 - 3.6 V
Izlazna struja (po kanalu)20 mA max
Upute za PWM frekvencijuNije primjenjivo
Ulazni logički pragovi0,3 V (nisko), 0,7 V (visoko)
Napon pada / RDS(on)/ zasićenjeNije primjenjivo
Termalne granice-40 do 85 °C
Pakovanje6,0 x 3,0 mm
Napomene / varijanteSenzor za geste, senzor za RGB svjetlost
  • Osigurajte da servo bude napajan odgovarajućim naponom (obično 5V).
  • Povežite APDS-9960 s Arduinom koristeći I2C komunikaciju.
  • Obratite pažnju na prekidač za senzor pokreta.
  • Koristite pull-up otpornike ako je potrebno za stabilno prepoznavanje signala.
  • Pobrinite se da kalibrirate senzor u različitim svjetlosnim uslovima za bolju tačnost.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Da biste povezali komponente, počnite sa servo motorom. Povežite crvenu žicu na 5V pin Arduina, crnu žicu na uzemljenje (GND), a narandžastu signalnu žicu na pin.9To će omogućiti Arduinu da kontroliše poziciju serva.

Sljedeće, povežite APDS-9960 senzor pokreta. SpojiteV_Npriključite na Arduino-ovih 3.3V, i GNDpriključite na tlo. TajINTpin treba biti povezan s pinom2na Arduinu, dok jeSDAiSCLigle idu na igleA4iA5, respektivno. Ova konfiguracija omogućava senzoru da efikasno komunicira sa Arduinom.

Primjeri koda i vodič

U funkciji postavljanja inicijalizujemo servo i senzor pokreta. Linijamyservo.attach(9);vezuje servo na pin 9, koji smo prethodno povezali. To omogućava servou da prima komande sa 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);
}

Sljedeće, definiramo kako sustav obrađuje geste u funkciji petlje. MetodahandleGesture();provjerava dostupne geste i izvršava odgovarajuće radnje. Na primjer, ako je otkrivena gesta lijevo, servo će se pomaknuti na 180 stepeni.

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

Na kraju, petlja neprekidno provjerava geste i ažurira poziciju servomotora na osnovu otkrivene geste. Osigurajte da testirate postavku u različitim uvjetima osvjetljenja kako biste dobili tačno prepoznavanje gesta.

Demonstracija / Šta očekivati

Kada je sve povezano i kod je otpremljen, trebali biste moći kontrolisati servo pomeranjem ruke levo ili desno. Servo će se okrenuti na 180 stepeni za levo gestikuliranje i vratiti na 0 stepeni za desno gestikuliranje. Ako gestovi nisu detektovani, proverite poziciju senzora i uslove osvetljenja u okolini (u videu na 05:30).

Poglavlja

  • Uvod - 00:00
  • Pregled hardvera - 01:30
  • Upute za ožičenje - 03:00
  • Objašnjenje koda - 04:30
  • Demonstracija - 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.