Sisukord:

Neopikseli LED -rõnga juhtimine žestianduriga: 3 sammu (piltidega)
Neopikseli LED -rõnga juhtimine žestianduriga: 3 sammu (piltidega)

Video: Neopikseli LED -rõnga juhtimine žestianduriga: 3 sammu (piltidega)

Video: Neopikseli LED -rõnga juhtimine žestianduriga: 3 sammu (piltidega)
Video: Marlin Firmware 2.0.x Explained 2024, November
Anonim
Image
Image
Kokkupanek ja üleslaadimine
Kokkupanek ja üleslaadimine

Selles õpetuses mängime žestianduri (APDS-9960) ja neopikselrõngaga, et õppida, kuidas neid mõlemat Arduino UNO abil kombineerida.

Lõpptoode reageerib vasakule -paremale suunatud žestidele, animeerides LED -i liikumist paremale või vasakule, ja üles -alla žestidele, muutes LED -ide värvi.

Järgmistes sammudes saate lühidalt ülevaate osade loendist ja komponentide ühendamisest. Ja siis vaatame koodi samm -sammult üle, et teada saada, kuidas see toimib.

Samm: komponendid

1. Arduino UNO

2. usb kaabel

3. APDS9960 žestiandur (https://www.sparkfun.com/products/12787)

4. 24 led neopixel led ring (https://www.adafruit.com/product/1586)

5. mees-naine, mees-mees leivaplaadi kaablid

6. leivalaud

7. 5 V toiteallikas LED -rõnga jaoks (kasutan 4 patareiga akut)

8. Neopikselrõnga leivaplaadile kinnitamiseks peate selle külge jootma kolm isast tihvti: GND, PWR ja juhtnõel. Selleks vajate jootekolvi ja voolu

Peamised komponendid on siin žestiandur APDS-9960 ja 24 neopikselrõngas. Soovi korral saate vahetada erinevaid arduinosid, USB -kaablite toiteallikaid ja leivaplaate.

Samm: kokkupanek ja üleslaadimine

Kokkupanek

Enne alustamist veenduge, et teie laual oleksid kõik komponendid. Meil on mõned toredad sammud, mida järgida:). Lisasin ka Fritzingi skemaatika pildina ja ka fritzing formaadis.

1. Jootke 3 isast tihvti neopikselrõnga külge (GND, PWR, kontrollnõel)

2. kinnitage neopikselrõngas leivalaua külge

3. kinnitage APDS9960 andur leivalaua külge

4. ühendage alused: aku, arduino UNO, APDS9960 ja neopixel leivaplaadi maapinnaga

5. ühendage toide: arduino UNO 3V APDS9960 toitepistikuga, neopiksel akuga

6. ühendage neopikseli juhttihvt arduino D6 tihvtiga

7. ühendage APDS9960 SDA ja SCL vastavalt A4 ja A5 -ga

8. ühendage APDS9960 katkestusnõel arduino D2 -ga

Koodi üleslaadimine

Kõigepealt peate alla laadima ja installima vajalikud arduino teegid:

1. Neopixeli rõngasteek:

2. Liigutusandurite kogu:

Kui te ei tea, kuidas arduino raamatukogusid installida, vaadake seda õpetust.

Pärast ülaltoodud teekide allalaadimist ja installimist saate kloonida või alla laadida minu arduino hoidla, mis asub siin: https://github.com/danionescu0/arduino, ja me kasutame seda visandit: https://github.com/danionescu0 /arduino/puu/master/projektid/neopixel_ring_gestures

Järgmises osas lisan koodi otse sellesse õpetusse, nii et kui soovite, saate selle sealt kopeerida ja kleepida.

Lõpuks ühendage arduino arvuti USB -kaabli abil, pange 1,5 V patareid akupakki ja laadige eskiis üles arduino.

3. samm: kuidas see toimib?

Selles viimases osas õpime, kuidas neid komponente omavahel kombineeritakse, kuidas nende teeke kasutada ja kuidas olen oma koodi üles ehitanud:

Kõigepealt vaatame kiiresti läbi anduri ja kasutatavate neopikseliteegi API meetodite

1. Neopixeli API adafruitist

Sellest raamatukogust kasutame meetodeid, mis juhivad üksikute LED -ide värvi ja rakendavad neid

- kaasa raamatukogu:

#kaasake

- kuulutada raamatukogu

#define NEOPIXED_CONTROL_PIN 6

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

- initsialiseerida

#tüüpiliselt seadistusploki sees

void setup () {strip.begin (); # võib -olla on siin muid asju #…. }

- süttige üksikud pikslid ja seejärel rakendage ribale kõik muudatused (renderdage see omamoodi)

# seadistage piksel 0 punaseks

strip.setPixelColor (0, riba. Värv (255, 0, 0)); # seadistage piksel 1 roheliseks ribaks.setPixelColor (1, riba. Värv (0, 255, 0)); # seadistage piksel 2 siniseks ribaks.setPixelColor (2, riba. Värv (0, 0 255)); strip.show ();

2. APDS 9960 žestiandur

Sellest raamatukogust kasutame funktsiooni "lugemisžest". See funktsioon suudab eristada vasak-parem, üles-alla ja lähedal-käske. Siin on trikk, me ei hakka andurilt pidevalt küsima viimast tajutavat žesti. Tahvlil on võimalus "pingutada" katkestuse kaudu, et žest on leitud.

- lisada raamatukogu, sarnaselt neopikseliga

- kuulutada raamatukogu katkestusnupuks ja katkestuslipuks

#define APDS9960_INT 2

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

- teegi initsialiseerimine, tavaliselt seadistusfunktsiooni sees

tühine seadistus ()

{ # kuulutage katkestusnupp sisendiks ja lisage sellele funktsioon pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 initsialiseerimine lõpetatud"); } else {Serial.println ("Midagi läks valesti APDS-9960 algatamise ajal!"); } # initsialiseeri muid asju võib -olla}

- määratle katkestusfunktsioon, siin määrame ainult lipu

void interruptRoutine () {

isr_flag = 1; }

- silmusefunktsiooni sees kontrollige perioodiliselt lippu, et näha, kas žest on tuvastatud

tühine tsükkel ()

{ # kontrollige lippu, kui (isr_flag == 1) { # kui lipp on seatud, eemaldage katkestus, tehke vajalik käsk töötlemisel handleGesture () funktsiooni # sees ja seejärel lähtestage lipp ning kinnitage uuesti katkestus detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRutine, FALLING); } # ehk mõni muu kood siin}

- define handleGesture () funktsioon, kus saame küsida viimast žesti

void handleGesture () {

# kui ükski žest pole kättesaadav tagastamine, on see ainult ohutu kontroll, kas (! apds.isGestureAvailable ()) {return; } # loeb viimast žesti, võrdleb teadaolevatega ja prindib sõnumilüliti (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); murda; juhtum DIR_DOWN: Serial.println ("DOWN"); murda; juhtum DIR_LEFT: Serial.println ("LEFT"); murda; juhtum DIR_RIGHT: Serial.println ("RIGHT"); murda; juhtum DIR_FAR: Serial.println ("FAR"); murda; }}

Nüüd vaatame kogu koodi tegevuses:

Nii et olen selgitanud žestianduri baas -API -d ja neopikselrõngast, paneme nüüd asjad kokku:

Algoritm töötab järgmiselt:

- initsialiseerige raamatukogud (vt ülaltoodud koodi)

- looge led -intensiivsuste massiiv, mida nimetatakse "ledStates". See massiiv sisaldab 24 led -intensiivsust, mis on paigutatud kahaneval viisil 150 -lt 2 -le

- kontrollige põhiahelas, kas katkestusnõela on muudetud, kui on aeg muuta LED -i animatsiooni või värvi

- funktsioon "handleGesture ()" kontrollib viimast žesti ja kutsub üles -alla liigutuste jaoks funktsiooni "toggleColor" või määrab vasakule -paremale suunatud liigutuste jaoks globaalse muutuja "ledDirection"

- funktsioon "toggleColor ()" muudab lihtsalt globaalse muutuja nimega "colorSelection" ühe väärtusega 0, 1, 2

- ka peasilmuse funktsioonis veel üks funktsioon nimega "animateLeds ();" kutsutakse. See funktsioon kontrollib, kas 100 millisekundit on möödunud, ja kui jah, siis pöörab LED -e funktsiooni "rotateLeds ()" abil ja seejärel joonistab need uuesti

- "rotateLeds ()" "pöörab" LED -e edasi või tagasi, kasutades teist massiivi nimega "intermediateLedStates".

Pöörlemise "efekt" näeb välja selline:

# pärast lähtestamist

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # pärast rotateLeds () nimetatakse {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # pärast rotateLeds () kutsutakse uuesti {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # ja nii edasi

Selleks loob esmalt uue massiivi ja kopeerib uute positsioonide vanad LED -intensiivsused (suurendage positsiooni või vähendage seda). Pärast seda kirjutab see masina "ledStates" üle "intermediateLedStates", nii et protsess jätkub veel 100 millisekundi pärast.

#include "SparkFun_APDS9960.h"

#include "Adafruit_NeoPixel.h"

#sisalda "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #defineeri NUM_LEDS 24 #define APDS9960_INT 2 #define LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOX SparkFun_APDS9960 apds = SparkFun_APDS9960 (); allkirjastamata kaua lastLedChangeTime = 0; lühike ledDirection = 0; lühike värvivalik = 0; bait 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 ("Programm käivitati"); riba.algus (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 initsialiseerimine lõpetatud"); } else {Serial.println ("Midagi läks valesti APDS-9960 algatamise ajal!"); } lastLedChangeTime = millis (); Serial.println ("Init edukalt"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRutine, FALLING); } animateLeds (); } tühine interruptRoutine () {isr_flag = 1; } / ** * See tegeleb APDS9960 anduri liigutustega * Üles ja alla liigutused kutsuvad toggle Värvifunktsioon * Vasak ja parem liigutused muudavad LED -animatsiooni * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); murda; juhtum DIR_DOWN: Serial.println ("DOWN"); toggleColor (); murda; juhtum DIR_LEFT: ledDirection = 1; Serial.println ("LEFT"); murda; juhtum DIR_RIGHT: ledDirection = -1; Serial.println ("ÕIGE"); murda; juhtum DIR_FAR: ledDirection = 0; Serial.println ("FAR"); murda; }} / ** * Muuda praeguse LED -i värvi * Iga kord, kui seda funktsiooni kutsutakse, muudab LED -i olekut * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Animatsioon käivitatakse pärast LED_SPEED_STEP_INTERVAL millis * Esmalt kutsutakse funktsioon rotateLeds, seejärel määratakse ledide värvid riba abil api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return; } rotateLeds (); jaoks (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates )); strip.show (); } lastLedChangeTime = millis (); /**, 0, 0} ja ledDirection on 1 *, siis pärast selle funktsiooni nimetamist "ledStates" on massiiv {0, 100, 80, 60, 0, 0}, mis simuleerib pöörlemisefekti */ void rotateLeds () {baiti intermediateLedStates [NUM_LEDS]; jaoks (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } jaoks (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } else {intermediateLedStates [i + 1] = ledStates ; }} else {if (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } else {intermediateLedStates [i - 1] = ledStates ; }}} jaoks (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int intensiivsus) {switch (colorSelection) {case 0: return strip. Color (intensiivsus, 0, 0); juhtum 1: tagastamisriba. Värv (0, intensiivsus, 0); vaikimisi: tagastusriba. Värv (0, 0, intensiivsus); }}

Loodan, et teile meeldis see, saate kommentaaride jaotises mulle küsimusi esitada.

Soovitan: