Mündəricat:
Video: Jest Sensoru ilə Neopixel Led Üzükə Nəzarət: 3 Addım (Şəkillərlə birlikdə)
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:46
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ə:
Arduino və Raspberry Pi ilə İnternetə Nəzarət Edilən Video Streaming Robotunuzu yaradın: 15 addım (şəkillərlə birlikdə)
Arduino və Raspberry Pi ilə İnternetə Nəzarət Edilən Video Streaming Robotunuzu yaradın: Mən @RedPhantom (aka LiquidCrystalDisplay / Itay), İsraildən 14 yaşında, Max Shein İbtidai Elm və Riyaziyyat Liseyində təhsil alıram. Hər kəsin öyrənməsi və paylaşması üçün bu layihəni hazırlayıram
Jest Sensoru APDS9960 ilə Məsafə Yaxınlığı Ölçülməsi: 6 Addım
APDS9960 jest sensoru ilə məsafə yaxınlığının ölçülməsi: Bu dərsdə APDS9960, arduino və Visuino jest sensoru ilə məsafəni ölçməyi öyrənəcəyik
NodeMCU Sensor Nəzarət Rölesi ilə IoT Əsaslı Ev Avtomatlaşdırmasını Necə Etmək olar: 14 Addım (Şəkillərlə birlikdə)
NodeMCU Sensorları Nəzarət Rölesi ilə IoT Əsaslı Ev Avtomatlaşdırmasını Necə Edə bilərsiniz: Bu IoT əsaslı layihədə, Blynk və NodeMCU idarəetmə rölesi modulu ilə real vaxt rəyi olan Ev Avtomatlaşdırmasını hazırladım. Manual rejimdə bu röle modulu Mobil və ya smartfondan və Manual keçiddən idarə oluna bilər. Avtomatik rejimdə bu ağıllı
Jest Nəzarət Robotu yaratmağın ən asan yolu: 7 addım (şəkillərlə)
Bir Jest Nəzarət Robotu yaratmağın ən asan yolu: Oyuncaqları super qəhrəman kimi idarə edin. Jestlə idarə olunan avtomobilin necə hazırlanacağını öyrənin. Bu, jestlə idarə olunan avtomobili özünüz necə düzəltmək barədədir. Əsasən bu MPU-6050 3 oxlu giroskop, akselerometrin sadə bir tətbiqidir. Daha çox şey edə bilərsiniz
Jest Hawk: Şəkil İşləmə Əsaslı İnterfeysdən istifadə edərək Əl Jestinə Nəzarət Edilən Robot: 13 Addım (Şəkillərlə birlikdə)
Gesture Hawk: Şəkil İşləmə Əsaslı İnterfeysdən istifadə edərək Əl Jesti ilə İdarə olunan Robot: Gesture Hawk, TechEvince 4.0-də sadə bir görüntü emalına əsaslanan insan-maşın interfeysi kimi nümayiş etdirildi. Faydası ondadır ki, fərqli işləyən robot maşını idarə etmək üçün əlcəkdən başqa heç bir əlavə sensora və ya geyilə bilməz