Điều khiển đóng, mở cổng bằng cử chỉ tay

Điều khiển đóng/mở cổng bằng cử chỉ tay

Cảm biến RGB APDS-9960 phát hiện cử chỉ tay để điều khiển các động cơ để đóng mở cổng.

Các linh kiện cần chuẩn bị

Chức năng các linh kiện chính

  • Board UnoX:

    • Đọc dữ liệu từ cảm biến RGB APDS-9960
    • Xuất dữ liệu điều khiển động cơ servo
  • Cảm biến RGB APDS-9960:

    • Phát hiện cử chỉ của tay
    • Gửi dữ liệu đến board UnoX
  • Động cơ RC Servo 9G SG90:

    • Xoay khi nhận được tín hiệu từ board UnoX
  • 2 viên pin sạc Sam Sung 18650 và jack pin 9V sang DC

    • Dùng để cấp nguồn cho board UnoX

Kết nối các linh kiện với UnoX

Bảng kết nối UnoX với cảm biến RGB APDS-9960

UnoXCảm biến RGB APDS-9960
Chân 3.3VVCC
Chân GNDGND
Chân SDAA4
Chân SCLA5
Chân IN2

Bảng đấu nối UnoX với Servo1

UnoXServo1
Chân 5VVCC (đỏ)
Chân GNDGND (nâu)
Chân 9SIGNAL (cam)

Bảng đấu nối UnoX với Servo2

UnoXServo2
Chân 5VVCC (đỏ)
Chân GNDGND (nâu)
Chân 8SIGNAL (cam)

Hướng dẫn làm mô hình và đế pin

Hướng dẫn làm mô hình:

Cắt theo kích thước các mô hình:

  • Làm 2 trụ cổng chính.
  • Phòng bảo vệ có gắn cảm biến.

Hướng dẫn làm đế pin:

  • Bước 1: Cắt bỏ phần nắp kết nối pin 9V của jack pin 9V
  • Bước 2: Đấu nối 2 dây VCC và GND của pin và jack với nhau

Mô tả nội dung source code

/****************************************************************
Chú ý: Chỉ nên cấp nguồn 3.3V cho cảm biến RGB APDS-9960!

 UnoX     RGB APDS-9960       Chức năng

 3.3V         VCC              Power
 GND          GND              Ground
 A4           SDA              I2C Data
 A5           SCL              I2C Clock
 2            INT              Interrupt

****************************************************************/
// Khai báo thư viện
#include <Wire.h>
#include <SparkFun_APDS9960.h>
#include <Servo.h>

Servo servo1;   // Tạo một đối tượng để điều khiển servo1
Servo servo2;   // Tạo một đối tượng để điều khiển servo1


#define APDS9960_INT     2    // Chọn chân số 2 là chân interrupt
#define servoPin1        9    // Chọn chân PWM số 9 điều khiển servo1
#define servoPin2        8    // Chọn chân PWM số 8 điều khiển servo2



// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;   // Đặt biến cờ ngắt

void setup() {

  pinMode(APDS9960_INT, INPUT);  // Thiết lập chân ngắt là chân input
  servo1.attach(servoPin1);      // Gán chân số 9 điều khiển servo1
  servo2.attach(servoPin2);      // Gán chân số 8 điều khiển servo2



  Serial.begin(9600);   // Khởi tạo port serial
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));

  // Khởi tạo dịch vụ ngắt
  attachInterrupt(0, interruptRoutine, FALLING);

  // Khởi tạo APDS-9960 (cấu hình I2C và khởi tạo các giá trị)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

  // Bắt đầu chạy cảm biến cử chỉ (gesture sensor)
  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() {
  // Khi phát hiện cử chỉ tay thì chạy các trường hợp trong hàm handleGesture()
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}
// Thực hiện hàm này khi có ngắt xảy ra
void interruptRoutine() {
  isr_flag = 1;
}
// Thiết lập các trường hợp của cử chỉ tay
void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        servo1.write(90);
        servo2.write(90);
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        servo1.write(0);
        servo2.write(0);
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        servo1.write(90);
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        servo2.write(90);
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Kết quả

Ứng dụng mở rộng

  • Lướt web trên máy tính bằng chử chỉ tay.
  • Đóng mở rèm cửa bằng cử tay.