This tutorial is part of: Servomotoren
Alle video's over servomotoren die hiermee verband houden, staan hier vermeld. Links naar andere video's vindt u onder dit artikel.
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).

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
| Fabrikant | Broadcom |
|---|---|
| Onderdeelnummer | APDS-9960 |
| Logica/IO spanning | 2,4 - 3,6 V |
| Voedingsspanning | 2,4 - 3,6 V |
| Uitgangsstroom (per kanaal) | 20 mA max |
| PWM frequentie richtlijnen | Niet van toepassing |
| Ingangslogische drempels | 0,3 V (laag), 0,7 V (hoog) |
| Spanningsval / RDS(on)/ verzadiging | Niet van toepassing |
| Thermische limieten | -40 tot 85 °C |
| Pakket | 6,0 x 3,0 mm |
| Notities / varianten | Gebaarherkenning, 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.

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.

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
This tutorial is part of: Servomotoren
- Controlling a Servo with Push Buttons Using Arduino
- Control a Servo Motor with a Push Button: Move Servo and Return SPB-1
- Control a Servo Motor with a Push Button: Move Servo in One Direction SPB-2
- Controlling a Servo Motor with a Push Button: Move Servo While Button Is Pressed (SPB-3)
- Controlling a Servo with a Potentiometer Using Arduino
- Controlling a Servo with Potentiometer and LCD1602 using Arduino
- Controlling Servo Motors Using an Infrared Remote with Arduino
- Arduino Servo Motorbesturing met een Potentiometer
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- How to Use Continuous 360° Servo with Arduino
- Arduino Code and Video for PCA9685 16-Channel 12-Bit Servo Controller V1
- Build an Arduino Servo Toggle Switch with a Push Button
++
/****************************************************************
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.