Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

28 Nisan 2021 Çarşamba

APDS9960 Yakınlık, Hareket ve Ortam Işığı Sensörü ve Arduino

 

APDS9960 Yakınlık, Hareket ve Ortam Işığı Sensörü ve Arduino


APDS9960, altı farklı hareketi algılayan, yakınlığı algılayan, ortam ışığını algılayan ve Kırmızı, Yeşil, Mavi veya Şeffaf Renklerin varlığı hakkında bilgi veren bir sensördür. Yerleşik bir UV, IR engelleme filtreleri, I2C uyumlu bir arayüz ve dört ayrı fotodiyottan oluşur. Ayrıca, bir nesneden yansıyan IR ışık dalgalarını algılayarak hareketleri algılar ve bir nesnenin mesafesi, hızı ve yönü hakkındaki bu bilgileri dijital bir değere dönüştürür. Aynı yansıyan IR ışınları, cihaz ile kullanıcı arasındaki mesafeyi ölçer. ALS özelliği kırmızı, yeşil ve mavi ışık içeriğini ölçer. Bu makale, APDS9960'ın çalışması, kullanımı ve uygulamaları hakkında ayrıntılı olarak açıklamaktadır.
APDS9960 Yakınlık, Hareket ve Ortam Işığı Sensörü

APDS9960 Pinout Diyagramı

Bu çok amaçlı APDS9960 sensör koparma kartı 6 pimden oluşur. Pim yapılandırma ayrıntıları bir sonraki bölümde verilmiştir.

APDS9960 Yakınlık, Hareket ve Ortam Işığı Sensörü Pin Çıkışı

Pin Açıklaması

Bu bölüm, APDS9960'ın her piminin ayrıntılarını ve çalışmasını içerir.

  • Pin1 ve pin7, I2C arayüzü . SDA, bir seri veri adres terminalidir ve Seri saat terminali, bu verilerin iletimi için saat darbesi sağlar.
  • Pin2, aktif bir düşük kesinti pinidir.
  • LDR, APDS9960 yakınlık LED'i için bir LED sürücü giriş pinidir. LED sürücüleri için bu pime sabit bir güç kaynağı bağlayın.
  • LEDK, LED'in katot pinidir. Led sürücünün dahili bir devresini kullanıyorsanız bu pimi LDR'ye bağlayın.
  • LEDA, LED'in anot pinidir.
  • Pin6 ve 8, güç kaynağı pinleridir. Pim 6'yı toprağa bağlayın. Pin 8'de 2,4V ila 3,6V aralığında voltaj beslemesi uygulayın.

APDS9960 breakout Özellikler


Hareket algılama, ortam ışığı ve RGB Renk Algılama ve yakınlık algılama özellikleri sağlayan çok işlevli bir sensördür. En önemlisi, UV ve IR engelleme filtreleri ile ortam ışığını ve kırmızı, yeşil, mavi renkleri algılar ve kazancı 1x ile 64x arasında ayarlanabilir.

Yakınlık algılama, kalibrasyon için ekstra bileşenlere ihtiyaç duymadığınız için kırpılmış IR yoğunluğu sağlar. Yakınlık algılama sistemi, ofset telafisi sağlayan ayar dirençleri, doğru ve iyileştirilmiş sonuçlar veren bir ortam ışığı reddi ve bir doygunluk gösterge biti içerir.

Hareket algılama devresi, 32 veri kümesi depolama FIFO, Kesintiye dayalı I2C iletişimi ve IR LED'e akım sağlayan programlanabilir bir sürücü içerir.
400kHz'e kadar veri hızları sağlayan hızlı mod 7-bit I2C uyumlu bir arayüze sahiptir.

  • LED için gereken maksimum voltaj kaynağı 4,5V'dur.
  • Gerilim besleme aralığı = 2,4 - 3,6V.
  • Sıcaklık aralığı = -40 ° C ila 85 ° C

APDS9960 nerede kullanılır?


APDS9960, tek bir modül aracılığıyla renk algılamayı, yakınlık ölçümünü ve hareket algılamayı destekleyen çok işlevli bir sensördür. Sol, sağ, yukarı, aşağı, uzak ve yakın olmak üzere altı adede kadar hareketi algılayabilir. Algılama aralığı yaklaşık 4 ila 8 inçtir.

Koyu cam arkasındaki işlemler için çok uygun hale getiren çok yüksek bir hassasiyete sahiptir. Çeşitli işlevleri gerçekleştirmek için bu sensörü Arduino, mikrodenetleyiciler vb. İle arayüzleyebilirsiniz. Bu sensörü, robotları ve diğer cihazları kontrol etmek için uzaktan kumandalarda kullanabilirsiniz.

APDS9960 ve Arduino

Donanım basit ve kullanımı kolaydır. Sensörün APDS9960 koparma kartı, yerleşik bir voltaj regülatörünün varlığı nedeniyle 3,3V ile çalışır.

APDS9960, farklı yönlere duyarlı dört fotodiyottan oluşur. Algılama aralığı içindeki bir nesne herhangi bir hareket gerçekleştirdiğinde, nesne LED tarafından iletilen IR sinyalini geri yansıtır. Fotodiyotlar bu sinyali algılar ve bir nesnenin hızı ve mesafesi ile ilgili bilgileri bu şekilde elde eder.

Bu bilgiyi kullanarak sensör, hareketin türünü algılar. Sensör, IR ve UV engelleme filtreleri ve bir veri dönüştürücü aracılığıyla açık kırmızı, mavi, yeşil ve net renkleri algılayan farklı kanallara sahiptir. Yapılandırılabilir kesinti, algılama işlevini kontrol eder ve kızılötesi ışığı serbest bırakması veya algılaması için sensörü tetikler.

Bu devre şeması, APDS9960'ın Arduino Nano ile Arabirimini gösterir.

APDS9960 Yakınlık, Hareket ve Ortam Işığı Sensörü Arduino ile Arayüz

APDS9960 sensörü ile Arduino için Program yazmak için, neyse ki, bu koparma kartının kütüphanesi mevcuttur. Öncelikle bu bağlantıya gidin ve Arduino kütüphanesini indirin:

Bundan sonra APDS9960'ın Arduin ile bağlantısını aşağıdaki tabloya göre yapın:

Arduino PimiAPDS-9960 KartıFonksiyon
3.3VVCCGüç
GNDGNDZemin
A4SDAI2C Verileri
A5SCLI2C Saati
2INTKesmek

Bu Arduino kitaplığı, ışık, renk, hareket algılama ve yakınlık sensörü çıkışını ölçmek için örnek kodlar sağlar.

Arduino Ortam Işık Kodu

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Pins
#define APDS9960_INT    2  // Needs to be an interrupt pin
#define LED_PIN         13 // LED for showing interrupt

// Constants
#define LIGHT_INT_HIGH  1000 // High light level for interrupt
#define LIGHT_INT_LOW   10   // Low light level for interrupt

// Global variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
uint16_t ambient_light = 0;
uint16_t red_light = 0;
uint16_t green_light = 0;
uint16_t blue_light = 0;
int isr_flag = 0;
uint16_t threshold = 0;

void setup() {
  
  // Set LED as output
  pinMode(LED_PIN, OUTPUT);
  pinMode(APDS9960_INT, INPUT);
  
  // Initialize Serial port
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("-------------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - Light Interrupts"));
  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!"));
  }
  
  // Set high and low interrupt thresholds
  if ( !apds.setLightIntLowThreshold(LIGHT_INT_LOW) ) {
    Serial.println(F("Error writing low threshold"));
  }
  if ( !apds.setLightIntHighThreshold(LIGHT_INT_HIGH) ) {
    Serial.println(F("Error writing high threshold"));
  }
  
  // Start running the APDS-9960 light sensor (no interrupts)
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("Light sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during light sensor init!"));
  }
  
  // Read high and low interrupt thresholds
  if ( !apds.getLightIntLowThreshold(threshold) ) {
    Serial.println(F("Error reading low threshold"));
  } else {
    Serial.print(F("Low Threshold: "));
    Serial.println(threshold);
  }
  if ( !apds.getLightIntHighThreshold(threshold) ) {
    Serial.println(F("Error reading high threshold"));
  } else {
    Serial.print(F("High Threshold: "));
    Serial.println(threshold);
  }
  
  // Enable interrupts
  if ( !apds.setAmbientLightIntEnable(1) ) {
    Serial.println(F("Error enabling interrupts"));
  }
  
  // Wait for initialization and calibration to finish
  delay(500);
}

void loop() {
  
  // If interrupt occurs, print out the light levels
  if ( isr_flag == 1 ) {
    
    // Read the light levels (ambient, red, green, blue) and print
    if (  !apds.readAmbientLight(ambient_light) ||
          !apds.readRedLight(red_light) ||
          !apds.readGreenLight(green_light) ||
          !apds.readBlueLight(blue_light) ) {
      Serial.println("Error reading light values");
    } else {
      Serial.print("Interrupt! Ambient: ");
      Serial.print(ambient_light);
      Serial.print(" R: ");
      Serial.print(red_light);
      Serial.print(" G: ");
      Serial.print(green_light);
      Serial.print(" B: ");
      Serial.println(blue_light);
    }
    
    // Turn on LED for a half a second
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    
    // Reset flag and clear APDS-9960 interrupt (IMPORTANT!)
    isr_flag = 0;
    if ( !apds.clearAmbientLightInt() ) {
      Serial.println("Error clearing interrupt");
    }
    
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

Arduino Renk Algılama Kodu

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
uint16_t ambient_light = 0;
uint16_t red_light = 0;
uint16_t green_light = 0;
uint16_t blue_light = 0;

void setup() {
  
  // Initialize Serial port
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - ColorSensor"));
  Serial.println(F("--------------------------------"));
  
  // 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 light sensor (no interrupts)
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("Light sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during light sensor init!"));
  }
  
  // Wait for initialization and calibration to finish
  delay(500);
}

void loop() {
  
  // Read the light levels (ambient, red, green, blue)
  if (  !apds.readAmbientLight(ambient_light) ||
        !apds.readRedLight(red_light) ||
        !apds.readGreenLight(green_light) ||
        !apds.readBlueLight(blue_light) ) {
    Serial.println("Error reading light values");
  } else {
    Serial.print("Ambient: ");
    Serial.print(ambient_light);
    Serial.print(" Red: ");
    Serial.print(red_light);
    Serial.print(" Green: ");
    Serial.print(green_light);
    Serial.print(" Blue: ");
    Serial.println(blue_light);
  }
  
  // Wait 1 second before next reading
  delay(1000);
}

APDS9960 Hareket Algılama Krokisi

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// 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() {

  // 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");
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Yakınlık Kesintisi Çizimi

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Pins
#define APDS9960_INT    2  // Needs to be an interrupt pin
#define LED_PIN         13 // LED for showing interrupt

// Constants
#define PROX_INT_HIGH   50 // Proximity level for interrupt
#define PROX_INT_LOW    0  // No far interrupt

// Global variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
uint8_t proximity_data = 0;
int isr_flag = 0;

void setup() {
  
  // Set LED as output
  pinMode(LED_PIN, OUTPUT);
  pinMode(APDS9960_INT, INPUT);
  
  // Initialize Serial port
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("---------------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - ProximityInterrupt"));
  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!"));
  }
  
  // Adjust the Proximity sensor gain
  if ( !apds.setProximityGain(PGAIN_2X) ) {
    Serial.println(F("Something went wrong trying to set PGAIN"));
  }
  
  // Set proximity interrupt thresholds
  if ( !apds.setProximityIntLowThreshold(PROX_INT_LOW) ) {
    Serial.println(F("Error writing low threshold"));
  }
  if ( !apds.setProximityIntHighThreshold(PROX_INT_HIGH) ) {
    Serial.println(F("Error writing high threshold"));
  }
  
  // Start running the APDS-9960 proximity sensor (interrupts)
  if ( apds.enableProximitySensor(true) ) {
    Serial.println(F("Proximity sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during sensor init!"));
  }
}

void loop() {
  
  // If interrupt occurs, print out the proximity level
  if ( isr_flag == 1 ) {
  
    // Read proximity level and print it out
    if ( !apds.readProximity(proximity_data) ) {
      Serial.println("Error reading proximity value");
    } else {
      Serial.print("Proximity detected! Level: ");
      Serial.println(proximity_data);
    }
    
    // Turn on LED for a half a second
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    
    // Reset flag and clear APDS-9960 interrupt (IMPORTANT!)
    isr_flag = 0;
    if ( !apds.clearProximityInt() ) {
      Serial.println("Error clearing interrupt");
    }
    
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

APDS9960 Uygulamaları

  • Akıllı telefonlar, TV, Cep telefonlarının Dokunmatik Ekranları vb.
  • Renk sıcaklığının ölçülmesi
  • Cihazlarda, LCD ekranlarda ve RGB monitörlerde arka ışık ayarı
  • Robotik
  • Tıbbi malzeme

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.

Hiç yorum yok:

Yorum Gönder

Yorum yazdığınız ve üye olduğunuz için Size teşekkür ederim.Burada olduğunuza göre hepimizin ilgi alanı Elektronik ve Programlama sonsuz bir dünyadayız.Hepimize Başarılar...

Not: Yalnızca bu blogun üyesi yorum gönderebilir.