Satura rādītājs:

Neopikselu LED gredzena vadīšana ar žestu sensoru: 3 soļi (ar attēliem)
Neopikselu LED gredzena vadīšana ar žestu sensoru: 3 soļi (ar attēliem)

Video: Neopikselu LED gredzena vadīšana ar žestu sensoru: 3 soļi (ar attēliem)

Video: Neopikselu LED gredzena vadīšana ar žestu sensoru: 3 soļi (ar attēliem)
Video: Сказ про тянку без глаз ► 2 Прохождение Fatal Frame (Project Zero) PS2 2024, Jūlijs
Anonim
Image
Image
Montāža un augšupielāde
Montāža un augšupielāde

Šajā apmācībā mēs spēlēsim ar žestu sensoru (APDS-9960) un neopikselu gredzenu, lai uzzinātu, kā tos abus apvienot, izmantojot Arduino UNO.

Galaprodukts reaģēs uz žestiem pa kreisi un pa labi, animējot gaismas kustību pa labi vai pa kreisi, un uz augšupvērstiem žestiem, mainot gaismas diožu krāsu.

Nākamajās darbībās jūs īsumā apskatīsit detaļu sarakstu un to, kā savienot komponentus. Un tad mēs soli pa solim pārskatīsim kodu, lai uzzinātu, kā tas darbojas.

1. darbība: sastāvdaļas

1. Arduino UNO

2. usb kabelis

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

4. 24 ledus neopikseļu gredzens (https://www.adafruit.com/product/1586)

5. vīriešu-sieviešu, vīriešu-vīriešu maizes dēļu kabeļi

6. maizes dēlis

7. 5 V barošanas avots LED gredzenam (es izmantoju 4 bateriju aizmuguri)

8. Lai piestiprinātu neopikseļu gredzenu pie maizes dēļa, pie tā jāpielodē trīs tapas: GND, PWR un vadības tapa. Šim nolūkam jums būs nepieciešams lodāmurs un plūsma

Šeit galvenie komponenti ir žestu sensors APDS-9960 un 24 neopikseļu gredzens. Jūs varat pārslēgt dažādus arduinos, USB kabeļu barošanas avotus un maizes dēļus, kā vēlaties.

2. darbība: montāža un augšupielāde

Montāža

Pirms darba sākšanas pārliecinieties, vai uz galda ir visas sastāvdaļas. Mums būs daži jauki soļi, kas jāievēro:). Es arī pievienoju Fritzing shematiku kā attēlu un arī fritzing formātā.

1. Lodēt 3 ārējās tapas pie neopikseļu gredzena (GND, PWR, vadības tapa)

2. piestipriniet neopikselu gredzenu pie maizes dēļa

3. pievienojiet APDS9960 sensoru pie maizes dēļa

4. pievienojiet pamatni: akumulatoru, arduino UNO, APDS9960 un neopikseli maizes dēļa zemei

5. pievienojiet strāvu: arduino UNO 3V līdz APDS9960 strāvas tapai, neopikselu - akumulatora jaudai

6. pievienojiet neopikselu vadības tapu arduino D6 tapai

7. savienojiet APDS9960 SDA un SCL attiecīgi ar A4 un A5

8. pievienojiet APDS9960 pārtraukšanas tapu arduino D2

Koda augšupielāde

Pirmkārt, jums būs jālejupielādē un jāinstalē nepieciešamās arduino bibliotēkas:

1. Neopikselu gredzenu bibliotēka:

2. Žestu sensoru bibliotēka:

Ja jūs nezināt, kā instalēt arduino bibliotēkas, skatiet šo apmācību.

Kad esat lejupielādējis un instalējis iepriekš minētās bibliotēkas, varat klonēt vai lejupielādēt manu arduino krātuvi, kas atrodas šeit: https://github.com/danionescu0/arduino, un mēs izmantosim šo skici: https://github.com/danionescu0 /arduino/tree/master/project/neopixel_ring_gestures

Nākamajā sadaļā es iegulšu kodu tieši šajā apmācībā, tāpēc, ja vēlaties, varat to nokopēt un ielīmēt no turienes.

Visbeidzot pievienojiet arduino datoram, izmantojot USB kabeli, ievietojiet 1,5 V baterijas akumulatorā un augšupielādējiet skici arduino.

3. darbība. Kā tas darbojas?

Šajā pēdējā daļā mēs uzzināsim, kā šie komponenti tiek apvienoti kopā, kā izmantot to bibliotēkas un kā esmu strukturējis savu kodu:

Vispirms ātri apskatīsim sensoru un izmantotās neopikselu bibliotēkas API metodes

1. Neopixel API no adafruit

No šīs bibliotēkas mēs izmantosim metodes, kas kontrolē atsevišķu LED krāsu un tās pielieto

- iekļaut bibliotēku:

#iekļaut

- pasludināt bibliotēku

#define NEOPIXED_CONTROL_PIN 6

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

- palaist

#rakstiski iestatīšanas bloka iekšpusē

void setup () {strip.begin (); # varbūt šeit ir citas lietas #…. }

- izgaismojiet atsevišķus pikseļus un pēc tam izmantojiet visas izmaiņas joslā (atveidojiet to savā veidā)

# iestatiet pikseli 0 sarkanu

strip.setPixelColor (0, strip. Color (255, 0, 0)); # iestatiet 1. pikseļu kā zaļu joslu. setPixelColor (1, sloksne. Krāsa (0, 255, 0)); # iestatiet 2. pikseļu kā zilu sloksni.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. APDS 9960 žestu sensors

No šīs bibliotēkas mēs izmantosim funkciju "lasīt žestu". Šī funkcija varēs atšķirt komandas no kreisās-labās, augšupvērstās un tuvās. Šeit ir triks, mēs nepārtraukti neprasīsim sensoram pēdējo uztverto žestu. Dēlis spēj “pingēt”, pārtraucot, ka ir atrasts žests.

- iekļaut bibliotēku, līdzīgi neopikselim

- pasludiniet bibliotēku par pārtraukuma tapu un pārtraukuma karodziņu

#define APDS9960_INT 2

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

- inicializējiet bibliotēku, parasti iestatīšanas funkcijā

anulēts iestatījums ()

{ # pasludiniet pārtraukuma tapu kā INPUT un pievienojiet tai funkciju pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 inicializācija pabeigta"); } else {Serial.println ("APDS-9960 init laikā radās problēma!"); } # inicializējiet citas lietas, iespējams}

- definējiet pārtraukšanas funkciju, šeit mēs iestatīsim tikai karodziņu

void interruptRoutine () {

isr_flag = 1; }

- cilpas funkcijas iekšpusē periodiski pārbaudiet karodziņu, lai redzētu, vai ir konstatēts žests

tukša cilpa ()

{ # pārbaudiet karodziņu, ja (isr_flag == 1) { # ja karogs ir iestatīts, noņemiet pārtraukumu, veiciet nepieciešamo apstrādi iekšā handleGesture () funkcija # un pēc tam atiestatiet karogu un atkārtoti pievienojiet pārtraukuma detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # varbūt kāds cits kods šeit}

- definējiet funkciju handleGesture (), kur mēs varam lūgt pēdējo žestu

void handleGesture () {

# ja nav pieejams žests, atgriešanās, tā ir tikai droša pārbaude, ja (! apds.isGestureAvailable ()) {return; } # nolasa pēdējo žestu, salīdzina ar zināmajiem un izdrukā ziņojumu slēdzi (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); pārtraukums; gadījums DIR_DOWN: Serial.println ("DOWN"); pārtraukums; gadījums DIR_LEFT: Serial.println ("LEFT"); pārtraukums; gadījums DIR_RIGHT: Serial.println ("RIGHT"); pārtraukums; gadījums DIR_FAR: Serial.println ("FAR"); pārtraukums; }}

Tagad apskatīsim visu kodu darbībā:

Tāpēc es esmu izskaidrojis žestu sensora un neopikselu gredzena bāzes API, tagad apkoposim lietas:

Algoritms darbojas šādi:

- inicializējiet bibliotēkas (skatiet kodu iepriekš)

- izveidojiet LED intensitātes masīvu, ko sauc par "ledStates". Šajā masīvā būs 24 gaismas intensitātes, kas sakārtotas dilstošā veidā no 150 līdz 2

- galvenās cilpas iekšpusē pārbaudiet, vai pārtraukuma tapa ir mainīta, ja ir pienācis laiks mainīt LED animāciju vai krāsu

- funkcija "handleGesture ()" pārbauda pēdējo žestu un izsauc funkciju "toggleColor" augšupvērstiem žestiem vai nosaka globālo mainīgo "ledDirection" žestiem pa kreisi - pa labi

- funkcija "toggleColor ()" vienkārši maina globālo mainīgo ar nosaukumu "colorSelection" ar vienu no vērtībām 0, 1, 2

- arī galvenās cilpas funkcijas iekšpusē cita funkcija ar nosaukumu "animateLeds ();" tiek saukts. Šī funkcija pārbauda, vai ir pagājušas 100 milisekundes, un, ja tā, tā rotē gaismas diodes, izmantojot funkciju "rotateLeds ()", un pēc tam tos pārzīmē

- "rotateLeds ()" "rotēs" gaismas diodes uz priekšu vai atpakaļ, izmantojot citu masīvu ar nosaukumu "intermediateLedStates".

Rotācijas efekts izskatīsies šādi:

# pēc inicializācijas

{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ēc rotateLeds () sauc par {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ēc rotateLeds () tiek izsaukts vēlreiz {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # un tā tālāk

Šim nolūkam vispirms tiek izveidots jauns masīvs un jaunās pozīcijās tiek kopēta vecā LED intensitāte (palieliniet pozīciju vai samaziniet to). Pēc tam tas pārraksta masīvu "ledStates" ar "intermediateLedStates", tāpēc process turpināsies vēl pēc 100 milisekundēm.

#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 (); neparakstīts ilgi lastLedChangeTime = 0; īss ledDirection = 0; īsa krāsaSelection = 0; baitu 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 ("Programma sākta"); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 inicializācija pabeigta"); } else {Serial.println ("APDS-9960 init laikā radās problēma!"); } lastLedChangeTime = milis (); Serial.println ("Init veiksmīgi"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * Tas apstrādās žestus no APDS9960 sensora * Augšup un lejup vērstie žesti izsauks pārslēgšanu Krāsu funkcija * Žesti pa kreisi un pa labi mainīs LED animāciju * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); pārtraukums; gadījums DIR_DOWN: Serial.println ("DOWN"); toggleColor (); pārtraukums; gadījums DIR_LEFT: ledDirection = 1; Serial.println ("LEFT"); pārtraukums; gadījums DIR_RIGHT: ledDirection = -1; Serial.println ("RIGHT"); pārtraukums; gadījums DIR_FAR: ledDirection = 0; Serial.println ("FAR"); pārtraukums; }} / ** * Mainīt pašreizējo gaismas diodes krāsu * Katru reizi, kad šī funkcija tiek izsaukta, tiks mainīts LED stāvoklis * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } cits if (colorSelection == 1) {colorSelection = 2; } cits {colorSelection = 0; }} / ** * Animācija darbosies pēc LED_SPEED_STEP_INTERVAL milisiem; } rotateLeds (); for (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates ))); strip.show (); } lastLedChangeTime = milis (); /**, 0, 0}.]; par (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } par (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } else {intermediateLedStates [i + 1] = ledStates ; }} cits {if (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } else {intermediateLedStates [i - 1] = ledStates ; }}} priekš (int i = 0; i <NUM_LEDS; i ++) {ledStates = starpposmaLedStates ; }} uint32_t getColor (int intensitāte) {switch (colorSelection) {case 0: return strip. Color (intensitāte, 0, 0); 1. gadījums: atgriešanās sloksne. Krāsa (0, intensitāte, 0); noklusējums: atgriešanas josla. Krāsa (0, 0, intensitāte); }}

Es ceru, ka jums tas patika, jūs varat izmantot komentāru sadaļu, lai uzdotu man jautājumus.

Ieteicams: