İçindekiler:
Video: Hareket Sensörlü Neopiksel Led Halka Kontrolü: 3 Adım (Resimli)
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:20
Bu derste, bir Arduino UNO kullanarak ikisini nasıl birleştireceğimizi öğrenmek için bir hareket sensörü (APDS-9960) ve bir neopiksel halkası ile oynayacağız.
Nihai ürün, led hareketini sağa veya sola hareket ettirerek sol - sağ hareketlere ve ledlerin rengini değiştirerek yukarı-aşağı hareketlere yanıt verecektir.
Sonraki adımlarda, parça listesini ve bileşenlerin nasıl bağlanacağını kısaca gözden geçireceksiniz. Ardından, nasıl çalıştığını öğrenmek için kodu adım adım inceleyeceğiz.
Adım 1: Bileşenler
1. Arduino UNO
2. usb kablosu
3. APDS9960 hareket sensörü (https://www.sparkfun.com/products/12787)
4. 24 ledli neopiksel led halka (https://www.adafruit.com/product/1586)
5. erkek-dişi, erkek-erkek devre tahtası kabloları
6. devre tahtası
7. Led halka için 5 V güç kaynağı (4 pil arkası kullanıyorum)
8. Neopiksel halkasını devre tahtasına takmak için ona üç erkek pin lehimlemeniz gerekir: GND, PWR ve kontrol pini. Bunun için bir havya ve akıya ihtiyacınız olacak
Buradaki ana bileşenler, APDS-9960 hareket sensörü ve 24 neopiksel halkadır. Farklı arduinoları, usb kablolarını, güç kaynaklarını ve breadboard'ları dilediğiniz gibi değiştirebilirsiniz.
2. Adım: Montaj ve Yükleme
toplantı
Başlamadan önce tüm bileşenlerin masanızda olduğundan emin olun. İzleyecek güzel adımlarımız olacak:). Fritzing şemasını resim olarak ve fritzing formatında da ekledim.
1. Neopiksel halkasına 3 erkek pimi lehimleyin (GND, PWR, kontrol pimi)
2. neopiksel halkasını devre tahtasına takın
3. APDS9960 sensörünü devre tahtasına takın
4. toprakları bağlayın: pil takımı, arduino UNO, APDS9960 ve neopiksel devre tahtası toprağına
5. gücü bağlayın: arduino UNO 3V'den APDS9960 güç pimine, neopikselden pil paketi gücüne
6. neopiksel kontrol pinini arduino D6 pinine bağlayın
7. APDS9960'ın SDA ve SCL'sini sırasıyla A4 ve A5'e bağlayın
8. APDS9960 kesme pinini arduino D2'ye bağlayın
Kod yükleme
Öncelikle gerekli arduino kitaplıklarını indirip kurmanız gerekecek:
1. Neopixel halka kütüphanesi:
2. Hareket sensörü kitaplığı:
Arduino kitaplıklarının nasıl kurulacağını bilmiyorsanız bu eğitime göz atın.
Yukarıdaki kütüphaneleri indirip kurduktan sonra, burada bulunan arduino depomu klonlayabilir veya indirebilirsiniz: https://github.com/danionescu0/arduino, biz de şu taslağı kullanacağız: https://github.com/danionescu0 /arduino/ağaç/ana/projeler/neopixel_ring_gestures
Bir sonraki bölümde, kodu doğrudan bu eğitime gömeceğim, böylece isterseniz oradan kopyalayıp yapıştırabilirsiniz.
Son olarak usb kablosunu kullanarak arduinoyu bilgisayara bağlayın, pil takımına 1,5 v pilleri koyun ve krokiyi arduinoya yükleyin.
Adım 3: Nasıl Çalışır?
Bu son bölümde, bu bileşenlerin nasıl bir araya getirildiğini, kitaplıklarının nasıl kullanılacağını ve kodumu nasıl yapılandırdığımı öğreneceğiz:
Önce sensöre ve kullanacağımız neopixel kitaplığı API yöntemlerine hızlıca bir göz atalım.
1. Adafruit'ten Neopixel API
Bu kütüphaneden, bireysel ledlerin rengini kontrol eden ve bunları uygulayan yöntemleri kullanacağız.
- kütüphaneyi dahil et:
#Dahil etmek
- kütüphaneyi ilan et
#define NEOPIXED_CONTROL_PIN 6
#define NUM_LEDS 24 Adafruit_NeoPixel şeridi = Adafruit_NeoPixel(NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);
- başlat
#tipik olarak kurulum bloğunun içinde
geçersiz kurulum() { strip.begin(); # belki burada başka şeyler var # …. }
- tek tek pikselleri aydınlatın ve ardından tüm değişiklikleri şeride uygulayın (bir şekilde işleyin)
# piksel 0'ı kırmızı olacak şekilde ayarla
strip.setPixelColor(0, strip. Color(255, 0, 0)); # piksel 1'i yeşil şerit.setPixelColor(1, strip. Color(0, 255, 0) olacak şekilde ayarlayın); # piksel 2'yi mavi strip.setPixelColor(2, strip. Color(0, 0 255) olacak şekilde ayarla); şerit.göster();
2. APDS 9960 hareket sensörü
Bu kitaplıktan "okuma hareketi" işlevini kullanacağız. Bu fonksiyon sol-sağ, yukarı-aşağı, yakın-uzak komutlarını ayırt edebilecektir. Burada bir hile var, algılanan son hareketi sensöre sürekli sormayacağız. Pano, bir hareketin bulunduğu bir kesinti yoluyla "ping" yapma yeteneğine sahiptir.
- neopiksele benzer şekilde kütüphaneyi dahil et
- kütüphaneyi kesme pinini ve kesme bayrağını ilan edin
#define APDS9960_INT 2
SparkFun_APDS9960 apds = SparkFun_APDS9960(); int isr_flag = 0;
- kütüphaneyi, genellikle kurulum işlevinin içinde başlatın
geçersiz kurulum()
{ # kesme pinini INPUT olarak ilan edin ve ona bir fonksiyon ekleyin pinMode(APDS9960_INT, INPUT); AttachInterrupt(0, interruptRoutine, FALLING); if (apds.init() && apds.enableGestureSensor(true)) { Serial.println("APDS-9960 başlatma tamamlandı"); } else { Serial.println("APDS-9960 başlatma sırasında bir şeyler ters gitti!"); } # belki başka şeyleri başlatır }
- kesme işlevini tanımlayın, burada sadece bir bayrak ayarlayacağız
geçersiz kesmeRoutine() {
isr_flag = 1; }
- döngü işlevinin içinde, bir hareketin algılanıp algılanmadığını görmek için bayrağı periyodik olarak kontrol edin
boşluk döngüsü()
{ # flag'i kontrol edin if(isr_flag == 1) { # eğer bayrak ayarlanmışsa, kesmeyi kaldırın, handleGesture() işlevi içinde gerekli işlemleri yapın # ve ardından bayrağı sıfırlayın ve kesme detachInterrupt(0)'u yeniden takın; handGesture(); isr_flag = 0; AttachInterrupt(0, interruptRoutine, FALLING); } # burada başka bir kod belki }
- son hareketi isteyebileceğimiz handleGesture() işlevini tanımlayın
void handleGesture() {
# herhangi bir hareket mevcut değilse, bu yalnızca güvenli bir kontrol olup, if (!apds.isGestureAvailable()) { return; } # son hareketi okur, bilinenlerle karşılaştırır ve bir mesaj anahtarı yazdırır (apds.readGesture()) { case DIR_UP: Serial.println("UP"); kırmak; case DIR_DOWN: Serial.println("DOWN"); kırmak; case DIR_LEFT: Serial.println("SOL"); kırmak; case DIR_RIGHT: Serial.println("SAĞ"); kırmak; durum DIR_FAR: Serial.println("FAR"); kırmak; } }
Şimdi tüm kodu çalışırken görelim:
Hareket sensörünün ve neopiksel halkasının temel API'sini açıkladım, şimdi her şeyi bir araya getirelim:
Algoritma şu şekilde çalışır:
- kitaplıkları başlatın (yukarıdaki koda bakın)
- "ledStates" adlı bir dizi led yoğunluğu oluşturun. Bu dizi, 150'den 2'ye azalan bir şekilde düzenlenmiş 24 led yoğunluğu içerecektir.
- ana döngü içinde, kesme pininin değiştirilip değiştirilmediğini kontrol edin, eğer öyleyse led'in animasyonunu veya rengini değiştirme zamanı geldi
- "handleGesture()" işlevi son hareketi kontrol eder ve YUKARI -AŞAĞI hareketler için "toggleColor" işlevini çağırır veya SOL - SAĞ hareketler için genel bir "ledDirection" değişkeni ayarlar
- "toggleColor()" işlevi, "colorSelection" adlı global bir değişkeni 0, 1, 2 değerlerinden biriyle değiştirir
- ayrıca ana döngü işlevinin içinde "animateLeds();" adlı başka bir işlev; denir. Bu fonksiyon 100 milisaniyenin geçip geçmediğini kontrol eder ve varsa "rotateLeds()" fonksiyonunu kullanarak ledleri döndürür ve yeniden çizer.
- "rotateLeds()", "intermediateLedStates" adlı başka bir diziyi kullanarak ledleri ileri veya geri "döndürür".
Döndürme "etkisi" şöyle görünecektir:
# başlatmadan 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}; # döndürmeLeds() işlevinden sonra {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # döndürmeLeds() yeniden çağrıldıktan sonra {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # ve bunun gibi
Bunun için önce yeni diziyi oluşturur ve eski led yoğunluklarını yeni konumlara kopyalar (konumu artırın veya azaltın). Bundan sonra "ledStates" dizisinin üzerine "intermediateLedStates" yazar, böylece işlem 100 milisaniye daha sonra devam eder.
#include "SparkFun_APDS9960.h"
#include "Adafruit_NeoPixel.h"
#include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 #define APDS9960_INT 2 #define LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel şeridi = Adafruit_NeoPixel(NUM_LEDS, NEOPIXED_CONTROL_PIN, +);O_O_ SparkFun_APDS9960 apds = SparkFun_APDS9960(); imzasız uzun lastLedChangeTime = 0; kısa ledYön = 0; kısa renkSeçimi = 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; geçersiz kurulum() { Serial.begin(9600); Serial.println("Program 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 başlatma sırasında bir şeyler ters gitti!"); } lastLedChangeTime = millis(); Serial.println("Başarılı bir şekilde başlat"); } void loop() { if(isr_flag == 1) { detachInterrupt(0); handGesture(); isr_flag = 0; AttachInterrupt(0, interruptRoutine, FALLING); } animateLeds(); } geçersiz interruptRoutine() { isr_flag = 1; } /** * Bu, APDS9960 sensöründen gelen hareketleri işleyecektir * Yukarı ve Aşağı hareketleri toggleColor işlevini çağıracaktır * Sol ve Sağ hareketler led animasyonunu değiştirecektir */ void handleGesture() { if (!apds.isGestureAvailable()) { return; } geçiş (apds.readGesture()) { case DIR_UP: Serial.println("UP"); toggleColor(); kırmak; case DIR_DOWN: Serial.println("DOWN"); toggleColor(); kırmak; durum DIR_LEFT: ledDirection = 1; Serial.println("SOL"); kırmak; durum DIR_RIGHT: ledDirection = -1; Serial.println("SAĞ"); kırmak; durum DIR_FAR: ledDirection = 0; Serial.println("FAR"); kırmak; } } /** * Mevcut ledlerin rengini değiştir * Bu fonksiyon her çağrıldığında ledlerin durumunu değiştirir */ void toggleColor() { if (colorSelection == 0) { colorSelection = 1; } else if (colorSelection == 1) { colorSelection = 2; } else { colorSelection = 0; } } /** * Animasyon LED_SPEED_STEP_INTERVAL milis sonra çalışacaktır * İlk olarak rotaryLeds fonksiyonu çağrılır, daha sonra strip api kullanılarak ledlerin renkleri ayarlanır */ void animateLeds() { if (millis() - lastLedChangeTime < LED_SPEED_STEP_INTERVAL) { return; } döndürme LED'leri(); for (int i=0; i < NUM_LEDS; i++) { strip.setPixelColor(i, getColor(ledStates)); şerit.göster(); } lastLedChangeTime = millis(); } /** * İkincil bir "intermediateLedStates" dizisi kullanarak, led'lerin yoğunlukları canlandırılır * Önce "ledStates" den gelen değerler "intermediateLedStates" üzerine kopyalanır * hadi "ledStates" dizisine {100, 80, 60, 0 yerleştirelim, 0, 0} ve ledDirection 1 * ise, bu fonksiyon "ledStates" olarak adlandırıldıktan sonra dizi {0, 100, 80, 60, 0, 0} bir döndürme efekti simüle eder */ void rotasyonLeds() { byte araLedStates[NUM_LEDS]; for (int i=0; i < NUM_LEDS; i++) { araLedStates = 0; } for (int i=0; i < NUM_LEDS; i++) { if (ledDirection == 1) { if (i == NUM_LEDS -1) { araLedStates[0] = ledStates; } else { araLedStates[i + 1] = ledStates; } } else { if (i == 0) { araLedStates[NUM_LEDS - 1] = ledStates; } else { araLedStates[i - 1] = ledStates; } } } for (int i=0; i < NUM_LEDS; i++) { ledStates = araLedStates; } } uint32_t getColor(int yoğunluk) { geçiş (colorSelection) { durum 0: dönüş şeridi. Color(yoğunluk, 0, 0); durum 1: dönüş şeridi. Renk(0, yoğunluk, 0); varsayılan: dönüş şeridi. Renk(0, 0, yoğunluk); } }
Umarım bu hoşunuza gitmiştir, bana soru sormak için yorum bölümünü kullanabilirsiniz.
Önerilen:
Hareket Tetiklemeli Neopiksel RGB Ayakkabılar!: 5 Adım (Resimlerle)
Hareket Tetiklemeli Neopiksel RGB Ayakkabılar!: NeoPixel'ler harikadır, yüzlerce ışığı 3 kabloyla, yani 5V, Din & GND ve bu derste, Hareket Tetiklemeli NeoPixel RGB Ayakkabıları nasıl yapabileceğinizi göstereceğim
Üç Neopiksel Halkalı Neopiksel Saat: 7 Adım
Üç Neopiksel Halkalı Neopiksel Saat: Steve Manley tarafından yapılan Neo Pixel saatin mükemmel tasarımı, beni en az miktarda parayla benzer bir saatin nasıl oluşturulacağına dair bu talimatı oluşturmaya yöneltti. (Önemli bir Hollanda alışkanlığı her zaman para biriktirmeye çalışmaktır;-)) Öğrendim ki o
Ultrasonik Sensörlü ve Temassız Sıcaklık Sensörlü Arduino Arabirimi: 8 Adım
Ultrasonik Sensör ve Temassız Sıcaklık Sensörü ile Arduino Arabirimi: Günümüzde, Yapımcılar, Geliştiriciler, projelerin prototiplerinin hızlı bir şekilde geliştirilmesi için Arduino'yu tercih ediyor. Arduino, kullanımı kolay donanım ve yazılıma dayalı açık kaynaklı bir elektronik platformdur. Arduino'nun çok iyi bir kullanıcı topluluğu var. Bu projede
Arduino Ws2812 LED veya Neopiksel Led Şerit veya Halka Eğitimi: 4 Adım
Arduino Ws2812 LED veya Neopiksel Led Şerit veya Halka Eğitimi: Bu talimatta, Arduino ile neopixel veya ws 2812 veya hızlı led'in nasıl kullanılacağını öğreneceğiz. Bu LED veya şerit veya halka türleri sadece tek bir Vin pini tarafından kontrol edilir ve tüm LED'ler ayrı ayrı adreslenebilir olduğundan bunlara indi
Hareket Sensörlü LED: 8 Adım
Hareket Sensörlü LED: Arka plan: Derse veya işe gitmeden önce veya yatmadan önce bir ışığı kapatmayı hiç unuttunuz mu? Kullanmadığınız zamanlarda ışıkların açık olduğu saatler, maliyet ve enerji kaybına neden olabilir. Örneğin, solarcity'ye göre