İçindekiler:

Engellemeyen APDS9960 Hareket Sensörü Uygulaması: 5 Adım
Engellemeyen APDS9960 Hareket Sensörü Uygulaması: 5 Adım

Video: Engellemeyen APDS9960 Hareket Sensörü Uygulaması: 5 Adım

Video: Engellemeyen APDS9960 Hareket Sensörü Uygulaması: 5 Adım
Video: APDS-9930 Sensor Demo using Wave Hands to Turn the Devices On/Off 2024, Kasım
Anonim
Engellemeyen APDS9960 Hareket Sensörü Uygulaması
Engellemeyen APDS9960 Hareket Sensörü Uygulaması
Engellemeyen APDS9960 Hareket Sensörü Uygulaması
Engellemeyen APDS9960 Hareket Sensörü Uygulaması
Engellemeyen APDS9960 Hareket Sensörü Uygulaması
Engellemeyen APDS9960 Hareket Sensörü Uygulaması

önsöz

Bu Eğitilebilirlik, SparkFun_APDS-9960_Sensor_Arduino_Library kullanılarak APDS9960 Hareket Sensörünün engelleyici olmayan bir uygulamasının nasıl oluşturulacağını ayrıntılarıyla anlatır.

Tanıtım

Yani muhtemelen kendinize neyin engellenmeyeceğini soruyorsunuz? Hatta bu konuda engelleme?

Daha da önemlisi, engellenmeyen bir şeye sahip olmak neden önemlidir?

Tamam, yani bir mikroişlemci bir programı çalıştırdığında, sırayla kod satırlarını yürütür ve bunu yaparken, onları yazdığınız sıraya göre işlevlere çağrı yapar ve işlevlerden geri döner.

Engelleme çağrısı, yürütmenin durdurulmasına neden olan herhangi bir işlevselliğe yapılan bir çağrıdır; yani, çağıranın, çağrılan işlevin yürütülmesi bitene kadar yürütmeye devam etmeyeceği bir işlev çağrısı anlamına gelir.

Peki bu neden önemli?

Bir sıcaklık okuma, bir düğme okuma ve bir ekranı güncelleme gibi birçok işlevi düzenli olarak sırayla yürütmesi gereken bir kod yazdıysanız, ekranı güncelleme kodunun bir engelleme araması olması durumunda, sisteminiz yanıt vermeyecektir. işlemci, tüm zamanını ekranın güncellenmesini beklemek ve düğme durumunu veya en son sıcaklığı okumamak için harcayacağından, düğmeye basıldığında ve sıcaklıkta değişir.

Kendi adıma, hem yerel hem de uzak sıcaklık/nem değerlerini, ortam ışık seviyelerini, barometrik basıncı okuyan, zamanı takip eden, tüm bu parametreleri bir LCD'de görüntüleyen, bir uSD'ye giriş yapan WiFi özellikli IoT masaüstü cihazı üzerinden bir MQTT oluşturmak istiyorum. gerçek zamanlı kart, düğme girişlerini okuma, çıkış LED'lerine yazma ve IoT altyapımdaki şeyleri kontrol etmek için hareketleri izleme ve bunların tümü bir ESP8266-12 tarafından kontrol edilebilir.

Ne yazık ki bulabildiğim iki APDS9960 kitaplığı kaynağı, her ikisi de Avago'dan (ADPS9960 üreticisi) uygulama kodundan alınan ve bir süre (1){} içeren 'readGesture' adlı bir çağrıya sahip olan SparkFun ve AdaFruit kitaplıklarıydı; Yukarıdaki projede kullanıldığında, ADPS9960 sensörü doyduğunda (yani bir nesne yakın kaldığında veya sensörü aydınlatan başka bir IR kaynağı olduğunda) ESP8266-12E'nin sıfırlanmasına neden olan döngü.

Sonuç olarak, bu davranışı çözmek için, Hareketlerin işlenmesini, ESP8266-12E'nin ana mikrodenetleyici ve bu sistemin, yukarıdaki Resim 1 ve 2'de, Sisteme Genel Bakış ve Sistem Bileşimi şemalarında gösterildiği gibi köle olduğu ikinci bir işlemciye taşımayı seçtim.. Resim 3 prototip devresini göstermektedir.

Mevcut kodumda yapmam gereken değişiklikleri sınırlamak için, yaratıcı bir şekilde 'APDS9960_NonBlocking' adında bir sarmalayıcı sınıf/kütüphane yazdım.

Aşağıda, engellemeyen çözümün ayrıntılı bir açıklaması yer almaktadır.

Hangi Parçalara İhtiyacım Var?

APDS9960_NonBlocking kitaplığı ile çalışan I2C çözümünü oluşturmak istiyorsanız aşağıdaki parçalara ihtiyacınız olacaktır.

  1. ATMega328P burada 1 indirim
  2. 1 adet PCF8574P burada
  3. 6 adet 10K Direnç burada
  4. 4 kapalı 1K Direnç burada
  5. 1 adet 1N914 Diyot burada
  6. 1 adet PN2222 NPN Transistör burada
  7. 1 adet 16MHz kristal burada
  8. 2 adet 0.1uF Kapasitör burada
  9. 1 kapalı 1000uF Elektrolitik Kapasitör burada
  10. 1 adet 10uF Elektrolitik Kondansatör burada
  11. 2 adet 22pF Kondansatör burada

Hareket sensörü çıkışını paralel arayüz üzerinden okumak istiyorsanız, PCF8574P'yi ve üç adet 10K rezistörü bırakabilirsiniz.

Hangi yazılıma ihtiyacım var?

Arduino IDE 1.6.9

Hangi becerilere ihtiyacım var?

Sistemi kurmak için (verilen) kaynak kodunu kullanın ve aşağıdakilere ihtiyacınız olacak gerekli devreyi oluşturun;

  • Minimum düzeyde elektronik bilgisi,
  • Arduino ve IDE bilgisine sahip,
  • Gömülü bir Arduino'nun nasıl programlanacağına dair bir anlayış (Bkz. 'ATTiny85, ATTiny84 ve ATMega328P'yi Programlama: ISP Olarak Arduino')
  • Biraz Sabır.

İşlenmiş konular

  • Devreye kısa bir bakış
  • Yazılıma kısa bir bakış
  • APDS9960 Hareket Algılama Cihazının Test Edilmesi
  • Çözüm
  • Referanslar

Adım 1: Devreye Genel Bakış

Devreye Genel Bakış
Devreye Genel Bakış

Devre iki bölüme ayrılmıştır;

  • Birincisi, R8…10 ve IC1 dirençleri aracılığıyla gerçekleştirilen seri I2C'den paralel dönüştürmeye. Burada R8…R10, 8 bit G/Ç genişletme yongası IC1 ve NXP PCF8574A için I2C adresini ayarlar. Bu cihaz için geçerli adres aralıkları sırasıyla 0x38 … 0x3F'dir. Sağlanan I2C yazılım örneğinde 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' bu adres aralığına uyacak şekilde değiştirilmelidir.
  • Diğer tüm bileşenler, bir bağımlı yerleşik Arduino Uno oluşturur ve aşağıdaki işlevlere sahiptir;

    • R1, T1, R2 ve D1, bir bağımlı cihaz sıfırlama girişi sağlar. Burada IC1 - P7 üzerindeki aktif bir yüksek darbe U1'i sıfırlamaya zorlayacaktır.
    • R3, R4, gömülü cihaz programlama TX/RX hatları için akım sınırlayıcı dirençlerdir.
    • C5 ve R7, Arduino IDE'nin bağlı bir FTDI cihazının DTR hattındaki bir darbe yoluyla U1'i otomatik olarak programlamasına izin verir.
    • R5 ve R6, APDS9960 için C6 ile yerel besleme rayı ayırma sağlayan I2C yukarı çekme dirençleridir.
    • U1, C1, C2 ve Q1, sırasıyla gömülü Arduino Uno'yu ve saatini oluşturur.
    • Son olarak, C3 ve C4, U1 için yerel besleme rayı ayırma sağlar.

2. Adım: Yazılıma Genel Bakış

Yazılıma Genel Bakış
Yazılıma Genel Bakış
Yazılıma Genel Bakış
Yazılıma Genel Bakış
Yazılıma Genel Bakış
Yazılıma Genel Bakış

önsöz

Bu kaynak kodunu başarılı bir şekilde derlemek için, gömülü Arduino Uno U1'i programlamak için aşağıdaki ekstra kütüphanelere ihtiyacınız olacak;

SparkFun_APDS9960.h

  • Gönderen: Steve Quinn
  • Amaç: Bu, jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library'den alınan SparkFun APDS9960 Sensörünün çatallı versiyonudur. Hata ayıklamaya yardımcı olacak birkaç modifikasyona sahiptir ve sahte tetiklemeyi azaltmak için hassasiyeti giderilmiş bir dedektöre sahiptir.
  • Kimden:

APDS9960_NonBlocking.h

  • Gönderen: Steve Quinn
  • Amaç: APDS9960 Hareket Sensörünün bu engellemesiz uygulamasını Arduino kodunuza yerleştirmek için temiz bir arayüz sağlar.
  • Kimden:

Bunu nasıl başaracağınıza aşina değilseniz, gömülü bir Arduino Uno (ATMega328P) mikro denetleyicisinin nasıl programlanacağına ilişkin aşağıdaki Talimatlara bakın;

ATTINY85, ATTINY84 VE ATMEGA328P: ARDUINO AS ISP PROGRAMLAMA

Fonksiyonel Genel Bakış

ATMega328P yerleşik bağımlı mikro denetleyici, ADPS9960'tan INT hattını yoklar. Bu hat azaldığında, mikrodenetleyici ADPS9960 kayıtlarını okur ve algılanan geçerli bir hareket olup olmadığını belirler. Geçerli bir hareket algılanırsa, bu hareket 0x0…0x6, 0xF için kod B Bağlantı Noktasına yerleştirilir ve 'nGestureAvailable' düşük olarak kabul edilir.

Ana cihaz 'nGestureAvailable'ın etkin olduğunu gördüğünde, Port B'deki değeri okur ve ardından verilerin alındığını onaylamak için geçici olarak 'nGestureClear' düşük sinyali verir.

Köle cihaz daha sonra 'nGestureAvailable' yüksek değerini kaldırır ve Port B'deki verileri temizler. Yukarıdaki Resim 5, tam algılama/okuma döngüsü sırasında bir mantık analizöründen alınan bir ekran görüntüsünü gösterir.

Kod Genel Bakış

Yukarıdaki Resim 1, U1'deki gömülü bağımlı Arduino Uno'daki yazılımın nasıl çalıştığını, Pic 2 ile birlikte iki arka plan/ön plan görevinin nasıl etkileşime girdiğini detaylandırıyor. Resim 3, APDS9960_NonBlockinglibrary'nin nasıl kullanılacağını özetleyen bir kod bölümüdür. Pic 4, Arduino Uno Dijital Pinleri ile ATMega328P üzerindeki gerçek donanım pinleri arasında bir eşleme sağlar.

Sıfırlamadan sonra, yerleşik bağımlı mikro denetleyici, APDS9960'ı başlatır ve hareket algılamanın INT çıkışını tetiklemesine izin verir ve G/Ç'sini yapılandırır, INT0 vektörünü (Dijital pim 2, Donanım IC pimi 4) kesintiye uğratmak için kesme hizmeti rutini (ISR) 'GESTURE_CLEAR()' ekleyerek, düşen kenar tetikleyicisi için yapılandırın. Bu, ana cihazdan nGestureClear girişini oluşturur.

APDS9960'dan gelen Kesinti çıkış pini 'INT', U1'e giriş olarak konfigüre edilen Dijital Pin 4, Donanım IC Pin 6'ya bağlanır.

Dijital pim 7, Donanım IC pim 13'teki 'nGestureAvailable' sinyal hattı bir çıkış olarak yapılandırılır ve yüksek olarak ayarlanır, etkin değil (onaylı değil).

Son olarak Port B bitleri 0…3 sırasıyla çıkışlar olarak yapılandırılır ve düşük olarak ayarlanır. Bunlar, algılanan çeşitli hareket türlerini temsil eden veri nibble'ını oluşturur; Yok = 0x0, Hata = 0xF, Yukarı = 0x1, Aşağı = 0x2, Sol = 0x3, Sağ = 0x4, Yakın = 0x5 ve Uzak = 0x6.

APDS9960 Interrupt çıkışını INT'yi Dijital Pin 4'ü okuyarak sürekli olarak yoklayan arka plan görevi 'Loop' programlanmıştır.)' ile while (1) {}; Sonsuz döngü.

Geçerli bir hareket algılanırsa, bu değer Port B'ye yazılır, 'nGestureAvailable' çıktısı onaylanır ve 'bGestureAvailable' boolean semaforu ayarlanır, böylece başka hareketlerin günlüğe kaydedilmesi engellenir.

Master, aktif 'nGestureAvailable' çıktısını tespit ettiğinde, bu yeni değeri okur ve 'nGestureClear' aktif düşük sinyalini gönderir. Bu düşen kenar, 'ISR GESTURE_CLEAR()' ön plan görevinin, arka plan görevi 'Döngü'nün yürütülmesini askıya alarak, Bağlantı Noktası B'yi, 'bGestureAvailable' semaforunu ve 'nGestureAvailable' çıktısını temizleyerek programlanmasını tetikler.

Ön plan görevi 'GESTURE_CLEAR()' şimdi askıya alındı ve arka plan görevi 'Döngü' yeniden planlandı. APDS9960'tan gelen diğer hareketler artık algılanabilir.

Kesinti ile tetiklenen ön plan/arka plan görevlerini bu şekilde kullanarak, bağımlı aygıtın 'readGesture()' içindeki potansiyel sonsuz döngü, ana aygıtın çalışmasını etkilemeyecek ve bağımlı aygıtın yürütülmesini de engellemeyecektir. Bu, çok basit bir gerçek zamanlı işletim sisteminin (RTOS) temelini oluşturur.

Not: 'n' öneki, etkin düşük veya 'nGestureAvailable'da olduğu gibi ileri sürülen anlamına gelir.

3. Adım: Engellemeyen APDS9960 Hareket Algılama Aygıtını Test Etme

NonBlocking APDS9960 Hareket Algılama Cihazının Test Edilmesi
NonBlocking APDS9960 Hareket Algılama Cihazının Test Edilmesi
NonBlocking APDS9960 Hareket Algılama Cihazının Test Edilmesi
NonBlocking APDS9960 Hareket Algılama Cihazının Test Edilmesi
NonBlocking APDS9960 Hareket Algılama Cihazının Test Edilmesi
NonBlocking APDS9960 Hareket Algılama Cihazının Test Edilmesi
NonBlocking APDS9960 Hareket Algılama Cihazının Test Edilmesi
NonBlocking APDS9960 Hareket Algılama Cihazının Test Edilmesi

önsöz

APDS9960 modülü +5v ile tedarik edilse de, yerleşik bir +3v3 regülatörü kullanır, yani I2C hatları +3v3 uyumludur ve +5v değildir. Bu nedenle, seviye değiştirici ihtiyacını ortadan kaldırmak için test mikro denetleyicisi olarak +3v3 uyumlu Arduino Due'ı kullanmayı seçtim.

Bununla birlikte, gerçek bir Arduino Uno kullanmak istiyorsanız, o zaman I2C hatlarını U1'e kaydırmanız gerekir. I2C kullanımı hakkında birçok pratik ipucu veren kullanışlı bir slayt seti (I2C_LCD_With_Arduino) eklediğim aşağıdaki Talimatlara bakın.

I2C Arayüz Testi

Yukarıdaki resim 1 ve 2, sistemin I2C arayüzü için nasıl kurulacağını ve programlanacağını göstermektedir. Önce APDS9960_NonBlocking kitaplığını indirip kurmanız gerekecek. Burada

Paralel Arayüz Testi

Resim 3 ve 4, Paralel arayüz için aynı ayrıntıyı veriyor

4. Adım: Sonuç

Çözüm
Çözüm

Genel

Kod iyi çalışıyor ve herhangi bir yanlış pozitif olmadan jestleri duyarlı bir şekilde algılıyor. Bir sonraki projemde bağımlı cihaz olarak birkaç haftadır çalışıyor ve çalışıyor. Daha önce hiçbir olumsuz etkisi olmayan bir ESP8266-12 sıfırlamasıyla sonuçlanan birçok farklı arıza modunu denedim (ve meraklı Quinn ev moggie'si de öyle).

Olası iyileştirmeler

  • bariz. APDS9960 Hareket Sensörü kitaplığını bloke olmayacak şekilde yeniden yazın.

    Aslında, beni destek talebimi hemen görmezden gelen yerel bir distribütöre veren Broadcom ile iletişime geçtim, sanırım bir SparkFun veya AdaFruit değilim. Yani bu muhtemelen bir süre beklemek zorunda kalacak

  • Kodu daha küçük bir bağımlı mikro denetleyiciye taşıyın. Bir görev için ATMega328P kullanmak biraz abartı olur. Başlangıçta ATTiny84'e bakmama rağmen, kodun derlenmiş boyutunun bir sınır çizgisine uygun olduğunu hissettiğimden birini kullanmayı bıraktım. APDS9960 kitaplığını farklı bir I2C kitaplığı ile çalışacak şekilde değiştirmek zorunda kalmanın ek yükü ile.

Adım 5: Referanslar

Yerleşik arduino'yu programlamak için gereklidir (ATMega328P - U1)

SparkFun_APDS9960.h

  • Gönderen: Steve Quinn
  • Amaç: Bu, jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library'den alınan SparkFun APDS9960 Sensörünün çatallı versiyonudur. Hata ayıklamaya yardımcı olacak birkaç modifikasyona sahiptir ve sahte tetiklemeyi azaltmak için hassasiyeti giderilmiş bir dedektöre sahiptir.
  • Kimden:

Bu engelleyici olmayan işlevi arduino kodunuza yerleştirmek ve işe yarayan örnekler vermek için gereklidir

APDS9960_NonBlocking.h

  • Gönderen: Steve Quinn
  • Amaç: APDS9960 Hareket Sensörünün bu engellemesiz uygulamasını Arduino kodunuza yerleştirmek için temiz bir arayüz sağlar.
  • Kimden:

Gerçek Zamanlı İşletim Sistemi

https://en.wikipedia.org/wiki/Real-time_operating_system

APDS9960 Veri Sayfası

https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf

PCF8574A veri sayfası

Önerilen: