Tìm kiếm mã

Bài 100: Điều khiển động cơ Servo bằng cử chỉ tay của bạn

Bài 100: Điều khiển động cơ Servo bằng cử chỉ tay của bạn

Hãy tưởng tượng việc điều khiển một động cơ servo chỉ bằng một cái vẫy tay. Dự án này sử dụng cảm biến cử chỉ APDS-9960 để phát hiện chuyển động của bàn tay (trái, phải, lên, xuống, gần và xa) và chuyển chúng thành các vị trí servo. Đây là một cách thú vị và trực quan để thêm điều khiển dựa trên cử chỉ vào các dự án Arduino của bạn. Bạn có thể sử dụng nó để tạo một gimbal camera rảnh tay, một cánh tay robot điều khiển bằng cử chỉ, một núm âm lượng không chạm cho máy nghe nhạc, hoặc một tác phẩm nghệ thuật tương tác phản ứng với chuyển động. Cảm biến phát hiện hướng bàn tay của bạn và servo làm theo, trong khi màn hình nối tiếp hiển thị cử chỉ được phát hiện theo thời gian thực.

APDS-9960 gesture sensor -3
Cảm biến cử chỉ APDS-9960 -3

Linh kiện phần cứng

  • Arduino Uno (hoặc bất kỳ bo mạch tương thích nào)
  • Cảm biến RGB và cử chỉ APDS-9960
  • Động cơ Servo (ví dụ: SG90 hoặc tương tự)
  • Dây jumper

Cảm biến APDS-9960 là một linh kiện đa năng có thể phát hiện cử chỉ, khoảng cách và ánh sáng xung quanh. Bo mạch cụ thể bạn có thể khác nhau về hình dạng hoặc màu sắc, nhưng cảm biến và chức năng chân bên dưới vẫn giống nhau. Đối với dự án này, chúng ta sẽ tập trung vào khả năng cảm biến cử chỉ và sử dụng các chân I2C (SDA và SCL) cùng với chân ngắt để giao tiếp với Arduino. Cảm biến phải được cấp nguồn 3.3V, vì nó không chịu được 5V. Động cơ servo là một servo analog tiêu chuẩn mà chúng ta sẽ điều khiển bằng một chân hỗ trợ PWM.

Hướng dẫn đấu dây

Sơ đồ đấu dây Arduino của APDS9960 để điều khiển động cơ Servo bằng cử chỉ tay

Đây là sơ đồ đấu dây để kết nối cảm biến APDS-9960 và động cơ servo với Arduino Uno. (trong video ở phút 01:45)

Kết nối cảm biến cử chỉ APDS-9960

  • VCC → Arduino 3.3V (cảm biến không chịu được 5V)
  • GND → Arduino GND
  • SDA → Arduino A4 (dữ liệu I2C)
  • SCL → Arduino A5 (xung nhịp I2C)
  • INT → Arduino Chân 2 (phải là chân hỗ trợ ngắt)

Kết nối động cơ Servo

  • Tín hiệu (dây màu cam hoặc trắng) → Arduino Chân 9 (chân hỗ trợ PWM)
  • Nguồn (dây giữa, thường màu đỏ) → Arduino 5V
  • Mass (dây nâu hoặc đen) → Arduino GND

Điều quan trọng là kết nối chân ngắt của cảm biến với một trong các chân ngắt của Arduino (chân 2 hoặc 3 trên Uno). Điều này cho phép cảm biến báo hiệu cho vi điều khiển ngay lập tức khi phát hiện cử chỉ, thay vì liên tục hỏi vòng cảm biến. Đối với servo, hãy đảm bảo bạn sử dụng một chân hỗ trợ PWM (được đánh dấu bằng ký hiệu dấu ngã "~" trên bo mạch). Kết nối servo với một chân không phải PWM, như chân 4, sẽ khiến nó không hoạt động đúng. (trong video ở phút 02:14)

Giải thích mã code

Trước khi tải mã lên, bạn cần cài đặt thư viện SparkFun APDS-9960. Trong Arduino IDE, đi tới Sketch → Include Library → Manage Libraries, tìm kiếm "APDS9960," và cài đặt thư viện của SparkFun. (trong video ở phút 02:38)

Mã code cho dự án này khá đơn giản. Các phần chính mà người dùng có thể tùy chỉnh là các biến ở đầu sketch. Bạn có thể điều chỉnh chúng để thay đổi hành vi của servo mà không cần đụng đến phần còn lại của mã.

int servoPin  = 9;          // Chân cho tín hiệu servo
int downAngle = 135;        // Góc servo cho cử chỉ XUỐNG
int upAngle = 45;           // Góc servo cho cử chỉ LÊN
int rightAngle = 0;         // Góc servo cho cử chỉ PHẢI
int leftAngle = 180;        // Góc servo cho cử chỉ TRÁI
int angleStep = 2;          // Kích thước bước cho việc quét servo
int angle = 90;             // Góc ban đầu của servo

Các biến này xác định vị trí mục tiêu của servo cho từng cử chỉ. Ví dụ, leftAngle được đặt ở 180 độ, vì vậy khi bạn vẫy tay sang trái, servo sẽ xoay đến 180 độ. Bạn có thể thay đổi các giá trị này để phù hợp với cơ cấu cơ khí của mình. Biến angleStep kiểm soát tốc độ và độ mượt của quá trình quét servo khi phát hiện cử chỉ GẦN; giá trị nhỏ hơn dẫn đến chuyển động chậm hơn, mượt hơn.

APDS-9960 gesture sensor -3

Hàm nearAction() là một quy trình tùy chỉnh quét servo từ góc tối thiểu đến góc tối đa rồi quay lại. Điều này được kích hoạt khi bạn đưa tay lại gần cảm biến. Hàm farAction() là một chỗ trống nơi bạn có thể thêm mã của riêng mình để xác định điều gì xảy ra khi phát hiện cử chỉ XA.

Trình diễn dự án trực tiếp

Sau khi mã được tải lên, cảm biến đã sẵn sàng. Trong phần trình diễn, khi một bàn tay vuốt sang trái, servo di chuyển sang trái (180 độ); khi vuốt sang phải, nó di chuyển sang phải (0 độ). Màn hình nối tiếp hiển thị cử chỉ được phát hiện. Đối với cử chỉ LÊN và XUỐNG, servo di chuyển đến các góc bạn đã xác định. Cử chỉ GẦN kích hoạt chuyển động quét từ 0 đến 180 độ và quay lại, trong khi cử chỉ XA được phát hiện khi bạn đưa tay ra xa. Hệ thống phản hồi đáng tin cậy với tất cả các cử chỉ, khiến nó trở thành điểm khởi đầu tuyệt vời cho các dự án điều khiển bằng cử chỉ phức tạp hơn. (trong video tại 03:26)

Chương Video

  • [00:00] Giới thiệu và trình diễn dự án
  • [00:47] Tổng quan phần cứng: cảm biến APDS-9960 và servo
  • [01:45] Hướng dẫn đấu dây cho cảm biến và servo
  • [02:38] Cài đặt thư viện SparkFun APDS-9960
  • [03:26] Trình diễn trực tiếp và đầu ra màn hình nối tiếp
  • [04:27] Kết luận và hỗ trợ

Hình ảnh

SG90 Mini Servo Motor
SG90 Mini Servo Motor
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
SG90 servo
SG90 servo
414-Lesson 100: Control a Servo Motor with Your Hand Gestures
Ngôn ngữ: C++
/*
 * Arduino Step by Step Course by Robojax 
 * Lesson 100: Control Servo Motor with your hand gesture 
 * Using hand gesture RIGHT, LEFT, UP, DOWN, FAR, NEAR we control the motor in any way we want
 * video details: https://youtu.be/BUSqppjNw-Y
 * Code written based on sample from this code https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
 * on February 13, 2022 by Ahmad Shamshiri.
 * 
 * This code is part of Arduino Step by Step Course which starts here:  https://youtu.be/-6qSrDUA5a8
 * 
 * for library of this code visit http://robojax.com/
 * 
If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal by credit card https://bit.ly/donate-robojax
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor

Tests the gesture sensing abilities of the APDS-9960. Configures
APDS-9960 over I2C and waits for gesture events. Calculates the
direction of the swipe (up, down, left, right) and displays it
on a serial console. 

To perform a NEAR gesture, hold your hand
far above the sensor and move it close to the sensor (within 2
inches). Hold your hand there for at least 1 second and move it
away.

To perform a FAR gesture, hold your hand within 2 inches of the
sensor for at least 1 second and then move it above (out of
range) of the sensor.

Hardware Connections:

IMPORTANT: The APDS-9960 can only accept 3.3V!
 
 Arduino Pin  APDS-9960 Board  Function
 
 3.3V         VCC              Power
 GND          GND              Ground
 A4           SDA              I2C Data
 A5           SCL              I2C Clock
 2            INT              Interrupt

Resources:
Include Wire.h and SparkFun_APDS-9960.h

This code is beerware; if you see me (or any other SparkFun 
employee) at the local, and you've found our code helpful, please
buy us a round!

Distributed as-is; no warranty is given.
****************************************************************/

#include <Wire.h>
#include <Servo.h>
#include <SparkFun_APDS9960.h>
//see details in this video: https://youtu.be/BUSqppjNw-Y
int servoPin  =9;
int downAngle =135;
int upAngle = 45;
int rightAngle = 0;
int leftAngle = 180;

int angleStep =2;
int angle =90; //initial Angle

const int minAngle = 0;
const int maxAngle = 180;
Servo myservo;  // create servo object to control a servo

// 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(servoPin);  // 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");
        myservo.write(upAngle); 
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        myservo.write(downAngle);  
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        myservo.write(leftAngle);  
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(rightAngle);  
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        nearAction();
        break;
      case DIR_FAR:
        Serial.println("FAR");
        farAction();
        break;
      default:
        Serial.println("NONE");
    }
  }
}

void nearAction()
{

  for (angle = minAngle; angle <= maxAngle; angle += angleStep) { 
    // in steps of angleStep degree
    myservo.write(angle); 
    delay(15);                   
  }
  for (angle = maxAngle; angle >= minAngle; angle -= angleStep) { 
    myservo.write(angle);              
    delay(15);                      
  }  
}//nearAction() ends


 void farAction()
{

 //do something here
}//farAction() ends

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

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

Tập tin📁

Các tập tin khác