Turinys:

Neopikselių LED žiedo valdymas gesto jutikliu: 3 žingsniai (su nuotraukomis)
Neopikselių LED žiedo valdymas gesto jutikliu: 3 žingsniai (su nuotraukomis)

Video: Neopikselių LED žiedo valdymas gesto jutikliu: 3 žingsniai (su nuotraukomis)

Video: Neopikselių LED žiedo valdymas gesto jutikliu: 3 žingsniai (su nuotraukomis)
Video: Žiedinė lempa su Алиэкспресс / Išpakavimas Apžvalga ir Testas 2024, Lapkritis
Anonim
Image
Image
Surinkimas ir įkėlimas
Surinkimas ir įkėlimas

Šioje pamokoje mes žaisime su gesto jutikliu (APDS-9960) ir neopikseliniu žiedu, kad sužinotume, kaip juos abu sujungti naudojant „Arduino UNO“.

Galutinis produktas reaguos į gestus iš kairės į dešinę, pagyvindamas judėjimą į dešinę arba į kairę, ir į aukštyn nukreiptus gestus, pakeisdamas šviesos diodų spalvą.

Tolesniuose žingsniuose trumpai apžvelgsite dalių sąrašą ir kaip prijungti komponentus. Tada žingsnis po žingsnio peržiūrėsime kodą, kad sužinotume, kaip jis veikia.

1 žingsnis: komponentai

1. Arduino UNO

2. usb kabelis

3. APDS9960 gestų jutiklis (https://www.sparkfun.com/products/12787)

4. 24 LED neopikselinis žiedas (https://www.adafruit.com/product/1586)

5. vyriškos ir moteriškos lyties kabeliai

6. duonos lenta

7. 5 V maitinimo šaltinis, skirtas LED žiedui (aš naudoju 4 akumuliatorių)

8. Norėdami pritvirtinti neopikselio žiedą prie duonos lentos, prie jo turėsite lituoti tris kaiščius: GND, PWR ir valdymo kaištį. Tam jums reikės lituoklio ir srauto

Pagrindiniai komponentai yra APDS-9960 gestų jutiklis ir 24 neopikselių žiedas. Jei norite, galite perjungti skirtingus arduino, USB kabelių maitinimo šaltinius ir maitinimo plokštes.

2 žingsnis: Surinkimas ir įkėlimas

Surinkimas

Prieš pradėdami įsitikinkite, kad ant stalo yra visi komponentai. Turėsime atlikti keletą gražių žingsnių:). Aš taip pat pridėjau „Fritzing“schemą kaip paveikslėlį ir taip pat fritzing formatu.

1. Lituokite 3 kaiščius prie neopikselio žiedo (GND, PWR, valdymo kaištis)

2. pritvirtinkite neopikselio žiedą prie duonos lentos

3. prie duonos lentos pritvirtinkite jutiklį APDS9960

4. Prijunkite pagrindą: akumuliatorių, arduino UNO, APDS9960 ir neopikselį prie duonos lentos

5. prijunkite maitinimą: arduino UNO 3V prie APDS9960 maitinimo kaiščio, neopikselis prie akumuliatoriaus

6. prijunkite neopikselių valdymo kaištį prie arduino D6 kaiščio

7. atitinkamai prijunkite APDS9960 SDA ir SCL prie A4 ir A5

8. prijunkite APDS9960 pertraukimo kaištį prie arduino D2

Įkelti kodą

Pirmiausia turėsite atsisiųsti ir įdiegti reikalingas „arduino“bibliotekas:

1. Neopikselių žiedų biblioteka:

2. Gestų jutiklių biblioteka:

Jei nežinote, kaip įdiegti „arduino“bibliotekas, peržiūrėkite šią mokymo programą.

Atsisiuntę ir įdiegę aukščiau esančias bibliotekas, galite klonuoti arba atsisiųsti mano arduino saugyklą, esančią čia: https://github.com/danionescu0/arduino, ir mes naudosime šį eskizą: https://github.com/danionescu0 /arduino/tree/master/projektai/neopixel_ring_gestures

Kitame skyriuje įterpsiu kodą tiesiai į šią mokymo programą, taigi, jei jums patinka, galite nukopijuoti ir įklijuoti jį iš ten.

Galiausiai prijunkite arduino prie kompiuterio naudodami USB kabelį, įdėkite 1,5 V baterijas į akumuliatorių ir įkelkite eskizą į arduino.

3 žingsnis: kaip tai veikia?

Šioje paskutinėje dalyje sužinosime, kaip šie komponentai yra derinami kartu, kaip naudotis jų bibliotekomis ir kaip sukūriau savo kodą:

Pirmiausia greitai pažvelkime į jutiklį ir neopikselių bibliotekos API metodus, kuriuos naudosime

1. Neopixel API iš adafruit

Iš šios bibliotekos naudosime metodus, kurie valdo atskirų šviesos diodų spalvas ir jas taiko

- įtraukite biblioteką:

#įtraukti

- deklaruoti biblioteką

#define NEOPIXED_CONTROL_PIN 6

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

- inicijuoti

#tipiškai sąrankos bloko viduje

void setup () {strip.begin (); # galbūt čia yra kitų dalykų #…. }

- apšvieskite atskirus pikselius, tada pritaikykite visus juostos pakeitimus (tam tikru būdu padarykite)

# nustatykite tašką 0 raudoną

strip.setPixelColor (0, strip. Color (255, 0, 0)); # nustatykite 1 pikselį kaip žalią juostelę.setPixelColor (1, strip. Color (0, 255, 0)); # nustatykite 2 pikselį kaip mėlyną juostelę.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. APDS 9960 gestų jutiklis

Iš šios bibliotekos naudosime funkciją „skaityti gestą“. Ši funkcija galės atskirti komandas kairėn į dešinę, aukštyn žemyn ir arti. Čia yra triukas, mes neketiname nuolat klausti jutiklio už paskutinį gestą. Lenta gali „pinginti“per pertrauką, kai buvo rastas gestas.

- įtraukite biblioteką, panašią į neopikselį

- paskelbti biblioteką pertraukimo kaiščiu ir pertraukos vėliava

#define APDS9960_INT 2

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

- inicijuoti biblioteką, paprastai sąrankos funkcijos viduje

negaliojanti sąranka ()

{ # paskelbti nutraukimo kaištį kaip INPUT ir pridėti prie jo funkciją pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println („APDS-9960 inicializavimas baigtas“); } else {Serial.println ("Kažkas nepavyko per APDS-9960 init!"); } # galbūt inicijuokite kitus dalykus}

- apibrėžkite pertraukimo funkciją, čia nustatysime tik vėliavą

void interruptRoutine () {

isr_flag = 1; }

- ciklo funkcijos viduje periodiškai patikrinkite vėliavą, kad pamatytumėte gestą

tuštumos kilpa ()

{ # patikrinkite vėliavą, jei (isr_flag == 1) { # jei vėliava nustatyta, pašalinkite pertrauką, atlikite reikiamą apdorojimą „handleGesture ()“funkcijos viduje #, tada vėl nustatykite vėliavą ir vėl prijunkite pertraukos detachInterrupt (0); rankenaGestas (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # čia galbūt kitas kodas}

- apibrėžkite funkciją „handleGesture ()“, kur galime paprašyti paskutinio gesto

void handleGesture () {

# jei nėra jokių gestų, grąžinimas yra tik saugus patikrinimas, jei (! apds.isGestureAvailable ()) {return; } # skaito paskutinį gestą, lygina su žinomais ir spausdina pranešimo jungiklį (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); pertrauka; atvejis DIR_DOWN: Serial.println ("DOWN"); pertrauka; atvejis DIR_LEFT: Serial.println ("LEFT"); pertrauka; atvejis DIR_RIGHT: Serial.println ("RIGHT"); pertrauka; atvejis DIR_FAR: Serial.println ("FAR"); pertrauka; }}

Dabar pažiūrėkime, kaip veikia visas kodas:

Taigi aš paaiškinau gestų jutiklio ir neopikselių žiedo bazinę API, dabar sudėkime dalykus:

Algoritmas veikia taip:

- inicijuoti bibliotekas (žr. aukščiau esantį kodą)

- sukurkite LED intensyvumo masyvą, vadinamą „ledStates“. Šiame masyve bus 24 šviesos diodų intensyvumai, kurie yra išdėstyti mažėjančiu būdu nuo 150 iki 2

- pagrindinės kilpos viduje patikrinkite, ar pertraukimo kaištis buvo pakeistas, jei taip, laikas pakeisti LED animaciją ar spalvą

- funkcija „handleGesture ()“patikrina paskutinį gestą ir iškviečia funkciją „toggleColor“gestams aukštyn -žemyn arba nustato globalų kintamąjį „ledDirection“kairiesiems - dešiniams gestams

- funkcija „toggleColor ()“tiesiog pakeičia visuotinį kintamąjį pavadinimu „colorSelection“su viena iš reikšmių 0, 1, 2

- taip pat pagrindinės kilpos funkcijos viduje yra kita funkcija „animateLeds ()“; vadinamas. Ši funkcija patikrina, ar praėjo 100 milisekundžių, ir jei taip, ji pasuka šviesos diodus naudodami funkciją „rotateLeds ()“ir tada juos perbraižo

- „rotateLeds ()“„pasuks“šviesos diodus į priekį arba atgal, naudodami kitą masyvą, vadinamą „intermediateLedStates“.

Sukimosi „efektas“atrodys taip:

# po inicijavimo

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # po rotateLeds () vadinamas {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # po rotateLeds () vėl vadinamas {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # ir taip toliau

Tai pirmiausia sukuria naują masyvą ir nukopijuoja senus šviesos diodų intensyvumus naujose pozicijose (padidinkite poziciją arba sumažinkite ją). Po to jis perrašo „ledStates“masyvą su „intermediateLedStates“, todėl procesas tęsis dar po 100 milisekundžių.

#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 strip = Adafruit_NeoPixel (NUM_LEDS, NEOX SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned long lastLedChangeTime = 0; trumpas ledDirection = 0; short colorSelection = 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 („Programa paleista“); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println („APDS-9960 inicializavimas baigtas“); } else {Serial.println ("Kažkas nepavyko per APDS-9960 init!"); } lastLedChangeTime = milis (); Serial.println („Init sėkmingai“); } void loop () {if (isr_flag == 1) {detachInterrupt (0); rankenaGestas (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * Tai atliks gestus iš APDS9960 jutiklio * Aukštyn ir žemyn gestai iškvies perjungimo funkciją Spalvų funkcija * Gestai kairėn ir dešinėn pakeis animaciją * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } switch (apds.readGesture ()) {atvejis DIR_UP: Serial.println ("UP"); toggleColor (); pertrauka; atvejis DIR_DOWN: Serial.println ("DOWN"); toggleColor (); pertrauka; atvejis DIR_LEFT: ledDirection = 1; Serial.println ("LEFT"); pertrauka; atvejis DIR_RIGHT: ledDirection = -1; Serial.println („TEISINGAS“); pertrauka; atvejis DIR_FAR: ledDirection = 0; Serial.println („FAR“); pertrauka; }} / ** * Keisti dabartinę lempučių spalvą * Kiekvieną kartą iškvietus šią funkciją pasikeis lempučių būsena * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Animacija bus rodoma po LED_SPEED_STEP_INTERVAL milis * Pirmiausia iškviečiama funkcija rotateLeds, tada LED spalvos nustatomos naudojant juostelę 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 (); } /** * Naudojant antrinį masyvą „intermediateLedStates“, šviesos diodų intensyvumas animuojamas * Pirmiausia „ledStates“reikšmės nukopijuojamos į „intermediateLedStates“taip *, 0, 0} ir „ledDirection“yra 1 *, tada, kai ši funkcija vadinama „ledStates“, masyvas yra {0, 100, 80, 60, 0, 0}, imituojantis sukimosi efektą */ void rotateLeds () {baitas intermediateLedStates [NUM_LEDS]; už (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } for (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 ; }}} skirtas (int i = 0; i <NUM_LEDS; i ++) {ledStates = tarpinėsLedStates ; }} uint32_t getColor (int intensyvumas) {switch (colorSelection) {case 0: return strip. Color (intensyvumas, 0, 0); 1 atvejis: grąžinimo juosta. Spalva (0, intensyvumas, 0); numatytasis: grąžinimo juostelė. Spalva (0, 0, intensyvumas); }}

Tikiuosi, kad jums tai patiko, galite naudoti komentarų skiltį, kad užduotumėte man klausimų.

Rekomenduojamas: