Пребарување код

Контролирање на позицијата на серво со рачни гестови за Arduino

Контролирање на позицијата на серво со рачни гестови за Arduino

Во оваа туторијал, ќе научиме како да контролираме серво мотор со помош на рачни гестови. Со поместување на раката лево или десно, можете да направите серво моторот да реагира соодветно. Овој проект користи сензор за гестови APDS-9960 за да открие движења на раката и да ги преведе во позиции на серво. За детално визуелно објаснување, бидете сигурни да го проверите видеото на (во видеото на 00:30).

APDS-9960 gesture sensor module -1

Основните компоненти што ќе ги користиме вклучуваат серво мотор и сензор за жестови APDS-9960. Серво моторот ќе се ротира на специфични агли врз основа на детектираните жестови, додека сензорот APDS-9960 ќе ги интерпретира движењата на раката. Оваа конфигурација овозможува интуитивен начин за контрола на серво моторот без физички допир.

Објаснување на хардверот

Сервомоторот е мал уред кој може да се ротира на специфични агли, што го прави идеален за апликации кои бараат прецизно позиционирање. Обично има три жици: напојување (црвена), земја (црна) и сигнал (портокалова). Жицата за сигнал прима команди за поместување на сервомоторот на одреден агол.

APDS-9960 е разновиден сензор кој може да открива жестови, амбиентално светло и боја. Тој комуницира со Arduino преку I2C и бара неколку пинови за напојување и пренос на податоци. Сензорот може да открива движења како нагоре, надолу, лево и десно, кои ќе ги користиме за контрола на сервото.

Технички лист детали

ПроизводителБродком
Број на деловиAPDS-9960
Логика/IO напон2.4 - 3.6 V
Напон на напојување2.4 - 3.6 V
Излезна струја (по канал)20 mA макс
Упатство за PWM фреквенцијаНе е применливо.
Влезни логички прагови0.3 V (ниско), 0.7 V (високо)
Напонска разлика / RDS(on)/ заситеностНе е применливо.
Термални ограничувања-40 до 85 °C
Пакет6.0 x 3.0 мм
Забелешки / варијантиСензор за гестови, сензор за RGB светлина
  • Осигурајте дека сервото е напојувано со соодветно напон (обично 5V).
  • Поврзете го APDS-9960 со Arduino користејќи I2C комуникација.
  • Внимавајте на прекинската пин за сензорот за гестови.
  • Користете отпорници за повлекување ако е потребно за стабилно откривање на сигналот.
  • Обезбедете да го калибрирате сензорот во различни услови на осветлување за подобра точност.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

За да ги поврзете компонентите, започнете со серво моторот. Поврзете ја црвената жица на 5V пинот на Arduino, црната жица на земјата (GND), а портокаловата сигнална жица на пинот.9. Ова ќе му овозможи на Ардуиното да ја контролира позицијата на серво.

Следно, поврзете го сензорот за жестови APDS-9960. Поврзете гоV_Nпин до Arduino-овите 3.3V, и GNDпин до земја. ТheINTпинот треба да биде поврзан со пинот2на Arduino, додека SDAиSCLпиновите одат на пиновитеA4иA5, соодветно. Оваа конфигурација му овозможува на сензорот да комуницира ефективно со Arduino.

Примери на код и водичка

Во функцијата за поставување, го иницираме серво и сензорот за гестови. Линијатаmyservo.attach(9);го поврзува серво на пин 9, кој претходно го поврзавме. Ова му овозможува на серво да прима команди од Ардуино.

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

Следно, го дефинираме како системот управува со гестовите во функцијата за циклус. МетодотhandleGesture();проверува достапни гестови и извршува соодветни акции. На пример, ако откриениот гест е лево, серво моторот ќе се помести на 180 степени.

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

На крајот, петљата постојано проверува за гестови и ја ажурира позицијата на сервото врз основа на детектираниот гест. Осигурајте се да го тестирате поставувањето во различни услови на осветлување за да добиете точна препознавање на гестовите.

Демонстрација / Што да очекувате

Откако сè е поврзано и кодот е пренесен, треба да можеш да го контролираш сервото со поместување на раката лево или десно. Сервото ќе се ротира до 180 степени за лева гест и ќе се врати на 0 степени за десна гест. Ако гестовите не се детектираат, провери ја позицијата на сензорот и околинските светлосни услови (во видеото на 05:30).

Поглавја

  • Вовед - 00:00
  • Преглед на хардверот - 01:30
  • Инструкции за поврзување - 03:00
  • Објаснување на кодот - 04:30
  • Демонстрација - 06:00

Слики

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
Јазик: 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");
    }
  }
}

Ресурси и референци

Сè уште нема ресурси.

Датотеки📁

Нема достапни датотеки.