ค้นหาโค้ด

ควบคุมตำแหน่งเซอร์โวด้วยท่าทางมือสำหรับ Arduino

ควบคุมตำแหน่งเซอร์โวด้วยท่าทางมือสำหรับ Arduino

ในบทแนะนำนี้ เราจะเรียนรู้วิธีควบคุมมอเตอร์เซอร์โวด้วยการเคลื่อนไหวของมือ โดยการขยับมือไปทางซ้ายหรือขวา คุณสามารถทำให้มอเตอร์เซอร์โวตอบสนองตามนั้น โครงการนี้ใช้เซ็นเซอร์ตรวจจับการเคลื่อนไหว APDS-9960 เพื่อตรวจจับการเคลื่อนไหวของมือและแปลเป็นตำแหน่งของเซอร์โว สำหรับคำอธิบายภาพที่ละเอียด โปรดตรวจสอบวิดีโอที่ (ในวิดีโอที่ 00:30)

APDS-9960 gesture sensor module -1

ส่วนประกอบหลักที่เราจะใช้รวมถึงมอเตอร์เซอร์โวและเซ็นเซอร์ตรวจจับท่าทาง APDS-9960 มอเตอร์เซอร์โวจะหมุนไปยังมุมที่กำหนดตามท่าทางที่ตรวจจับได้ ในขณะที่เซ็นเซอร์ APDS-9960 จะตีความการเคลื่อนไหวของมือ การตั้งค่านี้ช่วยให้สามารถควบคุมมอเตอร์เซอร์โวได้อย่างมีสติปัญญาโดยไม่ต้องสัมผัสทางกายภาพ

อธิบายฮาร์ดแวร์

เซอร์โวมอเตอร์เป็นอุปกรณ์ขนาดเล็กที่สามารถหมุนไปยังมุมที่เฉพาะเจาะจง ทำให้เหมาะสำหรับการใช้งานที่ต้องการการวางตำแหน่งที่แม่นยำ โดยทั่วไปจะมีสายสามเส้น: สายไฟ (แดง), สายกราวด์ (ดำ) และสายสัญญาณ (ส้ม) สายสัญญาณจะรับคำสั่งเพื่อเคลื่อนที่เซอร์โวไปยังมุมที่กำหนด

APDS-9960 เป็นเซ็นเซอร์ที่หลากหลายซึ่งสามารถตรวจจับท่าทาง แสงรอบข้าง และสี มันสื่อสารกับ Arduino ผ่าน I2C และต้องการพินบางตัวสำหรับพลังงานและการถ่ายโอนข้อมูล เซ็นเซอร์สามารถตรวจจับการเคลื่อนไหวเช่นขึ้น ลง ซ้าย และขวา ซึ่งเราจะใช้เพื่อควบคุมเซอร์โว

รายละเอียดแผ่นข้อมูล

ผู้ผลิตบรอดคอม
หมายเลขชิ้นส่วนAPDS-9960
แรงดันไฟฟ้า Logic/IO2.4 - 3.6 โวลต์
แรงดันไฟฟ้าจ่าย2.4 - 3.6 โวลต์
กระแสไฟฟ้าเอาต์พุต (ต่อช่อง)20 mA สูงสุด
คำแนะนำความถี่ PWMไม่สามารถใช้ได้
เกณฑ์ตรรกะนำเข้า0.3 โวลต์ (ต่ำ), 0.7 โวลต์ (สูง)
แรงดันไฟฟ้าตก / 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สิ่งนี้จะช่วยให้ Arduino สามารถควบคุมตำแหน่งของเซอร์โวได้

ถัดไป ให้ต่อเซ็นเซอร์ตรวจจับท่าทาง APDS-9960V_Nเชื่อมต่อกับ 3.3V ของ Arduino และGNDปักลงดิน. ตัวINTพินควรเชื่อมต่อกับพิน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");
    }
  }
}

แหล่งข้อมูลและเอกสารอ้างอิง

ยังไม่มีทรัพยากรเลย

ไฟล์📁

ไม่มีไฟล์ที่พร้อมใช้งาน