İçindekiler:

Hareket Sensörlü Neopiksel Led Halka Kontrolü: 3 Adım (Resimli)
Hareket Sensörlü Neopiksel Led Halka Kontrolü: 3 Adım (Resimli)

Video: Hareket Sensörlü Neopiksel Led Halka Kontrolü: 3 Adım (Resimli)

Video: Hareket Sensörlü Neopiksel Led Halka Kontrolü: 3 Adım (Resimli)
Video: AT-PIX PRO Akıllı Merdiven Kayar Led Modül Kurulumu ve Ayarları 2024, Kasım
Anonim
Image
Image
Montaj ve Yükleme
Montaj ve Yükleme

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: