Soek Kode

Beheer van Servo Posisie met Handgebare vir Arduino

Beheer van Servo Posisie met Handgebare vir Arduino

In hierdie tutoriaal sal ons leer hoe om 'n servo-motor te beheer met handgebare. Deur jou hand links of regs te beweeg, kan jy die servo-motor laat reageer. Hierdie projek maak gebruik van die APDS-9960 gebaar sensor om handbewegings te detecteer en dit in servo-posisies te vertaal. Vir 'n gedetailleerde visuele verduideliking, maak seker om die video te kyk (in video by 00:30).

APDS-9960 gesture sensor module -1

Die kernkomponente wat ons gaan gebruik, sluit 'n servo-motor en die APDS-9960 gebaar sensor in. Die servo-motor sal na spesifieke hoeke draai gebaseer op die gedetecteerde gebare, terwyl die APDS-9960 sensor die handbeweging interpreteer. Hierdie opstelling maak 'n intuïtiewe manier moontlik om die servo te beheer sonder fisiese aanraking.

Hardeware verduidelik

Die servo-motor is 'n klein toestel wat na spesifieke hoeke kan draai, wat dit ideaal maak vir toepassings wat presiese posisionering vereis. Dit het tipies drie drade: krag (rooi), grond (swart), en sein (oranje). Die sein draad ontvang opdragte om die servo na 'n gespesifiseerde hoek te beweeg.

Die APDS-9960 is 'n veelsydige sensor wat gebare, omgewingslig en kleur kan opspoor. Dit kommunikeer met die Arduino via I2C en vereis 'n paar penne vir krag en datatransfer. Die sensor kan bewegings soos op, af, links en regs opspoor, wat ons sal gebruik om die servo te beheer.

Datasheet Besonderhede

FabrikantBroadcom
Onderdeel nommerAPDS-9960
Logika/IO spanning2.4 - 3.6 V
Voorsienings spanning2.4 - 3.6 V
Uitsetstroom (per kanaal)20 mA maks
PWM frekwensie riglynenie van toepassing
Invoerlingsdrempels0.3 V (laag), 0.7 V (hoog)
Spanningstoename / RDS(on)/ versadigingNie van toepassing
Termiese perke-40 tot 85 °C
Pakket6.0 x 3.0 mm
Notas / varianteGebaaropsporing, RGB ligopsporing
  • Verseker dat die servo met voldoende spanning (tipies 5V) van krag voorsien word.
  • Koppel die APDS-9960 aan die Arduino met behulp van I2C kommunikasie.
  • Let op die onderbreking pin vir die gebaar sensor.
  • Gebruik trekweerstande indien nodig vir stabiele seinopsporing.
  • Maak seker dat jy die sensor in verskillende beligtingstoestande kalibreer vir beter akkuraatheid.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Om die komponente te bedrading, begin met die servo-motor. Verbind die rooi draad met die Arduino se 5V pen, die swart draad met die grond (GND), en die oranje sein draad met die pen.9Dit sal die Arduino in staat stel om die servo se posisie te beheer.

Volgende, bedrading die APDS-9960 gebaar sensor. Sluit dieV_Npen na die Arduino se 3.3V, en dieGNDpen na grond. DieINTpen moet aan pen gekoppel wees2op die Arduino, terwyl dieSDAenSCLpennet gaan na pennetA4enA5, onderskeidelik. Hierdie konfigurasie stel die sensor in staat om effektief met die Arduino te kommunikeer.

Kode Voorbeelde & Staproete

In die opstelling funksie, stel ons die servo en die gebaar sensor in. Die lynmyservo.attach(9);bind die servo aan pen 9, wat ons voorheen gekoppel het. Dit stel die servo in staat om opdragte van die Arduino te ontvang.

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

Volgende, definieer ons hoe die stelsel gebare in die lusfunksie hanteer. Die metodehandleGesture();kontroleer beskikbare gebare en voer ooreenstemmende aksies uit. Byvoorbeeld, as die gebaar wat opgespoor word links is, sal die servo na 180 grade beweeg.

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

Laastens, die lus kontinueerlik nagaan vir gebare en werk die servo-posisie op grond van die opgespoor gebaar by. Maak seker om die opstelling in verskillende beligtingsomstandighede te toets om akkurate gebaarherkenning te verkry.

Demonstraasie / Wat om te verwag

Sodra alles gekabel is en die kode opgelaai is, behoort jy die servo te kan beheer deur jou hand links of regs te beweeg. Die servo sal na 180 grade draai vir 'n linker gebaar en terugkeer na 0 grade vir 'n regter gebaar. As die gebare nie opgespoor word nie, kyk na die sensor se posisionering en die omringende ligtoestande (in die video om 05:30).

Hoofstukke

  • Inleiding - 00:00
  • Hardeware Oorsig - 01:30
  • Draadopdragte - 03:00
  • Kode verduideliking - 04:30
  • Demonstrasie - 06:00

Beelde

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

Hulpbronne en verwysings

Geen hulpbronne nog.

Lêers📁

Geen lêers beskikbaar.