This tutorial is part of: Servomotory
Všetky videá súvisiace so servomotormi sú uvedené tu. Odkazy na ďalšie videá nájdete pod týmto článkom.
Ovládanie pozície serva pomocou gest rúk pre Arduino
V tomto tutoriále sa naučíme, ako ovládať servomotor pomocou pohybov rúk. Pohybovaním ruky doľava alebo doprava môžete spôsobiť, že servomotor zareaguje zodpovedajúcim spôsobom. Tento projekt využíva senzor pohybu APDS-9960 na detekciu pohybov rúk a ich preklad do pozícií servomotora. Pre podrobnú vizuálnu ukážku sa uistite, že si pozriete video (vo videu o 00:30).

Hlavné komponenty, ktoré budeme používať, zahŕňajú servomotor a senzor gest APDS-9960. Servomotor sa otočí na konkrétne uhly na základe detekovaných gest, zatiaľ čo senzor APDS-9960 bude interpretovať pohyby rúk. Toto usporiadanie umožňuje intuitívny spôsob ovládania serva bez fyzického dotyku.
Vysvetlenie hardvéru
Servomotor je malý zariadenie, ktoré sa môže otáčať na konkrétne uhly, čo ho robí ideálnym pre aplikácie, ktoré vyžadujú presné polohovanie. Zvyčajne má tri vodiče: napájanie (červený), zem (čierny) a signál (oranžový). Signálny vodič prijíma príkazy na pohyb serva na určený uhol.
APDS-9960 je všestranný senzor, ktorý dokáže detekovať gestá, ambientné svetlo a farbu. Komunikuje s Arduinom cez I2C a vyžaduje niekoľko pinov na napájanie a prenos dát. Senzor dokáže detekovať pohyby ako hore, dole, vľavo a vpravo, ktoré použijeme na ovládanie serva.
Technické údaje
| Výrobca | Broadcom |
|---|---|
| Číslo dielu | APDS-9960 |
| Logika/IO napätie | 2.4 - 3.6 V |
| Napájacie napätie | 2.4 - 3.6 V |
| Výstupný prúd (na kanál) | 20 mA max |
| Pokyny pre PWM frekvenciu | Nedá sa použiť |
| Vstupné logické prahy | 0,3 V (nízke), 0,7 V (vysoké) |
| Pokles napätia / RDS(on)/ saturácia | Nedá sa použiť |
| Tepelné limity | -40 až 85 °C |
| Balík | 6,0 x 3,0 mm |
| Poznámky / varianty | Snímanie gest, snímanie RGB svetla |
- Uistite sa, že servo je napájané dostatočným napätím (typicky 5V).
- Pripojte APDS-9960 k Arduinu pomocou I2C komunikácie.
- Ven pozornosť na prerušenie pinu pre senzor gest.
- Použite pull-up rezistory, ak je to potrebné na stabilné detekovanie signálu.
- Uistite sa, že senzor kalibrujete v rôznych svetelných podmienkach pre lepšiu presnosť.

Na zapojenie komponentov začnite so servomotorom. Pripojte červený vodič k 5V pinu Arduina, čierny vodič k zemi (GND) a oranžový signálny vodič k pinu.9. To umožní Arduinu ovládať polohu serva.
Ďalej pripojte senzor gest APDS-9960. PripojteV_Npripojte k 3,3V na Arduine aGNDuzemniť. TenINTpin by mal byť pripojený k pin2na Arduine, zatiaľ čoSDAaSCLkolíky idú na kolíkyA4aA5, resp. Táto konfigurácia umožňuje senzoru efektívne komunikovať s Arduinom.
Príklady kódu a návod
V nastavovacej funkcii inicializujeme servo a senzor pohybu. Riadokmyservo.attach(9);pripája servomotor k pinu 9, ktorý sme predtým pripojili. To umožňuje servomotoru prijímať príkazy z Arduina.

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);
}Ďalej definujeme, ako systém spracováva gestá v slučkovej funkcii. MetódahandleGesture();kontroluje dostupné gestá a vykonáva zodpovedajúce akcie. Napríklad, ak je zistené gesto vľavo, servo sa posunie na 180 stupňov.
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;
}
}
}Nakoniec, slučka neustále kontroluje gestá a aktualizuje polohu serva na základe zisteného gesta. Uistite sa, že ste nastavenie otestovali v rôznych svetelných podmienkach, aby ste dosiahli presné rozpoznávanie gest.
Demonštrácia / Čo očakávať
Akonáhle je všetko zapojené a kód je nahraný, mali by ste byť schopní ovládať servo pohybom ruky doľava alebo doprava. Servo sa otočí na 180 stupňov pri gesto doľava a vráti sa na 0 stupňov pri gesto doprava. Ak sa gesta nezaznamenajú, skontrolujte umiestnenie senzora a okolité svetelné podmienky (vo videu o 05:30).
Kapitoly
- Úvod - 00:00
- Prehľad hardvéru - 01:30
- Inštrukcie na zapojenie - 03:00
- Vysvetlenie kódu - 04:30
- Demonstrácia - 06:00
This tutorial is part of: Servomotory
- 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
- Ovládanie servomotora Arduino pomocou potenciometra
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- Ako používať kontinuálny 360° servomotor s Arduinom
- 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");
}
}
}
Resources & references
No resources yet.
Files📁
No files available.