- Gerekli Bileşenler
- APDS-9960 Dijital Yakınlık RGB ve Hareket Sensörüne Giriş
- Devre şeması
- Hareket ve Renk Algılama için Arduino Programlama
Günümüzde telefonların çoğu, herhangi bir uygulamayı açmak veya kapatmak, müzik başlatmak, aramalara katılmak vb. İçin hareket kontrolü özelliğine sahiptir. Bu, zamandan tasarruf etmek için çok kullanışlı bir özelliktir ve ayrıca herhangi bir cihazı hareketlerle kontrol etmek için harika görünüyor. Daha önce hareket kontrollü robot ve hareket kontrollü Air mouse oluşturmak için ivmeölçer kullandık. Ancak bugün, bir hareket sensörü olan APDS9960 ile Arduino arasında arayüz oluşturmayı öğreniyoruz. Bu sensör ayrıca, bu eğitimde de kullanılacak olan renkleri algılamak için bir RGB sensörüne sahiptir. Bu nedenle, renk algılama için özel bir sensör olmasına rağmen, renk ayırma makinesi oluşturmak için Arduino ile zaten kullandığımız TCS3200 renk sensörü mevcut olsa da, hareket ve renk algılama için ayrı sensörler kullanmanıza gerek yoktur.
Gerekli Bileşenler
- Arduino UNO
- APDS9960 RGB ve Hareket Sensörü
- 16x2 LCD
- DPDT Anahtarı
- 100K pot ve 10K direnç
- Jumper Kabloları
APDS-9960 Dijital Yakınlık RGB ve Hareket Sensörüne Giriş
APDS9960 çok işlevli bir sensördür. Işıktaki hareketleri, ortam ışığını ve RGB değerlerini algılayabilir. Bu sensör aynı zamanda bir yakınlık sensörü olarak da kullanılabilir ve çoğunlukla akıllı telefonlarda bir çağrıya katılırken dokunmatik ekranı devre dışı bırakmak için kullanılır.
Bu sensör dört fotodiyottan oluşur. Bu fotodiyotlar, yerleşik bir LED tarafından iletilen yansıyan IR enerjisini algılar. Bu nedenle, herhangi bir hareket yapıldığında, bu IR enerjisi engellenir ve sensöre geri yansır, şimdi sensör hareketle ilgili bilgileri (yön, hız) algılar ve bunu dijital bilgiye dönüştürür. Bu sensör, yansıyan kızılötesi ışığı algılayarak engelin mesafesini ölçmek için kullanılabilir. RGB renklerini algılamak için UV ve IR engelleme filtrelerine sahiptir ve her renk için 16 bit veri üretir.
APDS-9960 sensörünün pin çıkışı aşağıda gösterilmiştir. Bu sensör I 2 C iletişim protokolünde çalışır. 1µA akım tüketir ve 3.3V ile çalışır, bu yüzden dikkatli olun ve 5V pin ile bağlamayın. Buradaki INT pini, I 2 C iletişimini sürmek için kullanılan kesme pinidir. Ve VL pini, PS atlama teli bağlı değilse yerleşik LED için isteğe bağlı güç pimidir. PS atlama teli kapalıysa, yalnızca VCC pinine güç sağlamanız gerekir, bu hem modüle hem de IR LED'e güç sağlayacaktır.
Devre şeması
Arduino ile APDS960 için bağlantılar çok basittir. İki mod RGB Algılama ve Hareket Algılama arasında geçiş yapmak için bir DPDT düğmesi kullanacağız. Öncelikle APDS9960'ın I2C iletişim pinleri SDA ve SCL, sırasıyla Arduino pin A4 ve A5'e bağlanır. Daha önce belirtildiği gibi, sensör için çalışma voltajı 3.3v'dir, dolayısıyla APDS9960'ın VCC ve GND'si Arduino'nun 3.3V ve GND'sine bağlanır. APDS9960'ın kesme pini (INT) Arduino'nun D2 pinine bağlıdır.
İçin LCD, veri pimler (D4-D7), dijital pim Arduino D6-D3 ve RS ve EN pinlerine bağlanmıştır D6 ve Arduino arasında D7 bağlanır. LCD'nin V0'ı pota bağlanır ve LCD'nin parlaklığını kontrol etmek için 100K pot kullanılır. DPDT düğmeleri için sadece 3 pin kullandık. İkinci pin, giriş için Arduino'nun D7 pinine bağlanır ve diğer ikisi GND ve VCC'ye ve ardından 10K dirençle bağlanır.
Hareket ve Renk Algılama için Arduino Programlama
Programlama kısmı basit ve kolaydır ve bu eğitimin sonunda bir demo videosu ile eksiksiz program verilmiştir.
Öncelikle Sparkfun tarafından yapılmış bir kitaplık kurmamız gerekiyor. Bu kütüphaneyi kurmak için Sketch-> Include Library-> Manage Libraries'e gidin.
Şimdi arama çubuğuna “Sparkfun APDS9960” yazın ve kitaplığı gördüğünüzde kur düğmesine tıklayın.
Ve gitmeye hazırız. Başlayalım.
Öncelikle gerekli tüm başlık dosyalarını eklemeliyiz. LiquidCrystal.h ilk başlık dosyası LCD işlevleri için kullanılır. İkinci başlık dosyası Wire.h , I 2 C iletişimi için kullanılır ve sonuncusu SparkFun_APDS996.h , APDS9960 sensörü için kullanılır.
#Dahil etmek
Şimdi sonraki satırlarda düğme ve LCD için pimleri tanımladık.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Bir sonraki bölümde, dijital pin 2'ye bağlı olan kesme pini için bir makro ve butonun mevcut durumu için bir değişken buttonState ve kesme servis rutini için isr_flag tanımladık .
# tanımla APDS9960_INT 2 int buttonState; int isr_flag = 0;
Ardından SparkFun_APDS9960 için bir nesne oluşturulur, böylece hareket hareketlerine erişebilir ve RGB değerlerini alabiliriz.
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;
Olarak ayar işlevi, birinci hat girişi gibi düğmeye (yüksek / düşük) değeri ve ikinci ve üçüncü hat oluşturur kesme ve düğme pimini almak için. apds.init () , APDS9960 sensörünü ve lcd.begin (16,2) LCD'yi başlatır.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
Gelen döngü fonksiyonu ilk satırı içinde düğmeden değerleri ve depolar onu alır buttonState daha önce tanımlanmış değişken. Şimdi sonraki satırlarda butondan değerleri kontrol ediyoruz, eğer yüksekse ışık sensörünü etkinleştiriyoruz ve düşükse hareket sensörünü başlatıyoruz.
AttachInterrupt () , bu durumda sensörün kesmesidir dış kesme için kullanılan bir fonksiyondur. Bu fonksiyondaki ilk argüman kesme sayısıdır. Arduino UNO'da, INT.0 ve INT.1 ile gösterilen 2 ve 3 olmak üzere iki dijital kesme pini vardır. Ve onu pin 2'ye bağladık, böylece oraya 0 yazdık. İkinci bağımsız değişken, daha sonra tanımlanan interruptRoutine () işlevini çağırır. Son argüman DÜŞÜYOR, böylece pin yüksekten düşüğe gittiğinde kesintiyi tetikleyecek. Arduino Kesintileri hakkında buradan daha fazla bilgi edinin.
void döngü () { buttonState = digitalRead (buttonPin); eğer (buttonState == HIGH) { apds.enableLightSensor (true); }
Bir sonraki bölümde, düğme pimini kontrol ediyoruz. Yüksekse, RGB sensörü için işlemi başlatın. Ardından ışık sensörünün değerleri okuyup okumadığını kontrol edin. Değerleri okuyamıyorsa, bu durumda, " Işık değerleri okunurken hata " yazdırın . Ve o zaman değerleri okuyabiliyorsa, üç rengin değerlerini ve hangisinin en yüksek olduğunu karşılaştırın, o rengi LCD'ye yazdırın.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Işık değerlerini okuma hatası"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Kırmızı"); gecikme (1000); lcd.clear (); } ……. ………..
Sonraki satırlarda tekrar düğme pimini kontrol edin ve eğer düşükse, İşlem sensörünü kontrol edin. Daha sonra isr_flag'ı kontrol edin ve 1 ise detachInterrupt () işlevi çağrılır. Bu işlev, kesmeyi kapatmak için kullanılır. Sonraki satır, daha sonra tanımlanan işlev olan handleGesture () öğesini çağırır. Sonraki satırlarda isr_flag'ı sıfır olarak tanımlayın ve kesmeyi ekleyin.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, DÜŞÜYOR); } }
Sonraki, interruptRoutine () işlevidir. Bu işlev, isr_flag değişkeni 1'i çevirmek için kullanılır, böylece kesme hizmeti başlatılabilir.
void interruptRoutine (). { isr_flag = 1; }
HandleGesture () işlevi, bir sonraki bölümde tarif edilmiştir. Bu işlev ilk olarak hareket sensörünün kullanılabilirliğini kontrol eder. Mevcutsa, hareket değerlerini okur ve hangi hareket olduğunu kontrol eder (YUKARI, AŞAĞI, SAĞ, SOL, UZAK, YAKIN) ve ilgili değerleri LCD'ye yazdırır.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); gecikme (1000); lcd.clear (); kırmak; case DIR_DOWN: lcd.print ("DOWN"); gecikme (1000); lcd.clear (); kırmak; case DIR_LEFT: lcd.print ("LEFT"); gecikme (1000); lcd.clear (); kırmak; case DIR_RIGHT: lcd.print ("RIGHT"); gecikme (1000); lcd.clear (); kırmak; case DIR_NEAR: lcd.print ("NEAR"); gecikme (1000); lcd.clear (); kırmak; durum DIR_FAR: lcd.print ("UZAK"); gecikme (1000); lcd.clear (); kırmak; varsayılan: lcd.print ("NONE"); gecikme (1000); lcd.clear (); } } }
Son olarak, kodu Arduino ya yükleyin ve sensörün başlamasını bekleyin. Artık düğme KAPALI durumdayken, hareket modunda olduğu anlamına gelir. Ellerinizi sola, sağa, yukarı, aşağı yönde hareket ettirmeyi deneyin. İçin uzak jest 2-3 saniye sensörden 2-4 inç bir mesafede elini tutmak ve kaldırın. Ve yakın hareket için elinizi sensörden uzak tutun, ardından yaklaştırın ve kaldırın.
Şimdi renk algılama moduna geçirmek için düğmeyi AÇIK konuma getirin ve kırmızı, mavi ve yeşil nesneleri birer birer sensöre yaklaştırın. Nesnenin rengini basacaktır.