Kazalo:

Upravljanje neopikselnega prstana s senzorjem kretnje: 3 koraki (s slikami)
Upravljanje neopikselnega prstana s senzorjem kretnje: 3 koraki (s slikami)

Video: Upravljanje neopikselnega prstana s senzorjem kretnje: 3 koraki (s slikami)

Video: Upravljanje neopikselnega prstana s senzorjem kretnje: 3 koraki (s slikami)
Video: Хозяин решил избавиться от собаки. Причина заставит вас плакать! 2024, November
Anonim
Image
Image
Montaža in nalaganje
Montaža in nalaganje

V tej vadnici se bomo igrali s senzorjem kretenj (APDS-9960) in obročem neopixel, da se naučimo, kako jih združiti z uporabo Arduino UNO.

Končni izdelek se bo na kretnje levo -desno odzval z animacijo gibanja LED v desno ali levo, na kretnje navzgor in navzdol pa s spreminjanjem barve LED.

V naslednjih korakih boste na kratko pregledali seznam delov in kako povezati komponente. Nato bomo korak za korakom pregledali kodo in izvedeli, kako deluje.

1. korak: Komponente

1. Arduino UNO

2. usb kabel

3. Senzor kretenj APDS9960 (https://www.sparkfun.com/products/12787)

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

5. moški-ženski, moško-moški kabli

6. mizica

7. 5 V napajanje za LED obroček (uporabljam 4 baterije nazaj)

8. Za pritrditev obroča neopixel na ploščo morate nanj spajkati tri moške zatiče: GND, PWR in kontrolni zatič. Za to potrebujete spajkalnik in fluks

Tu sta glavni komponenti senzor kretnje APDS-9960 in obroč s 24 neopiksami. Po želji lahko preklapljate med različnimi arduini, USB napajalniki in ploščami.

2. korak: Montaža in nalaganje

Montaža

Preden začnete, se prepričajte, da imate na mizi vse komponente. Imeli bomo nekaj lepih korakov:). Priložil sem tudi shemo Fritzing kot sliko in tudi v formatu fritzing.

1. Spajajte 3 moške zatiče na neopixel obroč (GND, PWR, kontrolni zatič)

2. pritrdite neopixel obroč na ploščo

3. senzor APDS9960 pritrdite na ploščo

4. priključite ozemljitve: baterijo, arduino UNO, APDS9960 in neopixel na ohišje

5. priključite napajanje: arduino UNO 3V na napajalni zatič APDS9960, neopixel na napajanje iz akumulatorja

6. priključite kontrolni zatič neopixel na nožico arduino D6

7. priključite SDA in SCL APDS9960 na A4 oziroma A5

8. priključite prekinitveni zatič APDS9960 na arduino D2

Nalaganje kode

Najprej boste morali prenesti in namestiti potrebne knjižnice arduino:

1. Knjižnica obročev Neopixel:

2. Knjižnica senzorjev kretenj:

Če ne veste, kako namestiti arduino knjižnice, si oglejte to vadnico.

Ko naložite in namestite zgornje knjižnice, lahko klonirate ali naložite moje skladišče arduino, ki se nahaja tukaj: https://github.com/danionescu0/arduino, mi pa bomo uporabili to skico: https://github.com/danionescu0 /arduino/drevo/glavni/projekti/neopixel_ring_gestures

V naslednjem razdelku bom kodo vdelal neposredno v to vadnico, zato jo lahko po želji kopirate in prilepite.

Končno povežite računalnik arduino s kablom usb, vstavite baterije 1,5 V v baterijo in naložite skico v arduino.

3. korak: Kako deluje?

V tem zadnjem delu bomo izvedeli, kako so te komponente združene, kako uporabljati njihove knjižnice in kako sem strukturiral svojo kodo:

Najprej si na hitro oglejmo metode API -ja knjižnice neopixel, ki jih bomo uporabili

1. API Neopixel iz adafruta

Iz te knjižnice bomo uporabili metode, ki nadzorujejo barvo posameznih LED in jih uporabljajo

- vključite knjižnico:

#vključi

- razglasiti knjižnico

#define NEOPIXED_CONTROL_PIN 6

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

- inicializirati

#tipično v nastavitvenem bloku

void setup () {strip.begin (); # mogoče tukaj še kakšna druga stvar …. }

- osvetlite posamezne slikovne pike in nato uporabite vse spremembe na traku (upodobite ga na nek način)

# nastavite pikslo 0 za rdečo

strip.setPixelColor (0, strip. Color (255, 0, 0)); # nastavite slikovno piko 1 za zeleni trak.setPixelColor (1, strip. Color (0, 255, 0)); # nastavite slikovno piko 2 za modri trak.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. Senzor kretnje APDS 9960

Iz te knjižnice bomo uporabljali funkcijo "branje geste". Ta funkcija bo lahko razlikovala med ukazi levo-desno, gor-dol in blizu. Tu je zvijača, senzorja ne bomo neprestano spraševali o zadnji zaznani gesti. Plošča ima možnost "pinganja" prek prekinitve, da je bila gesta najdena.

- vključite knjižnico, podobno kot neopixel

- razglasite knjižnico za prekinitveni pin in prekinitveno zastavo

#define APDS9960_INT 2

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

- inicializirajte knjižnico, običajno znotraj nastavitvene funkcije

void setup ()

{ # razglasite prekinitveni pin kot INPUT in mu pritrdite funkcijo pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Inicializacija APDS-9960 je končana"); } else {Serial.println ("Nekaj je šlo narobe med začetkom APDS-9960!"); } # morda inicializirajte druge stvari}

- določite funkcijo prekinitve, tukaj bomo nastavili le zastavico

void interruptRoutine () {

isr_flag = 1; }

- znotraj funkcije zanke občasno preverjajte zastavico in preverite, ali je bila zaznana gesta

void loop ()

{ # preverite zastavico if (isr_flag == 1) { # če je zastava nastavljena, odstranite prekinitev, opravite potrebno obdelavo v funkciji handleGesture () # in nato ponastavite zastavico ter znova pritrdite prekinitev detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # tukaj morda še kakšna koda}

- definirajte funkcijo handleGesture (), kjer lahko zahtevamo zadnjo potezo

void handleGesture () {

# če nobena gesta ni na voljo, je to le varno preverjanje, če (! apds.isGestureAvailable ()) {return; } # prebere zadnjo potezo, se primerja z znanimi in natisne stikalo za sporočilo (apds.readGesture ()) {primer DIR_UP: Serial.println ("UP"); prekiniti; primer DIR_DOWN: Serial.println ("DOL"); prekiniti; primer DIR_LEFT: Serial.println ("LEFT"); prekiniti; ohišje DIR_RIGHT: Serial.println ("RIGHT"); prekiniti; primer DIR_FAR: Serial.println ("FAR"); prekiniti; }}

Zdaj pa poglejmo celotno kodo v akciji:

Razložil sem torej osnovni API senzorja kretenj in prstana neopixel, zdaj pa sestavimo stvari:

Algoritem deluje takole:

- inicializirajte knjižnice (glejte zgornjo kodo)

- ustvarite niz LED intenzivnosti, imenovanih "ledStates". Ta niz bo vseboval 24 LED intenzivnosti, ki so razporejene padajoče od 150 do 2

- v glavni zanki preverite, ali je bil prekinitveni pin spremenjen, če je tako, čas je, da spremenite animacijo ali barvo LED

- funkcija "handleGesture ()" preveri zadnjo potezo in pokliče funkcijo "toggleColor" za poteze GOR -DOL ali pa nastavi globalno spremenljivko "ledDirection" za poteze LEVO - DESNO

- funkcija "toggleColor ()" preprosto spremeni globalno spremenljivko z imenom "colorSelection" z eno od vrednosti 0, 1, 2

- tudi znotraj funkcije glavne zanke druga funkcija z imenom "animateLeds ();" je poklican. Ta funkcija preveri, ali je minilo 100 milisekund, in v tem primeru zasuka svetleče diode s funkcijo "rotateLeds ()" in jih nato ponovno nariše

- "rotateLeds ()" bo "zasukal" svetleče diode naprej ali nazaj z uporabo drugega polja, imenovanega "intermediateLedStates".

"Učinek" rotacije bo videti tako:

# po inicializaciji

{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 () se imenuje {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 ponovnem klicu rotateLeds () {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # in tako naprej

Za to najprej ustvari novo matriko in kopira stare intenzitete led na novih položajih (poveča položaj ali jo zmanjša). Po tem polje "ledStates" prepiše z "intermediateLedStates", tako da se bo postopek nadaljeval po nadaljnjih 100 milisekundah.

#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_0) SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned long lastLedChangeTime = 0; kratek ledDirection = 0; kratka barvna izbira = 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, 0}; int isr_flag = 0; void setup () {Serial.begin (9600); Serial.println ("Program se je začel"); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Inicializacija APDS-9960 je končana"); } else {Serial.println ("Nekaj je šlo narobe med začetkom APDS-9960!"); } lastLedChangeTime = millis (); Serial.println ("Init uspešno"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * To bo obravnavalo kretnje iz senzorja APDS9960 * Poteze gor in dol bodo klicale funkcijo toggleColor * Leve in desne poteze bodo spremenile LED animacijo * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); prekiniti; primer DIR_DOWN: Serial.println ("DOL"); toggleColor (); prekiniti; primer DIR_LEFT: ledDirection = 1; Serial.println ("LEVO"); prekiniti; primer DIR_RIGHT: ledDirection = -1; Serial.println ("DESNO"); prekiniti; primer DIR_FAR: ledDirection = 0; Serial.println ("FAR"); prekiniti; }} / ** * Spremeni trenutno barvo svetlečih diod * Vsakič, ko se prikliče ta funkcija, se spremeni stanje LED * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Animacija se bo zagnala po LED_SPEED_STEP_INTERVAL millis * Najprej se pokliče funkcija rotateLeds, nato pa se barve LED prilagodijo s trakom 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 (); } /** * Z uporabo sekundarne matrike "intermediateLedStates" se animirajo intenzivnosti LED * Najprej se vrednosti iz "ledStates" kopirajo v "intermediateLedStates", tako da * poglejmo, matrika "ledStates" je {100, 80, 60, 0, 0, 0} in ledDirection je 1 *, potem ko je ta funkcija poimenovana "ledStates" je matrika {0, 100, 80, 60, 0, 0}, ki simulira učinek vrtenja */ void rotateLeds () {byte intermediateLedStates [NUM_LEDS]; for (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 (intenzivnost int) {stikalo (colorSelection) {primer 0: vrnitev traku. Barva (intenzivnost, 0, 0); primer 1: povratni trak. Barva (0, intenzivnost, 0); privzeto: povratni trak. Barva (0, 0, intenzivnost); }}

Upam, da vam je to všeč, mi lahko uporabite razdelek s komentarji, da mi postavite vprašanja.

Priporočena: