Search Code

Kontrollera servoposition med handgester för Arduino

Kontrollera servoposition med handgester för Arduino

I den här handledningen kommer vi att lära oss hur man kontrollerar en servomotor med handgester. Genom att flytta handen åt vänster eller höger kan du få servomotorn att reagera därefter. Det här projektet använder APDS-9960 gestsensor för att upptäcka handrörelser och översätta dem till servopositioner. För en detaljerad visuell förklaring, se till att kolla på videon vid (i videon vid 00:30).

APDS-9960 gesture sensor module -1

De centrala komponenterna vi kommer att använda inkluderar en servomotor och APDS-9960 gestsensor. Servomotorn kommer att rotera till specifika vinklar baserat på de upptäckta gesterna, medan APDS-9960 sensorn kommer att tolka handrörelserna. Denna uppsättning möjliggör ett intuitivt sätt att styra servon utan fysisk beröring.

Hårdvara förklarad

Servomotorn är en liten enhet som kan rotera till specifika vinklar, vilket gör den idealisk för tillämpningar som kräver precis positionering. Den har vanligtvis tre ledningar: ström (röd), jord (svart) och signal (orange). Signalledningen tar emot kommandon för att flytta servot till en angiven vinkel.

APDS-9960 är en mångsidig sensor som kan upptäcka gester, omgivande ljus och färg. Den kommunicerar med Arduino via I2C och kräver några stift för ström och datatransfer. Sensorn kan upptäcka rörelser som upp, ner, vänster och höger, vilket vi kommer att använda för att styra servot.

Datablad Detaljer

TillverkareBroadcom
DelnummerAPDS-9960
Logik/IO-spänning2,4 - 3,6 V
Försörjningsspänning2,4 - 3,6 V
Utgångsström (per kanal)20 mA max
PWM-frekvens vägledningInte tillämpligt
Inmatningslogiktrösklar0,3 V (låg), 0,7 V (hög)
Spänningsfall / RDS(on)/ mättnadEj tillämpligt
Termiska gränser-40 till 85 °C
Paket6,0 x 3,0 mm
Anteckningar / varianterGesturesensor, RGB ljussensor
  • Se till att servot är strömsatt med tillräcklig spänning (vanligtvis 5V).
  • Anslut APDS-9960 till Arduino med hjälp av I2C-kommunikation.
  • Var uppmärksam på avbrottspinnen för gestsensor.
  • Använd pull-up-motstånd om det behövs för stabil signaldetektering.
  • Se till att kalibrera sensorn under olika ljusförhållanden för bättre noggrannhet.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

För att koppla ihop komponenterna, börja med servomotorn. Anslut den röda ledningen till Arduinos 5V-stift, den svarta ledningen till jord (GND) och den orange signalledningen till stift9Detta kommer att göra det möjligt för Arduino att styra servots position.

Nästa, koppla APDS-9960 gestsensor. Anslut denV_Nkoppla till Arduinos 3,3V, och denGNDpin till mark. DenINTpin bör kopplas till pin2på Arduino, medan denSDAochSCLpinnar går till pinnarA4ochA5, respektive. Denna konfiguration gör det möjligt för sensorn att kommunicera effektivt med Arduino.

Kodexempel och genomgång

I inställningsfunktionen initierar vi servot och gestsensor. Radenmyservo.attach(9);binder servon till pin 9, som vi tidigare kopplade. Detta gör att servon kan ta emot kommandon från 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);
}

Nästa definierar vi hur systemet hanterar gester i loop-funktionen. MetodenhandleGesture();kontrollerar tillgängliga gester och utför motsvarande åtgärder. Till exempel, om gesten som upptäckts är vänster, kommer servon att röra sig till 180 grader.

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

Slutligen kontrollerar loopen kontinuerligt efter gester och uppdaterar servopositionen baserat på den upptäckta gesten. Se till att testa installationen under olika ljusförhållanden för att få en noggrann gestigenkänning.

Demonstration / Vad man kan förvänta sig

När allt är kopplat och koden är uppladdad, bör du kunna styra servot genom att flytta din hand åt vänster eller höger. Servot kommer att rotera till 180 grader för en vänstergest och återgå till 0 grader för en högergest. Om gesterna inte upptäcks, kontrollera sensorernas placering och omgivande ljusförhållanden (i videon vid 05:30).

Kapitel

  • Introduktion - 00:00
  • Hårdvaruöversikt - 01:30
  • Kopplingsanvisningar - 03:00
  • Kodförklaring - 04:30
  • Demonstration - 06:00

Bilder

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
Språk: 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");
    }
  }
}

Resurser och referenser

Inga resurser än.

Filer📁

Inga filer tillgängliga.