Sadržaj:

Upravljanje neopikselnim LED prstenom senzorom gesta: 3 koraka (sa slikama)
Upravljanje neopikselnim LED prstenom senzorom gesta: 3 koraka (sa slikama)

Video: Upravljanje neopikselnim LED prstenom senzorom gesta: 3 koraka (sa slikama)

Video: Upravljanje neopikselnim LED prstenom senzorom gesta: 3 koraka (sa slikama)
Video: Moja omiljena veličina Pe***a 2024, Studeni
Anonim
Image
Image
Montaža i prijenos
Montaža i prijenos

U ovom vodiču poigrat ćemo se sa senzorom gesta (APDS-9960) i prstenom od neopiksela kako bismo naučili kako ih kombinirati pomoću Arduino UNO-a.

Krajnji proizvod će reagirati na geste lijevo -desno animirajući kretanje LED -a desno ili lijevo, a na geste gore -dolje promjenom boje LED dioda.

U sljedećim koracima kratko ćete pregledati popis dijelova i kako spojiti komponente. Zatim ćemo pregledati kod korak po korak kako bismo saznali kako radi.

Korak 1: Komponente

1. Arduino UNO

2. USB kabel

3. APDS9960 senzor gesta (https://www.sparkfun.com/products/12787)

4. 24 LED neopixel LED prsten (https://www.adafruit.com/product/1586)

5. muški-ženski, muški-muški kabeli za matičnu ploču

6. matična ploča

7. Napajanje od 5 V za LED prsten (koristim 4 baterije na poleđini)

8. Za pričvršćivanje neopikselnog prstena na matičnu ploču trebate na njega lemiti tri muška igla: GND, PWR i kontrolni pin. Za to će vam trebati lemilica i fluks

Ovdje su glavne komponente senzor gesta APDS-9960 i prsten od 24 neopiksela. Po želji možete mijenjati različite arduine, USB kablove i napajanje.

Korak 2: Montaža i prijenos

Skupština

Prije nego počnete, provjerite imate li sve komponente na stolu. Morat ćemo slijediti neke lijepe korake:). Također sam priložio Fritzing shemu kao sliku i također u formatu fritzinga.

1. Lemite 3 muška pina na neopikselni prsten (GND, PWR, kontrolni pin)

2. pričvrstite prsten neopiksela na matičnu ploču

3. pričvrstite senzor APDS9960 na ploču

4. spojite uzemljenje: bateriju, arduino UNO, APDS9960 i neopixel na masu matične ploče

5. spojite napajanje: arduino UNO 3V na utičnicu za napajanje APDS9960, neopixel na napajanje iz baterije

6. spojite kontrolni pin neopiksela na pin arduino D6

7. spojite SDA i SCL APDS9960 na A4 odnosno A5

8. spojite prekidač APDS9960 na arduino D2

Prijenos koda

Prije svega morate preuzeti i instalirati potrebne arduino knjižnice:

1. Knjižnica prstenova Neopixel:

2. Knjižnica senzora gesta:

Ako ne znate kako instalirati arduino knjižnice, pogledajte ovaj vodič.

Nakon što preuzmete i instalirate gore navedene knjižnice, možete klonirati ili preuzeti moje arduino spremište koje se nalazi ovdje: https://github.com/danionescu0/arduino, a mi ćemo koristiti ovu skicu: https://github.com/danionescu0 /arduino/stablo/master/projekti/neopixel_ring_gestures

U sljedećem odjeljku ugradit ću kôd izravno u ovaj vodič, pa ako želite možete ga kopirati i zalijepiti odatle.

Na kraju spojite arduino računalo pomoću USB kabela, umetnite baterije od 1,5 V u bateriju i prenesite skicu u arduino.

Korak 3: Kako to funkcionira?

U ovom posljednjem dijelu naučit ćemo kako se ove komponente kombiniraju zajedno, kako koristiti njihove biblioteke i kako sam strukturirao svoj kôd:

Prvo pogledajmo senzor i API metode biblioteke neopiksela koje ćemo koristiti

1. Neopixel API iz adafruta

Iz ove biblioteke koristit ćemo metode za kontrolu boje pojedinih LED dioda i njihovu primjenu

- uključiti knjižnicu:

#uključi

- proglasiti knjižnicu

#define NEOPIXED_CONTROL_PIN 6

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

- inicijalizirati

#tipično unutar instalacijskog bloka

void setup () {strip.begin (); # možda ovdje ima još nekih stvari … … }

- osvijetlite pojedinačne piksele, a zatim primijenite sve izmjene na traku (iscrtajte je na neki način)

# postavite piksel 0 da bude crven

strip.setPixelColor (0, strip. Color (255, 0, 0)); # postavite piksel 1 da bude zelena traka.setPixelColor (1, strip. Color (0, 255, 0)); # postavite piksel 2 da bude plava traka.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. APDS 9960 senzor gesta

Iz ove biblioteke koristit ćemo funkciju "čitanje gesta". Ova će funkcija moći razlikovati naredbe lijevo-desno, gore-dolje, blizu. Ovdje postoji trik, nećemo stalno pitati senzor za posljednju opaženu gestu. Ploča ima mogućnost "pinganja" kroz prekid da je pronađena gesta.

- uključi knjižnicu, slično neopikselu

- proglasi knjižnicu prekidnim pinom i zastavicom prekida

#define APDS9960_INT 2

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

- inicijalizirati knjižnicu, obično unutar funkcije postavljanja

void setup ()

{ # dezinficirajte pin prekida kao INPUT i priključite mu funkciju pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Inicijalizacija APDS-9960 dovršena"); } else {Serial.println ("Nešto je pošlo po zlu tijekom pokretanja APDS-9960!"); } # inicijalizacija drugih stvari možda}

- definirajte funkciju prekida, ovdje ćemo postaviti samo zastavicu

void interruptRoutine () {

isr_flag = 1; }

- unutar funkcije petlje povremeno provjeravajte zastavicu kako biste vidjeli je li gesta otkrivena

void loop ()

{ # provjerite zastavicu if (isr_flag == 1) { # ako je zastava postavljena, uklonite prekid, izvršite potrebnu obradu unutar handleGesture () funkcije #, a zatim poništite zastavicu i ponovno spojite prekid detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # ovdje možda još neki kôd}

- definirajte handleGesture () funkciju gdje možemo zatražiti posljednju gestu

void handleGesture () {

# ako nijedna gesta nije dostupna, ovo je samo sigurna provjera je li (! apds.isGestureAvailable ()) {return; } # čita posljednju gestu, uspoređuje se s poznatim i ispisuje prekidač za poruku (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); pauza; slučaj DIR_DOWN: Serial.println ("DOLJE"); pauza; slučaj DIR_LEFT: Serial.println ("LIJEVO"); pauza; slučaj DIR_RIGHT: Serial.println ("DESNO"); pauza; slučaj DIR_FAR: Serial.println ("FAR"); pauza; }}

Pogledajmo sada cijeli kôd na djelu:

Objasnio sam osnovni API senzora gesta i neopikselnog prstena, ajmo sada spojiti stvari:

Algoritam radi ovako:

- inicijalizirati knjižnice (vidi gornji kod)

- stvoriti niz LED intenziteta pod nazivom "ledStates". Ovaj niz će sadržavati 24 LED intenziteta koji su raspoređeni silazno od 150 do 2

- unutar glavne petlje provjerite je li prekidni pin promijenjen ako je tako, vrijeme je za promjenu animacije ili boje LED -a

- funkcija "handleGesture ()" provjerava posljednju gestu i poziva funkciju "toggleColor" za geste GORE -DOLJE ili postavlja globalnu varijablu "ledDirection" za geste LIJEVO - DESNO

- funkcija "toggleColor ()" jednostavno mijenja globalnu varijablu pod nazivom "colorSelection" s jednom od vrijednosti 0, 1, 2

- također unutar funkcije glavne petlje druga funkcija pod nazivom "animateLeds ();" Zove se. Ova funkcija provjerava je li prošlo 100 milisekundi i u tom slučaju rotira LED diode pomoću funkcije "rotateLeds ()", a zatim ih ponovno iscrtava

- "rotateLeds ()" će "rotirati" LED diode naprijed ili natrag pomoću drugog niza koji se naziva "intermediateLedStates".

"Učinak" rotacije izgledat će ovako:

# nakon inicijalizacije

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # nakon rotateLeds () naziva se {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # nakon što se rotateLeds () ponovno pozove {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # i tako dalje

Jer ovo prvo stvara novi niz i kopira stare intenzitete LED dioda na novim pozicijama (povećanje položaja ili njegovo smanjenje). Nakon toga prepisuje niz "ledStates" s "intermediateLedStates" pa će se proces nastaviti nakon još 100 milisekundi.

#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, NEOPOZED_; NEOPIX_); SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned long lastLedChangeTime = 0; kratki ledDirection = 0; kratki izbor boja = 0; bajt 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 ("Program je pokrenut"); strip.begin (); pinMode (APDS9960_INT, ULAZ); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Inicijalizacija APDS-9960 dovršena"); } else {Serial.println ("Nešto je pošlo po zlu tijekom pokretanja APDS-9960!"); } lastLedChangeTime = millis (); Serial.println ("Init uspješno"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * Ovo će obraditi geste s senzora APDS9960 * Geste gore i dolje će pozvati funkciju toggleColor * Lijeve i desne geste promijenit će LED animaciju * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } prekidač (apds.readGesture ()) {slučaj DIR_UP: Serial.println ("GORE"); toggleColor (); pauza; slučaj DIR_DOWN: Serial.println ("DOLJE"); toggleColor (); pauza; slučaj DIR_LEFT: ledDirection = 1; Serial.println ("LIJEVO"); pauza; slučaj DIR_RIGHT: ledDirection = -1; Serial.println ("DESNO"); pauza; slučaj DIR_FAR: ledDirection = 0; Serial.println ("FAR"); pauza; }} / ** * Promijeni trenutnu boju LED dioda * Svaki put kada se pozove ova funkcija promijenit će stanje LED dioda * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Animacija će se pokrenuti nakon LED_SPEED_STEP_INTERVAL millis * Prvo se pozove funkcija rotateLeds, zatim se boje LED dioda postave pomoću trake api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return; } rotateLeds (); za (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates )); strip.show (); } lastLedChangeTime = millis (); } /** * Korištenjem sekundarnog niza "intermediateLedStates", intenziteti LED dioda se animiraju * Prvo se vrijednosti iz "ledStates" kopiraju na "intermediateLedStates", tako da * idemo prema nizu "ledStates" {100, 80, 60, 0, 0, 0} i ledDirection je 1 *, a nakon što se ova funkcija pozove "ledStates" niz je {0, 100, 80, 60, 0, 0} simulirajući efekt rotacije */ void rotateLeds () {byte intermediateLedStates [NUM_LEDS]; za (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } za (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 ; }}} za (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int intenzitet) {switch (colorSelection) {case 0: return strip. Color (intenzitet, 0, 0); slučaj 1: povratna traka. Boja (0, intenzitet, 0); zadano: povratna traka. Boja (0, 0, intenzitet); }}

Nadam se da vam se ovo dopalo, možete koristiti pitanja u odjeljku za komentare.

Preporučeni: