Search Code

Arduino ile El Hareketleriyle Servo Pozisyonunu Kontrol Etme

Arduino ile El Hareketleriyle Servo Pozisyonunu Kontrol Etme

Bu eğitimde, bir servo motoru el hareketleriyle nasıl kontrol edeceğimizi öğreneceğiz. Elinizi sola veya sağa hareket ettirerek, servo motorun buna göre yanıt vermesini sağlayabilirsiniz. Bu proje, el hareketlerini algılamak ve bunları servo pozisyonlarına dönüştürmek için APDS-9960 hareket sensörünü kullanmaktadır. Ayrıntılı bir görsel açıklama için, videoyu (videoda 00:30'da) kontrol etmeyi unutmayın.

APDS-9960 gesture sensor module -1

Kullanacağımız temel bileşenler arasında bir servo motor ve APDS-9960 jest sensörü bulunmaktadır. Servo motor, algılanan jestlere göre belirli açılara dönecek, APDS-9960 sensörü ise el hareketlerini yorumlayacaktır. Bu düzenek, fiziksel temas olmadan servoyu kontrol etmenin sezgisel bir yolunu sağlar.

Donanım Açıklandı

Servo motor, belirli açılara dönebilme yeteneğine sahip küçük bir cihazdır ve bu nedenle hassas konumlandırma gerektiren uygulamalar için idealdir. Genellikle üç kablosu vardır: güç (kırmızı), toprak (siyah) ve sinyal (turuncu). Sinyal kablosu, servoyu belirli bir açıya hareket ettirmek için komutlar alır.

APDS-9960, jesters, ortam ışığı ve renkleri algılayabilen çok yönlü bir sensördür. Arduino ile I2C üzerinden iletişim kurar ve güç ile veri transferi için birkaç pine ihtiyaç duyar. Sensör, yukarı, aşağı, sola ve sağa gibi hareketleri algılayabilir; bunları servoyu kontrol etmek için kullanacağız.

Veri Sayfası Detayları

ÜreticiBroadcom
Parça numarasıAPDS-9960
Mantık/Giriş-Çıkış voltajı2.4 - 3.6 V
Besleme voltajı2.4 - 3.6 V
Çıkış akımı (kanal başına)20 mA maksimum
PWM frekansı rehberiGeçerli değil
Giriş mantığı eşikleri0.3 V (düşük), 0.7 V (yüksek)
Gerilim düşüşü / RDS(on)doygunlukGeçerli değil
Termal sınırlar-40 ile 85 °C
Paket6.0 x 3.0 mm
Notlar / varyantlarHareket algılama, RGB ışık algılama
  • Servo'nun yeterli voltajla (genellikle 5V) beslenmesini sağlayın.
  • APDS-9960'ı Arduino'ya I2C iletişimi kullanarak bağlayın.
  • Hareket sensörü için kesme pinine dikkat edin.
  • Gerekirse stabil sinyal algılama için pull-up dirençleri kullanın.
  • Farklı aydınlatma koşullarında sensörü kalibre ettiğinizden emin olun, böylece daha iyi bir doğruluk elde edersiniz.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Bileşenleri bağlamak için, servo motorla başlayın. Kırmızı kabloyu Arduino'nun 5V pinine, siyah kabloyu toprak (GND) pinine ve turuncu sinyal kablosunu pin'e bağlayın.9Bu, Arduino'nun servonun konumunu kontrol etmesine olanak tanıyacaktır.

Sonraki adım, APDS-9960 hareket sensörünü bağlamaktır. BağlayınV_NArduino'nun 3.3V pinine veGNDtoprağa sabitle. BuINTpin, pin'e bağlanmalıdır.2Arduino'da, ikenSDAveSCLpinler pinlere giderA4veA5sırasıyla. Bu yapılandırma, sensörün Arduino ile etkili bir şekilde iletişim kurmasını sağlar.

Kod Örnekleri ve Geçiş Rehberi

Kurulum fonksiyonunda, servoyu ve hareket sensörünü başlatıyoruz. Satırmyservo.attach(9);servo'yu daha önce bağladığımız 9 numaralı pine bağlar. Bu, servonun Arduino'dan komut almasını sağlar.

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

Sonraki adımda, sistemin döngü fonksiyonunda jestleri nasıl işlediğini tanımlıyoruz. YöntemhandleGesture();mevcut jestleri kontrol eder ve karşılık gelen eylemleri gerçekleştirir. Örneğin, tespit edilen jest soldaysa, servo 180 dereceye hareket edecektir.

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

Son olarak, döngü sürekli olarak jestleri kontrol eder ve tespit edilen jestlere göre servo pozisyonunu günceller. Doğru jest tanıma elde etmek için kurulumu farklı aydınlatma koşullarında test etmeyi unutmayın.

Gösterim / Ne Beklemeli

Her şey bağlandığında ve kod yüklendiğinde, elinizi sola veya sağa hareket ettirerek servoyu kontrol edebilmelisiniz. Servo, sol hareket için 180 derece dönecek ve sağ hareket için 0 dereceye dönecektir. Hareketler algılanmazsa, sensörün konumunu ve çevresindeki ışık koşullarını kontrol edin (videoda 05:30'da).

Bölümler

  • Giriş - 00:00
  • Donanım Genel Görünümü - 01:30
  • Bağlantı Talimatları - 03:00
  • Kod Açıklaması - 04:30
  • Gösterim - 06:00

Görseller

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

Kaynaklar ve referanslar

Henüz kaynak yok.

Dosyalar📁

Dosya mevcut değil.