Tìm kiếm mã

Điều khiển vị trí servo bằng cử chỉ tay cho Arduino

Điều khiển vị trí servo bằng cử chỉ tay cho Arduino

Trong hướng dẫn này, chúng ta sẽ học cách điều khiển một động cơ servo bằng cách sử dụng cử chỉ tay. Bằng cách di chuyển tay sang trái hoặc phải, bạn có thể làm cho động cơ servo phản ứng tương ứng. Dự án này sử dụng cảm biến cử chỉ APDS-9960 để phát hiện chuyển động tay và chuyển đổi chúng thành vị trí của động cơ servo. Để có một giải thích hình ảnh chi tiết, hãy chắc chắn kiểm tra video tại (trong video tại 00:30).

APDS-9960 gesture sensor module -1

Các thành phần chính mà chúng tôi sẽ sử dụng bao gồm một động cơ servo và cảm biến cử chỉ APDS-9960. Động cơ servo sẽ quay đến các góc cụ thể dựa trên các cử chỉ được phát hiện, trong khi cảm biến APDS-9960 sẽ diễn giải các chuyển động của tay. Cấu hình này cho phép kiểm soát động cơ servo một cách trực quan mà không cần chạm vào.

Giải thích phần cứng

Động cơ servo là một thiết bị nhỏ có thể xoay đến các góc cụ thể, làm cho nó trở nên lý tưởng cho các ứng dụng yêu cầu định vị chính xác. Nó thường có ba dây: nguồn (đỏ), đất (đen) và tín hiệu (cam). Dây tín hiệu nhận lệnh để di chuyển động cơ servo đến một góc xác định.

APDS-9960 là một cảm biến đa năng có thể phát hiện cử chỉ, ánh sáng xung quanh và màu sắc. Nó giao tiếp với Arduino qua I2C và cần một vài chân để cung cấp nguồn và truyền dữ liệu. Cảm biến có thể phát hiện các chuyển động như lên, xuống, trái và phải, mà chúng ta sẽ sử dụng để điều khiển servo.

Chi tiết bảng dữ liệu

Nhà sản xuấtBroadcom
Số hiệu bộ phậnAPDS-9960
Điện áp Logic/IO2.4 - 3.6 V
Điện áp cung cấp2.4 - 3.6 V
Dòng điện đầu ra (mỗi kênh)20 mA tối đa
Hướng dẫn tần số PWMKhông áp dụng
Ngưỡng logic đầu vào0,3 V (thấp), 0,7 V (cao)
Sụt áp / RDS(on)/ bão hòaKhông áp dụng
Giới hạn nhiệt độ-40 đến 85 °C
Gói6,0 x 3,0 mm
Ghi chú / biến thểCảm biến cử chỉ, cảm biến ánh sáng RGB
  • Đảm bảo servo được cấp nguồn với điện áp đủ (thường là 5V).
  • Kết nối APDS-9960 với Arduino bằng cách sử dụng giao tiếp I2C.
  • Chú ý đến chân ngắt cho cảm biến cử chỉ.
  • Sử dụng điện trở kéo lên nếu cần thiết để phát hiện tín hiệu ổn định.
  • Hãy chắc chắn hiệu chỉnh cảm biến trong các điều kiện ánh sáng khác nhau để có độ chính xác tốt hơn.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Để kết nối các thành phần, bắt đầu với động cơ servo. Kết nối dây đỏ với chân 5V của Arduino, dây đen với đất (GND), và dây tín hiệu cam với chân.9Điều này sẽ cho phép Arduino điều khiển vị trí của servo.

Tiếp theo, kết nối cảm biến cử chỉ APDS-9960. Kết nối cáiV_Nghim vào 3.3V của Arduino, vàGNDđinh vào mặt đất. TheINTchân phải được kết nối với chân2trên Arduino, trong khiSDASCLchân ghim đi đến chân ghimA4A5, tương ứng. Cấu hình này cho phép cảm biến giao tiếp hiệu quả với Arduino.

Ví dụ mã & Hướng dẫn

Trong hàm thiết lập, chúng tôi khởi tạo servo và cảm biến cử chỉ. Dòngmyservo.attach(9);gắn servo vào chân 9, mà chúng ta đã kết nối trước đó. Điều này cho phép servo nhận lệnh từ Arduino.

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

Tiếp theo, chúng tôi định nghĩa cách hệ thống xử lý các cử chỉ trong hàm vòng lặp. Phương pháphandleGesture();kiểm tra các cử chỉ có sẵn và thực hiện các hành động tương ứng. Ví dụ, nếu cử chỉ được phát hiện là bên trái, servo sẽ di chuyển đến 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;
    }
  }
}

Cuối cùng, vòng lặp liên tục kiểm tra các cử chỉ và cập nhật vị trí servo dựa trên cử chỉ được phát hiện. Hãy đảm bảo kiểm tra thiết lập trong nhiều điều kiện ánh sáng khác nhau để có được nhận diện cử chỉ chính xác.

Buổi trình diễn / Những gì cần mong đợi

Khi mọi thứ đã được kết nối và mã đã được tải lên, bạn sẽ có thể điều khiển servo bằng cách di chuyển tay sang trái hoặc phải. Servo sẽ quay đến 180 độ cho cử chỉ bên trái và quay trở lại 0 độ cho cử chỉ bên phải. Nếu các cử chỉ không được phát hiện, hãy kiểm tra vị trí của cảm biến và điều kiện ánh sáng xung quanh (trong video tại 05:30).

Chương

  • Giới thiệu - 00:00
  • Tổng quan phần cứng - 01:30
  • Hướng dẫn đấu dây - 03:00
  • Giải thích mã - 04:30
  • Buổi biểu diễn - 06:00

Hình ảnh

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
Ngôn ngữ: 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");
    }
  }
}

Tài nguyên & tài liệu tham khảo

Chưa có tài nguyên nào.

Tập tin📁

Không có tệp nào khả dụng.