코드 검색

아두이노를 위한 손 제스처로 서보 위치 제어하기

아두이노를 위한 손 제스처로 서보 위치 제어하기

이 튜토리얼에서는 손 제스처를 사용하여 서보 모터를 제어하는 방법을 배울 것입니다. 손을 왼쪽이나 오른쪽으로 움직이면 서보 모터가 그에 따라 반응합니다. 이 프로젝트는 APDS-9960 제스처 센서를 사용하여 손 움직임을 감지하고 이를 서보 위치로 변환합니다. 자세한 시각적 설명을 보려면 (비디오에서 00:30) 비디오를 확인하세요.

APDS-9960 gesture sensor module -1

우리가 사용할 핵심 구성 요소에는 서보 모터와 APDS-9960 제스처 센서가 포함됩니다. 서보 모터는 감지된 제스처에 따라 특정 각도로 회전하고, APDS-9960 센서는 손 움직임을 해석합니다. 이 설정은 물리적 접촉 없이 서보를 직관적으로 제어할 수 있는 방법을 제공합니다.

하드웨어 설명

서보 모터는 특정 각도로 회전할 수 있는 작은 장치로, 정밀한 위치 지정을 요구하는 응용 프로그램에 적합합니다. 일반적으로 전원(빨간색), 접지(검은색), 신호(주황색) 세 개의 와이어가 있습니다. 신호 와이어는 서보를 지정된 각도로 이동시키라는 명령을 받습니다.

APDS-9960은 제스처, 주변광 및 색상을 감지할 수 있는 다목적 센서입니다. 이 센서는 I2C를 통해 아두이노와 통신하며 전원 및 데이터 전송을 위해 몇 개의 핀이 필요합니다. 이 센서는 위, 아래, 왼쪽 및 오른쪽과 같은 움직임을 감지할 수 있으며, 이를 사용하여 서보를 제어할 것입니다.

데이터시트 세부정보

제조업체브로드컴
부품 번호APDS-9960
로직/입출력 전압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 mm
노트 / 변형제스처 감지, RGB 조명 감지
  • 서보에 적절한 전압(일반적으로 5V)이 공급되도록 하십시오.
  • APDS-9960을 I2C 통신을 사용하여 Arduino에 연결하세요.
  • 제스처 센서를 위한 인터럽트 핀에 주의하세요.
  • 필요한 경우 안정적인 신호 감지를 위해 풀업 저항기를 사용하십시오.
  • 더 나은 정확성을 위해 다양한 조명 조건에서 센서를 보정하는 것을 잊지 마세요.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

구성 요소를 연결하려면 서보 모터부터 시작하세요. 빨간색 전선을 아두이노의 5V 핀에 연결하고, 검은색 전선을 접지(GND)에 연결하며, 주황색 신호 전선을 핀에 연결하세요.9이것은 아두이노가 서보의 위치를 제어할 수 있게 해줄 것입니다.

다음으로 APDS-9960 제스처 센서를 연결합니다. 연결하세요.V_N아두이노의 3.3V에 핀을 연결하고GND지면에 핀을 고정하세요. 그INT핀은 핀에 연결되어야 합니다.2아두이노에서, 동안SDA그리고SCL핀은 핀으로 간다A4그리고A5각각. 이 구성은 센서가 아두이노와 효과적으로 통신할 수 있도록 합니다.

코드 예제 및 안내

설정 함수에서 우리는 서보와 제스처 센서를 초기화합니다. 그 줄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");
    }
  }
}

자원 및 참고자료

아직 자원이 없습니다.

파일📁

파일이 없습니다.