Mündəricat:

Bloklanmayan APDS9960 Jest Sensorunun tətbiqi: 5 addım
Bloklanmayan APDS9960 Jest Sensorunun tətbiqi: 5 addım

Video: Bloklanmayan APDS9960 Jest Sensorunun tətbiqi: 5 addım

Video: Bloklanmayan APDS9960 Jest Sensorunun tətbiqi: 5 addım
Video: Датчик жестов APDS-9960. Обзор и подключение к Arduino. 2024, Iyul
Anonim
Bloklanmayan APDS9960 Jest Sensorunun Tətbiqi
Bloklanmayan APDS9960 Jest Sensorunun Tətbiqi
Bloklanmayan APDS9960 Jest Sensorunun Tətbiqi
Bloklanmayan APDS9960 Jest Sensorunun Tətbiqi
Bloklanmayan APDS9960 Jest Sensorunun Tətbiqi
Bloklanmayan APDS9960 Jest Sensorunun Tətbiqi

Giriş

Bu Təlimat, SparkFun_APDS-9960_Sensor_Arduino_Library istifadə edərək APDS9960 Jest Sensorunun bloklanmayan bir tətbiqinin necə yaradılacağını ətraflı izah edir.

Giriş

Yəqin ki, özünüzə mane olmayan şeyin nə olduğunu soruşursunuz? Və ya hətta bu mövzuda bloklama?

Daha da əhəmiyyətlisi, maneə törətməyən bir şeyə sahib olmaq niyə vacibdir?

Yaxşı, buna görə bir mikroprosessor bir proqramı işlədərkən ardıcıl olaraq kod sətirlərini yerinə yetirir və bununla da funksiyalara yazdığınız sıraya uyğun olaraq zənglər edir və geri qayıdır.

Bloklama çağırışı, icranın dayandırılmasına səbəb olan hər hansı bir funksiyaya edilən zəngdir, yəni çağırılan funksiyanın yerinə yetirilməsi başa çatana qədər zəng edənin icraata davam etməyəcəyi bir funksiya zəngidir.

Bəs bu niyə vacibdir?

İstilik oxumaq, bir düyməni oxumaq və bir ekranı yeniləmək kimi bir çox funksiyanı mütəmadi olaraq yerinə yetirmək üçün lazım olan bir kod yazdığınız halda, ekranı yeniləmək üçün bir kod bloklandığı təqdirdə sisteminiz cavab verməyəcək. düymə sıxılır və temperatur dəyişir, çünki prosessor bütün vaxtını ekranın yenilənməsini gözləyəcək və düymənin vəziyyətini və ya son temperaturu oxumayacaq.

Öz tərəfimdən, həm yerli, həm də uzaq temperatur/rütubət dəyərlərini, ətrafdakı işıq səviyyələrini, barometrik təzyiqi oxuyan, vaxtı izləyən, bütün bu parametrləri LCD -də göstərən, uSD -yə daxil olan WiFi qabiliyyətli IoT masaüstü cihazı üzərində MQTT yaratmaq istəyirəm. real vaxt rejimində, düymə girişlərini oxuyun, çıxış LED-lərinə yazın və IoT infrastrukturumdakı şeyləri idarə etmək üçün hərəkətləri izləyin və bunların hamısı ESP8266-12 tərəfindən idarə olunmalıdır.

Təəssüf ki, tapa biləcəyim APDS9960 kitabxanasının yalnız iki mənbəyi, hər ikisi də Avaqodan (ADPS9960 istehsalçısı) tətbiq kodundan götürülmüş və bir müddətdən ibarət olan 'readGesture' adlı bir zəngə sahib olan SparkFun və AdaFruit kitabxanaları idi (1) {}; Yuxarıdakı layihədə istifadə edildikdə, ADPS9960 sensoru doyanda ESP8266-12E cihazının sıfırlanmasına səbəb olur (yəni yaxınlıqda bir obyekt qaldıqda və ya sensoru işıqlandıran başqa bir İQ mənbəyi olduqda).

Nəticədə bu davranışı həll etmək üçün Jestlərin işlənməsini ikinci bir prosessora köçürməyi qərara aldım ki, ESP8266-12E əsas mikro nəzarətçi və bu sistem qul, yuxarıdakı Şəkillər 1 və 2-də göstərildiyi kimi Sistemə Baxış və Sistem Kompozisiya diaqramları oldu.. Şəkil 3 prototip dövrəsini göstərir.

Mövcud kodumda etməli olduğum dəyişiklikləri məhdudlaşdırmaq üçün xəyali olaraq 'APDS9960_NonBlocking' adlı bir sarğı sinfi/kitabxana da yazdım.

Aşağıdakılar, maneə törətməyən həll yolunun ətraflı izahıdır.

Hansı hissələrə ehtiyacım var?

APDS9960_NonBlocking kitabxanası ilə işləyən I2C həllini qurmaq istəyirsinizsə, aşağıdakı hissələrə ehtiyacınız olacaq.

  1. ATMega328P -də 1 endirim
  2. Burada 1 endirim PCF8574P
  3. 6 ədəd 10K rezistor burada
  4. 4 off 1K Rezistorlar burada
  5. 1 off 1N914 Diod burada
  6. 1 endirim PN2222 NPN Transistor burada
  7. 1 off 16MHz kristal
  8. Burada 2 ədəd 0.1uF kondansatör var
  9. 1 off 1000uF Elektrolitik Kondansatör
  10. 1 off 10uF Elektrolitik Kondansatör
  11. Burada 22pF 2 kondansatör var

Paralel interfeys vasitəsilə jest sensoru çıxışını oxumaq istəyirsinizsə, PCF8574P və üç off 10K rezistoru ata bilərsiniz.

Hansı proqrama ehtiyacım var?

Arduino IDE 1.6.9

Hansı bacarıqlara ehtiyacım var?

Sistemi qurmaq üçün mənbə kodunu (verilmişdir) istifadə edin və lazım olan sxemləri yaradın ki, sizə lazım olacaq;

  • Minimum elektronika anlayışı,
  • Arduino və onun IDE bilikləri,
  • Daxili bir Arduinonun necə proqramlaşdırılacağı haqqında bir anlayış
  • Biraz Səbir.

Mövzular əhatə olunur

  • Dövrə qısa baxış
  • Proqram təminatına qısa baxış
  • APDS9960 Jest Algılama Cihazının sınanması
  • Nəticə
  • İstinadlar

Addım 1: Dövrə Baxış

Dövrə Baxış
Dövrə Baxış

Dövrə iki hissəyə bölünür;

  • Birincisi, R8… 10 və IC1 rezistorları ilə həyata keçirilən paralel çevrilməyə serial I2C -dir. Burada R8… R10 8 bitlik I/O genişləndirici çipi IC1 və NXP PCF8574A üçün I2C ünvanını təyin etdi. Bu cihaz üçün etibarlı ünvan aralığı 0x38… 0x3F -dir. 'I2C_APDS9960_TEST.ino' təqdim edilən I2C proqram nümunəsində #define GESTURE_SENSOR_I2C_ADDRESS 'bu ünvan aralığına uyğun olaraq dəyişdirilməlidir.
  • Bütün digər komponentlər köləlik Arduino Uno qurur və aşağıdakı funksiyalara malikdir;

    • R1, T1, R2 və D1 kölə cihaz sıfırlama girişi təmin edir. Burada IC1 - P7 -də aktiv yüksək nəbz U1 -i sıfırlamağa məcbur edəcək.
    • R3, R4, TX/RX xətlərini proqramlaşdıran quraşdırılmış cihaz üçün cari məhdudlaşdırıcı rezistorlardır.
    • C5 və R7, Arduino IDE -yə əlavə edilmiş FTDI cihazının DTR xəttində bir nəbz vasitəsilə U1 -i avtomatik olaraq proqramlaşdırmağa imkan verir.
    • R5 və R6, APDS9960 üçün C6 ilə yerli təchizat dəmir yolu ayırma təmin edən I2C çəkmə rezistorlarıdır.
    • U1, C1, C2 və Q1, əlaqədar Arduino Uno -nu meydana gətirir və bu saatdır.
    • Nəhayət C3 və C4, U1 üçün yerli təchizat dəmir yolu ayrılmasını təmin edir.

Addım 2: Proqram təminatına ümumi baxış

Proqrama Baxış
Proqrama Baxış
Proqrama Baxış
Proqrama Baxış
Proqrama Baxış
Proqrama Baxış

Giriş

Bu mənbə kodunu uğurla tərtib etmək üçün, quraşdırılmış Arduino Uno U1 proqramlaşdırmaq üçün aşağıdakı əlavə kitabxanalara ehtiyacınız olacaq;

SparkFun_APDS9960.h

  • Müəllif: Steve Quinn
  • Məqsəd: Bu, jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library-dən ayrılmış SparkFun APDS9960 Sensorunun ayrılmış versiyasıdır. Hata ayırmağa kömək edəcək bir neçə modifikasiyaya malikdir və saxta tetiklemeyi azaltmaq üçün həssaslaşdırılmamış bir detektora malikdir.
  • Kimdən:

APDS9960_NonBlocking.h

  • Müəllif: Steve Quinn
  • Məqsəd: APDS9960 Jest Sensorunun bu maneəsiz tətbiqini Arduino kodunuza daxil etmək üçün təmiz bir interfeys təmin edir.
  • Kimdən:

Arduino Uno (ATMega328P) mikro nəzarətçisini necə proqramlaşdıracağınızı bilmirsinizsə, aşağıdakı təlimata baxın;

ATTINY85, ATTINY84 və ATMEGA328P: ARDUINO İSS OLARAK PROGRAMLANIR

Funksional Baxış

ATMega328P quraşdırılmış qul mikrokontrolörü ADPS9960 -dan INT xəttini sorğu -sual edir. Bu xətt aşağı düşəndə mikro nəzarətçi ADPS9960 qeydlərini oxuyur və düzgün bir jestin olub olmadığını təyin edir. Düzgün bir jest aşkar edildikdə, bu jestin kodu 0x0… 0x6, 0xF B Portuna yerləşdirilir və 'nGestureAvailable' aşağı olaraq təsdiqlənir.

Əsas cihaz 'nGestureAvailable' aktiv olduğunu gördükdə, B Portundakı dəyəri oxuyur və sonra məlumatların alındığını təsdiq etmək üçün 'nGestureClear' ı müvəqqəti olaraq aşağı çəkir.

Slave cihazı daha sonra 'nGestureAvailable' səviyyəsini yüksək səviyyədə təsdiqləyir və Port B üzərindəki məlumatları təmizləyir. Yuxarıdakı Pic 5, tam aşkarlama/oxuma dövrü ərzində məntiq analizatorundan alınan bir ekran görüntüsünü göstərir.

Kod Baxış

Yuxarıdakı Şəkil 1, U1 -də quraşdırılmış qul Arduino Uno proqramının necə işlədiyini, Pic 2 ilə birlikdə iki arxa planın/ön plandakı vəzifələrin necə qarşılıqlı əlaqədə olduğunu göstərir. Şəkil 3, APDS9960_NonBlockinglibrary -dən necə istifadə olunacağını izah edən bir kod seqmentidir. Şəkil 4, Arduino Uno Digital Pins ilə ATMega328P -dəki həqiqi aparat pinləri arasında bir eşleme verir.

Yenidən qurulduqdan sonra daxili mikro nəzarətçi APDS9960 -ı işə salır ki, bu da INT çıxışını tetiklemeye imkan verir və giriş/çıxışını konfiqurasiya edir, INT0 vektorunu kəsmək üçün 'GESTURE_CLEAR ()' xidmətini (ISR) əlavə edərək I/O -nu konfiqurasiya edir (Rəqəmsal pin 2, Avadanlıq IC pin 4)., düşən kənar tətik üçün konfiqurasiya edin. Bu, əsas cihazdan nGestureClear girişini təşkil edir.

APDS9960 -dan "INT" kəsmə çıxışı U1 -ə giriş olaraq konfiqurasiya edilmiş Digital Pin 4, Hardware IC Pin 6 -a bağlıdır.

Rəqəmsal pin 7, Hardware IC pin 13 üzərindəki 'nGestureAvailable' siqnal xətti çıxış olaraq konfiqurasiya edilir və yüksək, hərəkətsiz (təsdiqlənməmiş) olaraq təyin edilir.

Nəhayət, Port B bitləri 0… 3 sırasıyla çıxış olaraq konfiqurasiya edilir və aşağıya endirilir. Bunlar, aşkar edilmiş müxtəlif jest növlərini təmsil edən məlumatları əmələ gətirir; Heç biri = 0x0, Xəta = 0xF, Yuxarı = 0x1, Aşağı = 0x2, Sol = 0x3, Sağ = 0x4, Yaxın = 0x5 və Uzaq = 0x6.

Rəqəmsal Pin 4 -ü oxumaqla APDS9960 Interrupt çıxış INT -ni davamlı olaraq sorğu -sual edən arxa plan vəzifəsi 'Loop' planlaşdırılır ki, APDS9960 -dan INT çıxışı sensorun işə salındığını göstərən aşağı aktiv olduqda mikrokontrolör 'readGesture () 'with it's while (1) {}; sonsuz döngə.

Etibarlı bir jest aşkar edildikdə, bu dəyər B Portuna yazılır, 'nGestureAvailable' çıxışı təsdiqlənir və 'bGestureAvailable' boolean semaforu təyin edilir və bu da hər hansı bir jestin qeyd edilməsinin qarşısını alır.

Master aktiv 'nGestureAvailable' çıxışını algıladıqdan sonra bu yeni dəyəri oxuyur və 'nGestureClear' aktivini aşağı çəkir. Bu düşən kənar, 'ISR GESTURE_CLEAR ()' vəzifəsini tetikler, 'Loop' arxa plan tapşırığının icrasını dayandırmaq, B Portu, 'bGestureAvailable' semaforu və 'nGestureAvailable' çıxışını təmizləmək üçün planlaşdırılır.

Ön plan vəzifəsi 'GESTURE_CLEAR ()' artıq dayandırılıb və arxa plan vəzifəsi 'Döngü' yenidən planlaşdırılır. APDS9960 -dan əlavə jestlər artıq hiss edilə bilər.

Bu şəkildə fasilə səbəb olan ön plan/arxa plan vəzifələrini istifadə etməklə, slave cihazının 'readGesture ()' dakı potensial sonsuz döngəsi master cihazın işinə təsir etməyəcək və qul cihazının da icrasına mane olmayacaqdır. Bu, çox sadə real vaxt əməliyyat sisteminin (RTOS) əsasını təşkil edir.

Qeyd: 'n' prefiksi 'nGestureAvailable' dakı kimi aktiv aşağı və ya təsdiqlənmiş deməkdir.

Addım 3: Bloklanmayan APDS9960 Jest Algılama Cihazının sınanması

Bloklanmayan APDS9960 Jest Algılama Cihazının sınanması
Bloklanmayan APDS9960 Jest Algılama Cihazının sınanması
Bloklanmayan APDS9960 Jest Algılama Cihazının sınanması
Bloklanmayan APDS9960 Jest Algılama Cihazının sınanması
Bloklanmayan APDS9960 Jest Algılama Cihazının sınanması
Bloklanmayan APDS9960 Jest Algılama Cihazının sınanması
Bloklanmayan APDS9960 Jest Algılama Cihazının sınanması
Bloklanmayan APDS9960 Jest Algılama Cihazının sınanması

Giriş

APDS9960 modulu +5v ilə təchiz olunsa da, on-board +3v3 tənzimləyicisini istifadə edir, yəni I2C xətləri +3v3 ilə uyğun gəlir və +5v deyil. Səviyyə dəyişdiricilərinə olan ehtiyacı aradan qaldırmaq üçün test mikro nəzarətçi olaraq +3v3 uyğun Arduino Due istifadə etməyi seçməyimin səbəbi budur.

Lakin, həqiqi bir Arduino Uno istifadə etmək istəsəniz, I2C xətlərini U1 səviyyəsinə qaldırmalısınız. I2C -dən istifadə etmək üçün bir çox praktik məsləhətlər verən faydalı bir slayd dəsti (I2C_LCD_With_Arduino) əlavə etdiyim Aşağıdakı Təlimata baxın.

I2C İnterfeys Testi

Şəkillər 1 və 2, I2C interfeysi üçün sistemin necə qurulacağını və proqramlaşdırılmasını göstərir. Əvvəlcə APDS9960_NonBlocking kitabxanasını yükləməli və quraşdırmalısınız. burada

Paralel İnterfeys Testi

3 və 4 -cü şəkillər paralel interfeys üçün eynidir

Addım 4: Nəticə

Nəticə
Nəticə

Ümumi

Kod yaxşı işləyir və heç bir yanlış pozitiv olmadan jestləri həssaslıqla algılar. Növbəti layihəmdə kölə bir cihaz olaraq artıq bir neçə həftədir ki, işləyir. Əvvəllər heç bir mənfi təsiri olmayan bir ESP8266-12 sıfırlaması ilə nəticələnən bir çox fərqli uğursuzluq rejimini sınadım (və maraqlanan Quinn ev moggie də).

Mümkün təkmilləşdirmələr

  • Aydındır. APDS9960 Gesture Sensor kitabxanasını blok etməmək üçün yenidən yazın.

    Əslində Broadcom ilə əlaqə saxladım və məni dəstək istəyimə məhəl qoymayan yerli bir distribyutorla əlaqə saxladım, sadəcə bir SparkFun və ya AdaFruit deyiləm. Buna görə yəqin ki, bir müddət gözləmək lazım gələcək

  • Kodu daha kiçik bir kölə mikro nəzarətçiyə bağlayın. Bir tapşırıq üçün ATMega328P -dən istifadə etmək bir az artıq işdir. Əvvəlcə ATTiny84 -ə baxsam da, kodun tərtib edilmiş ölçüsünün sərhəd xəttinə uyğun olduğunu hiss etdiyim üçün birini istifadə etməyi dayandırdım. Fərqli bir I2C kitabxanası ilə işləmək üçün APDS9960 kitabxanasını dəyişdirmək məcburiyyətində qalan əlavə xərclə.

Addım 5: İstinadlar

Daxili arduino (ATMega328P - U1) proqramlaşdırmaq üçün tələb olunur

SparkFun_APDS9960.h

  • Müəllif: Steve Quinn
  • Məqsəd: Bu, jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library-dən ayrılmış SparkFun APDS9960 Sensorunun ayrılmış versiyasıdır. Hata ayırmağa kömək edəcək bir neçə modifikasiyaya malikdir və saxta tetiklemeyi azaltmaq üçün həssaslaşdırılmamış bir detektora malikdir.
  • Kimdən:

Bu maneəsiz funksiyanı arduino kodunuza yerləşdirmək və işlənmiş nümunələr vermək tələb olunur

APDS9960_NonBlocking.h

  • Müəllif: Steve Quinn
  • Məqsəd: APDS9960 Jest Sensorunun bu maneəsiz tətbiqini Arduino kodunuza daxil etmək üçün təmiz bir interfeys təmin edir.
  • Kimdən:

Real vaxt əməliyyat sistemi

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

APDS9960 məlumat cədvəli

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

Tövsiyə: