Search Code

Servo-positie besturen met handgebaren voor Arduino

Servo-positie besturen met handgebaren voor Arduino

In deze tutorial leren we hoe we een servomotor kunnen bedienen met handgebaren. Door je hand naar links of rechts te bewegen, kun je de servomotor dienovereenkomstig laten reageren. Dit project maakt gebruik van de APDS-9960 gebaar sensor om handbewegingen te detecteren en deze om te zetten in servoposities. Voor een gedetailleerde visuele uitleg, zorg ervoor dat je de video bekijkt (in video op 00:30).

APDS-9960 gesture sensor module -1

De kerncomponenten die we zullen gebruiken zijn een servomotor en de APDS-9960 gebaarsensor. De servomotor zal draaien naar specifieke hoeken op basis van de gedetecteerde gebaren, terwijl de APDS-9960 sensor de handbewegingen zal interpreteren. Deze opstelling maakt een intuïtieve manier mogelijk om de servomotor te bedienen zonder fysiek contact.

Hardware Uitleg

De servomotor is een klein apparaat dat naar specifieke hoeken kan draaien, waardoor het ideaal is voor toepassingen die nauwkeurige positionering vereisen. Het heeft doorgaans drie draden: voeding (rood), aarde (zwart) en signaal (oranje). De signaaldraad ontvangt commando's om de servo naar een opgegeven hoek te bewegen.

De APDS-9960 is een veelzijdige sensor die gebaren, omgevingslicht en kleur kan detecteren. Hij communiceert met de Arduino via I2C en heeft een paar pinnen nodig voor stroom en gegevensoverdracht. De sensor kan bewegingen detecteren zoals omhoog, omlaag, links en rechts, die we zullen gebruiken om de servo te bedienen.

Datasheet Gegevens

FabrikantBroadcom
OnderdeelnummerAPDS-9960
Logica/IO spanning2,4 - 3,6 V
Voedingsspanning2,4 - 3,6 V
Uitgangsstroom (per kanaal)20 mA max
PWM frequentie richtlijnenNiet van toepassing
Ingangslogische drempels0,3 V (laag), 0,7 V (hoog)
Spanningsval / RDS(on)/ verzadigingNiet van toepassing
Thermische limieten-40 tot 85 °C
Pakket6,0 x 3,0 mm
Notities / variantenGebaarherkenning, RGB-lichtdetectie
  • Zorg ervoor dat de servo van voldoende spanning is voorzien (typisch 5V).
  • Verbind de APDS-9960 met de Arduino via I2C-communicatie.
  • Let op de interruptpin voor de gebaarsensor.
  • Gebruik indien nodig pull-up weerstanden voor een stabiele signaaldetectie.
  • Zorg ervoor dat je de sensor in verschillende lichtomstandigheden kalibreert voor betere nauwkeurigheid.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Om de componenten aan te sluiten, begin met de servomotor. Verbind de rode draad met de 5V-pin van de Arduino, de zwarte draad met de aarde (GND) en de oranje signaaldraad met pin9Dit stelt de Arduino in staat om de positie van de servo te regelen.

Vervolgens sluit je de APDS-9960 gebaar sensor aan. Verbind deV_Npin naar de 3,3V van de Arduino, en deGNDpin naar de grond. DeINTpin moet worden verbonden met pin2op de Arduino, terwijl deSDAenSCLpinnen gaan naar pinnenA4enA5, respectievelijk. Deze configuratie stelt de sensor in staat om effectief te communiceren met de Arduino.

Codevoorbeelden en Stappenplan

In de setup-functie initialiseren we de servo en de gebaarsensor. De regelmyservo.attach(9);bindt de servo aan pin 9, die we eerder hebben aangesloten. Dit stelt de servo in staat om commando's van de Arduino te ontvangen.

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

Vervolgens definiëren we hoe het systeem gebaren behandelt in de lusfunctie. De methodehandleGesture();controleert op beschikbare gebaren en voert de bijbehorende acties uit. Als het gedetecteerde gebaar bijvoorbeeld links is, zal de servo naar 180 graden bewegen.

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

Ten slotte controleert de lus continu op gebaren en werkt de servo-positie bij op basis van het gedetecteerde gebaar. Zorg ervoor dat je de opstelling test onder verschillende lichtomstandigheden om een nauwkeurige gebarenherkenning te krijgen.

Demonstratie / Wat te Verwachten

Zodra alles is aangesloten en de code is geüpload, zou je in staat moeten zijn om de servo te bedienen door je hand naar links of rechts te bewegen. De servo draait naar 180 graden voor een linkergebaar en keert terug naar 0 graden voor een rechtergebaar. Als de gebaren niet worden gedetecteerd, controleer dan de positie van de sensor en de omgevingslichtomstandigheden (in de video om 05:30).

Hoofdstukken

  • Inleiding - 00:00
  • Hardware Overzicht - 01:30
  • Bedradinginstructies - 03:00
  • Code Uitleg - 04:30
  • Demonstratie - 06:00

Afbeeldingen

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

Hulpmiddelen en referenties

Nog geen middelen.

Bestanden📁

Geen bestanden beschikbaar.