Mundarija:

Imo -ishorali sensor bilan Neopixel LED halqasini boshqarish: 3 qadam (rasmlar bilan)
Imo -ishorali sensor bilan Neopixel LED halqasini boshqarish: 3 qadam (rasmlar bilan)

Video: Imo -ishorali sensor bilan Neopixel LED halqasini boshqarish: 3 qadam (rasmlar bilan)

Video: Imo -ishorali sensor bilan Neopixel LED halqasini boshqarish: 3 qadam (rasmlar bilan)
Video: BigTreeTech SKR 1.4 - Basics 2024, Noyabr
Anonim
Image
Image
O'rnatish va yuklash
O'rnatish va yuklash

Ushbu qo'llanmada biz Arduino UNO yordamida ikkalasini birlashtirishni o'rganish uchun imo-ishorali sensor (APDS-9960) va neopixel uzuk bilan o'ynaymiz.

Yakuniy mahsulot chapga - o'ngga, o'ngga yoki chapga harakatni jonlantirish orqali, yuqoriga - pastga ishoralarga esa LEDlar rangini o'zgartirish orqali javob beradi.

Keyingi bosqichlarda siz qismlar ro'yxati va tarkibiy qismlarni qanday ulash haqida qisqacha ma'lumotga ega bo'lasiz. Va keyin biz qanday ishlashini bilish uchun kodni bosqichma -bosqich ko'rib chiqamiz.

1 -qadam: komponentlar

1. Arduino UNO

2. usb kabeli

3. APDS9960 ishorasi sensori (https://www.sparkfun.com/products/12787)

4. 24 boshli neopixelli halqa (https://www.adafruit.com/product/1586)

5. erkak-ayol, erkak-erkak non paneli kabellari

6. non taxtasi

7. Qo'rg'oshin halqasi uchun 5 V quvvat manbai (men 4 batareyadan foydalanaman)

8. Neopixel halqasini non taxtasiga ulash uchun unga uchta erkak pinni lehimlash kerak: GND, PWR va boshqaruv pimi. Buning uchun sizga lehimli temir va oqim kerak bo'ladi

Bu erda asosiy komponentlar APDS-9960 imo-ishora sensori va 24 neopixel uzukdir. Siz xohlaganingizcha turli xil arduinolarni, usb kabellarni quvvat manbalarini va taxtalarni almashtirishingiz mumkin.

2 -qadam: o'rnatish va yuklash

O'rnatish

Ishni boshlashdan oldin stolingizda barcha komponentlar borligiga ishonch hosil qiling. Bizda juda yaxshi qadamlar bo'ladi:). Men Fritzing sxemasini rasm sifatida va fritzing formatida biriktirdim.

1. Neopixel halqasiga 3 ta erkak pinni lehimlang (GND, PWR, boshqaruv pimi)

2. neopixel halqasini non taxtasiga ulang

3. APDS9960 sensorini non paneliga ulang

4. maydonchani ulang: batareya to'plami, arduino UNO, APDS9960 va neopixel.

5. quvvatni ulang: arduino UNO 3V - APDS9960 quvvat piniga, neopixel - batareya quvvati

6. neopikselli boshqaruv pinini arduino D6 piniga ulang

7. APDS9960 ning SDA va SCL -ni mos ravishda A4 va A5 ga ulang

8. APDS9960 uzilish pinini arduino D2 ga ulang

Kodni yuklash

Avval siz kerakli arduino kutubxonalarini yuklab olishingiz va o'rnatishingiz kerak bo'ladi:

1. Neopixel uzuk kutubxonasi:

2. Imo-ishorali kutubxona:

Agar siz arduino kutubxonalarini qanday o'rnatishni bilmasangiz, ushbu qo'llanmani ko'rib chiqing.

Yuqoridagi kutubxonalarni yuklaganingizdan va o'rnatganingizdan so'ng, bu erdagi mening arduino omborini klonlashingiz yoki yuklab olishingiz mumkin: https://github.com/danionescu0/arduino va biz bu eskizdan foydalanamiz: https://github.com/danionescu0 /arduino/tree/master/projects/neopixel_ring_gestures

Keyingi bo'limda men kodni to'g'ridan -to'g'ri ushbu o'quv qo'llanmasiga joylashtiraman, shuning uchun agar xohlasangiz, uni o'sha erdan nusxalashingiz va joylashtirishingiz mumkin.

Nihoyat, usdu kabeli yordamida kompyuterni arduino -ga ulang, batareyaga 1,5 voltli batareyalarni joylashtiring va eskizini arduino -ga yuklang.

3 -qadam: Bu qanday ishlaydi?

Bu oxirgi qismda biz bu komponentalar qanday birlashtirilganligini, kutubxonalaridan qanday foydalanishni va kodimni qanday tuzganimni bilib olamiz:

Birinchidan, sensor va biz foydalanadigan neopixel kutubxonasining API usullari bilan tezda tanishib chiqamiz

1. Adafruitdan Neopixel API

Bu kutubxonadan biz individual LED rangini boshqaradigan va ularni qo'llaydigan usullardan foydalanamiz

- kutubxonani o'z ichiga oladi:

#qo'shing

- kutubxonani e'lon qiling

#NEOPIXED_CONTROL_PIN 6 ni aniqlang

#define NUM_LEDS 24 Adafruit_NeoPixel tasmasi = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);

- ishga tushirish

#odatda o'rnatish blokining ichida

void setup () {strip.begin (); # balki bu erda boshqa narsalar ham bo'lishi mumkin …. }

- individual piksellarni yoqing, so'ngra barcha o'zgartirishlarni tasmaga qo'llang (uni bir xil qilib ko'rsatish)

# 0 pikselini qizil qilib sozlang

strip.setPixelColor (0, strip. Color (255, 0, 0)); # 1 pikselni yashil chiziq qilib o'rnating.setPixelColor (1, strip. Color (0, 255, 0)); # 2 -pikselni ko'k chiziq qilib o'rnating.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. APDS 9960 ishorasi sensori

Bu kutubxonada biz "o'qish imo -ishorasi" funktsiyasidan foydalanamiz. Bu funksiya chapdan o'ngga, yuqoridan pastga, yaqindan buyruqlarni ajrata oladi. Bu erda hiyla -nayrang bor, biz sensordan doimiy ravishda oxirgi imo -ishorani so'ramaymiz. Kengash imo -ishora topilgan uzilish orqali "ping" qilish qobiliyatiga ega.

- neopixelga o'xshash kutubxonani o'z ichiga oladi

- kutubxonani uzilish pimi va uzilish bayrog'i deb e'lon qiling

#APDS9960_INT 2 ni aniqlang

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

- kutubxonani ishga tushirish, odatda sozlash funktsiyasi ichida

bo'sh o'rnatish ()

{ # uzilish pinini INPUT deb e'lon qiling va unga pinMode funktsiyasini biriktiring (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (rost)) {Serial.println ("APDS-9960 boshlanishi tugallandi"); } else {Serial.println ("APDS-9960 init paytida biror narsa noto'g'ri ketdi!"); } # boshqa narsalarni boshlashi mumkin)

- uzilish funktsiyasini aniqlang, bu erda biz faqat bayroqni o'rnatamiz

void interruptRoutine () {

isr_flag = 1; }

- loop funktsiyasi ichida imo -ishoraning aniqlanganligini tekshirish uchun bayroqni vaqti -vaqti bilan tekshirib turing

bo'sh halqa ()

{ # agar bayroqni tekshiring (isr_flag == 1) { # agar bayroq o'rnatilgan bo'lsa, uzilishni olib tashlang, handleGesture () funktsiyasi # ichida kerakli ishlovni bajaring va keyin bayroqni o'rnating va uzilish detachInterrupt (0) ni qayta o'rnating; handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } Bu erda yana # ta kod bo'lishi mumkin}

- handleGesture () funktsiyasini aniqlang, bu erda biz oxirgi imo -ishorani so'rashimiz mumkin

void handleGesture () {

# agar qaytish mumkin bo'lmasa, bu faqat xavfsiz tekshirish, agar (! apds.isGestureAvailable ()) {return; } # oxirgi imo -ishorani o'qiydi, ma'lum bo'lganlar bilan taqqoslaydi va xabar almashishni chop etadi (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); tanaffus; holat DIR_DOWN: Serial.println ("DOWN"); tanaffus; holat DIR_LEFT: Serial.println ("LEFT"); tanaffus; holat DIR_RIGHT: Serial.println ("O'ng"); tanaffus; holat DIR_FAR: Serial.println ("FAR"); tanaffus; }}

Keling, butun kodni amalda ko'rib chiqaylik:

Shunday qilib, men imo -ishoralar sensori va neopixel halqasining asosiy API -ni tushuntirdim, endi hamma narsani yig'amiz:

Algoritm quyidagicha ishlaydi:

- kutubxonalarni ishga tushirish (yuqoridagi kodga qarang)

- "ledStates" deb nomlangan yorug'lik intensivligini yaratish. Bu qatorda 150 dan 2 gacha kamayish tartibida joylashtirilgan 24 ta yorug'lik intensivligi bo'ladi

- asosiy tsikl ichida uzilish pimi o'zgartirilganligini tekshiring, agar shunday bo'lsa, LEDning animatsiyasi yoki rangini o'zgartirish vaqti keldi

- "handleGesture ()" funktsiyasi oxirgi imo -ishorani tekshiradi va "toggleColor" funktsiyasini UP -DOWN imo -ishoralari uchun chaqiradi yoki LEFT - O'ng imo -ishoralar uchun "ledDirection" global o'zgaruvchisini o'rnatadi.

- "toggleColor ()" funktsiyasi "colorSelection" nomli global o'zgaruvchini 0, 1, 2 qiymatlaridan biri bilan o'zgartiradi.

- shuningdek, asosiy tsikl funktsiyasi ichida "animateLeds ();" deb nomlangan boshqa funksiya. deyiladi. Bu funksiya 100 millisekund o'tib ketmaganligini tekshiradi va agar shunday bo'lsa, "rotateLeds ()" funksiyasi yordamida LEDlarni aylantiradi va keyin ularni qayta chizadi.

- "rotateLeds ()" "intermediateLedStates" deb nomlangan boshqa qator yordamida LEDlarni oldinga yoki orqaga "aylantiradi".

Aylanish "effekti" quyidagicha bo'ladi:

# ishga tushirilgandan keyin

{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 () yana chaqiriladi {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # va hokazo

Buning uchun birinchi navbatda yangi massiv yaratiladi va yangi pozitsiyalarga eski LED intensivligi ko'chiriladi (pozitsiyani oshirish yoki kamaytirish). Shundan so'ng, u "ledStates" qatorini "intermediateLedStates" bilan qayta yozadi, shuning uchun jarayon yana 100 millisekunddan keyin davom etadi.

#"SparkFun_APDS9960.h" ni qo'shing

#"Adafruit_NeoPixel.h" ni qo'shing

#clude "Wire.h" #NEOPIXED_CONTROL_PIN 6 ni belgilang #NUM_LEDSni aniqlang 24 #APDS9960_INT 2 ni aniqlang #LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel tasmasi = Adafruit_NeOPE_PEL_NEPE_P_N_ SparkFun_APDS9960 apds = SparkFun_APDS9960 (); imzosiz uzoq lastLedChangeTime = 0; qisqa ledDirection = 0; qisqa rangSelektsiya = 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 ("Dastur boshlandi"); strip.begin (); pinMod (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (rost)) {Serial.println ("APDS-9960 boshlanishi tugallandi"); } else {Serial.println ("APDS-9960 init paytida biror narsa noto'g'ri ketdi!"); } lastLedChangeTime = millis (); Serial.println ("Muvaffaqiyatli ishga tushirish"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * Bu APDS9960 sensori imo -ishoralarini boshqaradi * Yuqoriga va pastga imo -ishoralar toggleColor funktsiyasini chaqiradi * Chap va O'ng imo -ishoralar asosiy animatsiyani o'zgartiradi * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); tanaffus; holat DIR_DOWN: Serial.println ("DOWN"); toggleColor (); tanaffus; holat DIR_LEFT: ledDirection = 1; Serial.println ("SOL"); tanaffus; holat DIR_RIGHT: ledDirection = -1; Serial.println ("O'ng"); tanaffus; holat DIR_FAR: ledDirection = 0; Serial.println ("FAR"); tanaffus; }} / ** * Joriy LEDlar rangini o'zgartirish * Har safar bu funksiya chaqirilganda LEDlar holati o'zgaradi * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } if if (colorSelection == 1) {colorSelection = 2; } boshqa {colorSelection = 0; }} / ** * Animatsiya LED_SPEED_STEP_INTERVAL millisdan keyin ishlaydi * Avval rotateLeds funktsiyasi chaqiriladi, so'ngra ledi ranglari api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {qaytish yordamida qaytariladi.; } rotateLeds (); uchun (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates ))); strip.show (); } lastLedChangeTime = millis (); } /** * "intermediateLedStates" ikkilamchi qatoridan foydalanib, yorug'lik intensivligi jonlanadi * Avval "ledStates" qiymatlari "intermediateLedStates" ga ko'chiriladi, shunday qilib * "ledStates" qatorini {100, 80, 60, 0, 0, 0} va ledDirection 1 * dir, keyin bu funksiya "ledStates" deb nomlanganidan keyin {0, 100, 80, 60, 0, 0} aylantirish effektini simulyatsiya qiladi */ void rotateLeds () {bayt intermediateLedStates [NUM_LEDS]; uchun (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } uchun (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } boshqa {intermediateLedStates [i + 1] = ledStates ; }} boshqa {agar (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } boshqa {intermediateLedStates [i - 1] = ledStates ; }}} uchun (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int intensivligi) {switch (colorSelection) {0 holat: qaytish chizig'i. Color (intensivlik, 0, 0); 1 -holat: qaytish chizig'i. Rang (0, intensivlik, 0); standart: qaytish chizig'i. Color (0, 0, intensivlik); }}

Umid qilamanki, bu sizga yoqdi, siz menga savollar berish uchun sharhlar bo'limidan foydalanishingiz mumkin.

Tavsiya: