Mündəricat:

Jest Sensoru ilə Neopixel Led Üzükə Nəzarət: 3 Addım (Şəkillərlə birlikdə)
Jest Sensoru ilə Neopixel Led Üzükə Nəzarət: 3 Addım (Şəkillərlə birlikdə)

Video: Jest Sensoru ilə Neopixel Led Üzükə Nəzarət: 3 Addım (Şəkillərlə birlikdə)

Video: Jest Sensoru ilə Neopixel Led Üzükə Nəzarət: 3 Addım (Şəkillərlə birlikdə)
Video: Микроволновый датчик присутствия с сенсором освещения - обзор, работа в Tuya Smart и Home Assistant 2024, Noyabr
Anonim
Image
Image
Quraşdırma və Yükləmə
Quraşdırma və Yükləmə

Bu dərsdə, bir Arduino UNO istifadə edərək hər ikisini necə birləşdirməyi öyrənmək üçün bir jest sensoru (APDS-9960) və bir neopixel üzüklə oynayacağıq.

Son məhsul, sağa və ya sola yönəldilmiş hərəkəti canlandıraraq sola - sağa və LEDlərin rəngini dəyişdirərək yuxarı - aşağı hərəkətlərə cavab verəcək.

Növbəti addımlarda hissə siyahısına və komponentləri necə bağlayacağınıza qısaca nəzər salacaqsınız. Və sonra necə işlədiyini öyrənmək üçün kodu addım -addım nəzərdən keçirəcəyik.

Addım 1: Komponentlər

1. Arduino UNO

2. usb kabeli

3. APDS9960 jest sensoru (https://www.sparkfun.com/products/12787)

4. 24 led neopixel led üzük (https://www.adafruit.com/product/1586)

5. kişi-qadın, kişi-kişi çörək taxtası kabelləri

6. çörək taxtası

7. Led üzük üçün 5 V enerji təchizatı (4 ədəd batareya istifadə edirəm)

8. Neopixel halqanı çörək taxtasına bağlamaq üçün ona üç kişi sancağı lehimləməlisiniz: GND, PWR və nəzarət pimi. Bunun üçün bir lehimləmə dəmiri və axına ehtiyacınız olacaq

Buradakı əsas komponentlər APDS-9960 jest sensoru və 24 neopixel üzükdür. İstədiyiniz kimi fərqli arduinoları, usb kabellərinin enerji təchizatını və çörək lövhələrini dəyişə bilərsiniz.

Addım 2: Montaj və Yükləmə

Məclis

Başlamadan əvvəl masanızda bütün komponentlərin olduğundan əmin olun. İzləmək üçün bir neçə gözəl addımımız olacaq:). Fritzing sxemini şəkil kimi və fritzing formatında da əlavə etmişəm.

1. Neopixel halqaya 3 kişi sancağını lehimləyin (GND, PWR, nəzarət pimi)

2. neopixel halqasını çörək taxtasına bağlayın

3. APDS9960 sensorunu çörək taxtasına qoşun

4. zəmini birləşdirin: batareya paketi, arduino UNO, APDS9960 və neopixel

5. gücü qoşun: arduino UNO 3V -dən APDS9960 -a qədər pin, batareya paketinin gücünə neopixel

6. neopixel idarəetmə pinini arduino D6 pininə qoşun

7. APDS9960 -ın SDA və SCL -ni müvafiq olaraq A4 və A5 -ə qoşun

8. APDS9960 kəsmə pinini arduino D2 -yə qoşun

Kod yükləmə

Əvvəlcə lazımi arduino kitabxanalarını yükləməli və quraşdırmalısınız:

1. Neopixel üzük kitabxanası:

2. Jest sensor kitabxanası:

Arduino kitabxanalarını necə quracağınızı bilmirsinizsə, bu təlimatı oxuyun.

Yuxarıdakı kitabxanaları yüklədikdən və yüklədikdən sonra buradakı arduino depomu klonlaya və ya yükləyə bilərsiniz: https://github.com/danionescu0/arduino və bu eskizi istifadə edəcəyik: https://github.com/danionescu0 /arduino/ağac/master/layihələr/neopixel_ring_gestures

Növbəti hissədə kodu birbaşa bu təlimata yerləşdirəcəyəm, buna görə də istəsəniz oradan kopyalayıb yapışdıra bilərsiniz.

Nəhayət, usdu kabelindən istifadə edərək kompüteri arduino -ya bağlayın, 1,5 v batareyaları batareya paketinə qoyun və eskizini arduino -ya yükləyin.

Addım 3: Necə işləyir?

Bu son hissədə bu komponentlərin necə birləşdirildiyini, kitabxanalarından necə istifadə edəcəyimi və kodumu necə qurduğumu öyrənəcəyik:

Əvvəlcə istifadə edəcəyimiz sensor və neopixel kitabxana API üsullarına qısa bir nəzər salaq

1. Adafruitdən Neopixel API

Bu kitabxanadan fərdi ledin rəngini idarə edən və tətbiq edən metodlardan istifadə edəcəyik

- kitabxanaya daxildir:

#daxil edin

- kitabxananı elan edin

#NEOPIXED_CONTROL_PIN 6 təyin edin

#define NUM_LEDS 24 Adafruit_NeoPixel zolağı = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);

- işə salmaq

#tipik olaraq quraşdırma blokunun içərisində

void setup () {strip.begin (); # Bəlkə burda başqa şeylər var …. }

- fərdi pikselləri yandırın və sonra bütün dəyişiklikləri zolağa tətbiq edin (bir şəkildə göstərin)

# 0 pikselini qırmızı olacaq şəkildə qurun

strip.setPixelColor (0, strip. Color (255, 0, 0)); # 1 pikselini yaşıl şerit olaraq qurun. setPixelColor (1, strip. Color (0, 255, 0)); # piksel 2 -ni mavi zolaq olaraq qurun. setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. APDS 9960 jest sensoru

Bu kitabxanadan "oxumaq jesti" funksiyasından istifadə edəcəyik. Bu funksiya sol-sağ, yuxarı-aşağı, yaxın-uzaq əmrləri ayırd edə biləcək. Burada bir hiylə var, algılanan son jest üçün sensordan davamlı olaraq soruşmayacağıq. Lövhə, bir jestin tapıldığını kəsərək "ping" etmə qabiliyyətinə malikdir.

- neopixelə bənzər kitabxananı daxil edin

- kitabxananı kəsmə pinini və kəsmə bayrağını elan edin

#APDS9960_INT 2 təyin edin

SparkFun_APDS9960 apds = SparkFun_APDS9960 (); int isr_flag = 0;

- adətən quraşdırma funksiyası daxilində kitabxananı işə salın

boş quraşdırma ()

{ # kəsmə pinini INPUT elan edin və ona pinMode (APDS9960_INT, INPUT) funksiyasını əlavə edin; attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 başlatma tamamlandı"); } else {Serial.println ("APDS-9960 init zamanı bir şey səhv oldu!"); } # başqa şeyi bəlkə də başladın}

- kəsmə funksiyasını təyin edin, burada yalnız bir bayraq təyin edəcəyik

void interruptRoutine () {

isr_flag = 1; }

- loop funksiyasının içərisində bir jestin aşkarlanıb -aşkarlanmadığını görmək üçün bayrağı vaxtaşırı yoxlayın

boşluq döngəsi ()

{ # əgər bayrağı yoxlayın (isr_flag == 1) { # əgər bayraq qurulubsa, kəsilməni çıxarın, handleGesture () funksiyası # daxilində lazımi emal edin və sonra bayrağı sıfırlayın və kəsmə detachInterrupt (0) -ı yenidən bağlayın; handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } burada başqa # kod ola bilər}

- son jesti istəyə biləcəyimiz handleGesture () funksiyasını təyin edin

void handleGesture () {

# heç bir jest mümkün deyilsə, bu yalnız təhlükəsiz bir yoxlama (! apds.isGestureAvailable ()) {return; } # son jesti oxuyur, bilinənlərlə müqayisə edir və bir mesaj açarı çap edir (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); fasilə; hal DIR_DOWN: Serial.println ("AŞAĞI"); fasilə; halda DIR_LEFT: Serial.println ("SOL"); fasilə; halda DIR_RIGHT: Serial.println ("SAĞ"); fasilə; halda DIR_FAR: Serial.println ("FAR"); fasilə; }}

İndi bütün kodu hərəkətdə görək:

Jest sensoru və neopixel halqasının əsas API'sini izah etdim, indi hər şeyi bir araya gətirək:

Alqoritm belə işləyir:

- kitabxanaları işə salın (yuxarıdakı koda baxın)

- "ledStates" adlanan bir sıra güclü intensivliklər yaradın. Bu sıra 150 -dən 2 -ə qədər azalan şəkildə təşkil edilən 24 led intensivliyi ehtiva edəcək

- əsas döngənin içərisində kəsmə pininin dəyişdirilib -dəyişdirilmədiyini yoxlayın, əgər LED -in animasiyasını və ya rəngini dəyişdirməyin vaxtıdır

- "handleGesture ()" funksiyası son jesti yoxlayır və YUKARI AŞAĞI jestlər üçün "toggleColor" funksiyasını çağırır və ya SOL - SAĞ hərəkətlər üçün "ledDirection" qlobal dəyişənini təyin edir.

- "toggleColor ()" funksiyası sadəcə "colorSelection" adlı qlobal dəyişəni 0, 1, 2 dəyərlərindən biri ilə dəyişir.

- əsas döngə funksiyasında "animateLeds ();" adlı başqa bir funksiya da var. adlanır. Bu funksiya 100 milisaniyənin keçib -keçmədiyini yoxlayır və əgər belədirsə "rotateLeds ()" funksiyasından istifadə edərək ledləri döndərir və sonra yenidən çəkir.

- "rotateLeds ()", "intermediateLedStates" adlı başqa bir sıra istifadə edərək ledləri irəli və ya geriyə "döndərəcək".

Dönmə "təsiri" belə görünəcək:

# başladıqdan sonra

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # after rotateLeds () {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # after rotateLeds () yenidən çağırılır {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # və s

Bunun üçün əvvəlcə yeni dizi yaradılır və yeni mövqelərdəki köhnə led intensivliyi kopyalanır (mövqeyi artırın və ya azaldın). Bundan sonra "ledStates" dizisini "intermediateLedStates" ilə yazır, buna görə də proses başqa 100 millisaniyədən sonra davam edəcək.

#"SparkFun_APDS9960.h" daxil edin

#"Adafruit_NeoPixel.h" daxil edin

#"Wire.h" daxil edin #NEOPIXED_CONTROL_PIN 6 təyin edin #NUM_LEDS təyin edin 24 #define APDS9960_INT 2 #define LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel şeridi = Adafruit_NeOPE_NEOPE_NEOPE_N_ SparkFun_APDS9960 apds = SparkFun_APDS9960 (); imzasız uzun lastLedChangeTime = 0; qısa ledDirection = 0; qısa rəngSeçmə = 0; bayt ledStates = {150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int isr_flag = 0; void setup () {Serial.begin (9600); Serial.println ("Proqram başladı"); strip.begin (); pinMode (APDS9960_INT, GİRİŞ); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 başlatma tamamlandı"); } else {Serial.println ("APDS-9960 init zamanı bir şey səhv oldu!"); } lastLedChangeTime = milis (); Serial.println ("Uğurla başla"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * Bu APDS9960 sensorundan jestləri idarə edəcək * Yuxarı və Aşağı hərəkətləri toggleColor funksiyasını çağıracaq * Sol və Sağ hərəkətlər led animasiyasını dəyişəcək * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } keçid (apds.readGesture ()) {halda DIR_UP: Serial.println ("YUXARI"); toggleColor (); fasilə; hal DIR_DOWN: Serial.println ("AŞAĞI"); toggleColor (); fasilə; halda DIR_LEFT: ledDirection = 1; Serial.println ("SOL"); fasilə; halda DIR_RIGHT: ledDirection = -1; Serial.println ("SAĞ"); fasilə; halda DIR_FAR: ledDirection = 0; Serial.println ("FAR"); fasilə; }} / ** * Cari LEDlərin rəngini dəyişdirin * Bu funksiya hər dəfə çağırıldıqda led vəziyyətini dəyişəcək * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } başqa if (colorSelection == 1) {colorSelection = 2; } başqa {colorSelection = 0; }} / ** * Animasiya LED_SPEED_STEP_INTERVAL millisdən sonra işləyəcək * Əvvəlcə rotateLeds funksiyası çağırılır, sonra led rəngləri api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return; } rotateLeds (); for (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates ))); strip.show (); } lastLedChangeTime = milis (); } /** * "IntermediateLedStates" ikincil bir sıra istifadə edərək, LED intensivliyi canlandırılır * Əvvəlcə "ledStates" dən alınan dəyərlər "intermediateLedStates" ə kopyalanır * belə "ledStates" serialının {100, 80, 60, 0, 0, 0} və ledDirection 1 * dir, sonra bu funksiya "ledStates" adlandırıldıqdan sonra {0, 100, 80, 60, 0, 0} fırlanma effektini simulyasiya edir */ void rotateLeds () {bayt intermediateLedStates [NUM_LEDS]; for (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } üçün (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } başqa {intermediateLedStates [i + 1] = ledStates ; }} başqa {əgər (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } başqa {intermediateLedStates [i - 1] = ledStates ; }}} üçün (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int intensivliyi) {keçid (colorSelection) {hal 0: qaytarma zolağı. Color (intensivlik, 0, 0); hal 1: qayıtma zolağı. Color (0, intensivlik, 0); default: return strip. Color (0, 0, intensivlik); }}

Ümid edirəm bundan zövq aldınız, şərh bölməsindən istifadə edərək mənə suallar verə bilərsiniz.

Tövsiyə: