Search Code

Mengontrol Posisi Servo dengan Gerakan Tangan untuk Arduino

Mengontrol Posisi Servo dengan Gerakan Tangan untuk Arduino

Dalam tutorial ini, kita akan belajar bagaimana mengendalikan motor servo menggunakan gerakan tangan. Dengan menggerakkan tangan Anda ke kiri atau ke kanan, Anda dapat membuat motor servo merespons sesuai. Proyek ini memanfaatkan sensor gerak APDS-9960 untuk mendeteksi gerakan tangan dan menerjemahkannya menjadi posisi servo. Untuk penjelasan visual yang lebih rinci, pastikan untuk memeriksa video di (dalam video di 00:30).

APDS-9960 gesture sensor module -1

Komponen inti yang akan kami gunakan termasuk motor servo dan sensor gerak APDS-9960. Motor servo akan berputar ke sudut tertentu berdasarkan gerakan yang terdeteksi, sementara sensor APDS-9960 akan menginterpretasikan gerakan tangan. Pengaturan ini memungkinkan cara yang intuitif untuk mengontrol servo tanpa sentuhan fisik.

Penjelasan Perangkat Keras

Motor servo adalah perangkat kecil yang dapat berputar pada sudut tertentu, menjadikannya ideal untuk aplikasi yang memerlukan penempatan yang tepat. Biasanya, motor ini memiliki tiga kabel: daya (merah), tanah (hitam), dan sinyal (oranye). Kabel sinyal menerima perintah untuk menggerakkan servo ke sudut yang ditentukan.

APDS-9960 adalah sensor serbaguna yang dapat mendeteksi gerakan, cahaya sekitar, dan warna. Sensor ini berkomunikasi dengan Arduino melalui I2C dan memerlukan beberapa pin untuk daya dan transfer data. Sensor ini dapat mendeteksi gerakan seperti atas, bawah, kiri, dan kanan, yang akan kita gunakan untuk mengontrol servo.

Detail Lembar Data

ProdusenBroadcom
Nomor bagianAPDS-9960
Tegangan Logika/IO2,4 - 3,6 V
Tegangan suplai2,4 - 3,6 V
Arus keluaran (per saluran)20 mA maks
Panduan frekuensi PWMTidak berlaku
Ambang logika input0,3 V (rendah), 0,7 V (tinggi)
Penurunan tegangan / RDS(on)/ saturasiTidak berlaku
Batas termal-40 hingga 85 °C
Paket6,0 x 3,0 mm
Catatan / varianPendeteksian gerakan, pendeteksian cahaya RGB
  • Pastikan servo diberi daya dengan tegangan yang memadai (biasanya 5V).
  • Sambungkan APDS-9960 ke Arduino menggunakan komunikasi I2C.
  • Perhatikan pin interupsi untuk sensor gerakan.
  • Gunakan resistor pull-up jika perlu untuk deteksi sinyal yang stabil.
  • Pastikan untuk mengkalibrasi sensor dalam berbagai kondisi pencahayaan untuk akurasi yang lebih baik.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Untuk menghubungkan komponen, mulai dengan motor servo. Sambungkan kabel merah ke pin 5V Arduino, kabel hitam ke ground (GND), dan kabel sinyal oranye ke pin.9Ini akan memungkinkan Arduino untuk mengontrol posisi servo.

Selanjutnya, sambungkan sensor gerak APDS-9960. Hubungkan keV_Nsambungkan ke 3.3V Arduino, danGNDpin ke tanah. TheINTpin harus terhubung ke pin2pada Arduino, sementaraSDAdanSCLpin pergi ke pinA4danA5, masing-masing. Konfigurasi ini memungkinkan sensor untuk berkomunikasi secara efektif dengan Arduino.

Contoh Kode & Panduan

Dalam fungsi setup, kami menginisialisasi servo dan sensor gerak. Barismyservo.attach(9);mengikat servo ke pin 9, yang sebelumnya kita sambungkan. Ini memungkinkan servo untuk menerima perintah dari 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);
}

Selanjutnya, kami mendefinisikan bagaimana sistem menangani gerakan dalam fungsi loop. MetodehandleGesture();memeriksa gerakan yang tersedia dan mengeksekusi tindakan yang sesuai. Misalnya, jika gerakan yang terdeteksi adalah kiri, servo akan bergerak ke 180 derajat.

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

Akhirnya, loop terus-menerus memeriksa gerakan dan memperbarui posisi servo berdasarkan gerakan yang terdeteksi. Pastikan untuk menguji pengaturan dalam berbagai kondisi pencahayaan untuk mendapatkan pengenalan gerakan yang akurat.

Demonstrasi / Apa yang Diharapkan

Setelah semuanya terhubung dan kode diunggah, Anda seharusnya dapat mengendalikan servo dengan menggerakkan tangan Anda ke kiri atau ke kanan. Servo akan berputar hingga 180 derajat untuk gerakan kiri dan kembali ke 0 derajat untuk gerakan kanan. Jika gerakan tidak terdeteksi, periksa posisi sensor dan kondisi cahaya di sekitarnya (dalam video pada 05:30).

Bab-bab

  • Pengantar - 00:00
  • Ikhtisar Perangkat Keras - 01:30
  • Instruksi Pengkabelan - 03:00
  • Penjelasan Kode - 04:30
  • Demonstrasi - 06:00

Gambar

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
Bahasa: 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");
    }
  }
}

Sumber daya & referensi

Belum ada sumber daya.

Berkas📁

Tidak ada file tersedia.