Obsah:

Ovládání neopixelového LED kroužku senzorem gest: 3 kroky (s obrázky)
Ovládání neopixelového LED kroužku senzorem gest: 3 kroky (s obrázky)

Video: Ovládání neopixelového LED kroužku senzorem gest: 3 kroky (s obrázky)

Video: Ovládání neopixelového LED kroužku senzorem gest: 3 kroky (s obrázky)
Video: EP20 HW Build - Измерение ВЧ-мощности своими руками 2024, Listopad
Anonim
Image
Image
Sestavení a nahrání
Sestavení a nahrání

V tomto tutoriálu si zahrajeme se senzorem gest (APDS-9960) a neopixelovým prstenem, abychom se naučili, jak je kombinovat pomocí Arduino UNO.

Konečný produkt bude reagovat na gesta vlevo - vpravo animací pohybu LED doprava nebo doleva a na gesta nahoru -dolů změnou barvy LED diod.

V dalších krocích si krátce prohlédnete seznam dílů a způsob připojení komponent. A pak krok za krokem zkontrolujeme kód, abychom zjistili, jak funguje.

Krok 1: Součásti

1. Arduino UNO

2. USB kabel

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

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

5. kabely samec-samice, samec-samec

6. prkénko

7. Napájení 5 V pro LED kroužek (používám zadní 4 baterie)

8. K připevnění neopixelového kroužku na prkénko k němu musíte připájet tři samčí kolíky: GND, PWR a ovládací kolík. K tomu budete potřebovat páječku a tavidlo

Hlavními komponentami jsou zde senzor gest APDS-9960 a 24 neopixelový prsten. Můžete libovolně přepínat různé arduino, napájecí kabely USB a prkénka.

Krok 2: Sestavení a nahrání

Shromáždění

Než začnete, ujistěte se, že máte na stole všechny komponenty. Budeme muset následovat několik pěkných kroků:). Také jsem připojil schéma Fritzing jako obrázek a také ve formátu fritzing.

1. Připájejte 3 samčí kolíky k neopixelovému prstenci (GND, PWR, ovládací kolík)

2. připevněte neopixelový kroužek na prkénko

3. Připojte senzor APDS9960 na prkénko

4. Připojte uzemnění: bateriový modul, arduino UNO, APDS9960 a neopixel k uzemňovací desce

5. Připojte napájení: arduino UNO 3V k napájecímu kolíku APDS9960, neopixel k napájení z baterie

6. Připojte ovládací pin neopixelu ke kolíku arduino D6

7. Připojte SDA a SCL APDS9960 k A4 a A5

8. Připojte přerušovací pin APDS9960 k arduino D2

Nahrání kódu

Nejprve si musíte stáhnout a nainstalovat potřebné arduino knihovny:

1. Knihovna kruhů Neopixel:

2. Knihovna senzorů gest:

Pokud nevíte, jak nainstalovat knihovny arduino, podívejte se na tento tutoriál.

Poté, co si stáhnete a nainstalujete výše uvedené knihovny, můžete klonovat nebo stáhnout můj arduino repozitář umístěný zde: https://github.com/danionescu0/arduino a použijeme tento náčrt: https://github.com/danionescu0 /arduino/strom/master/projekty/neopixel_ring_gestures

V další části vložím kód přímo do tohoto tutoriálu, takže pokud chcete, můžete jej zkopírovat a vložit.

Nakonec připojte arduino k počítači pomocí USB kabelu, vložte 1,5 V baterie do baterie a nahrajte skicu do arduina.

Krok 3: Jak to funguje?

V této poslední části se naučíme, jak jsou tyto komponenty kombinovány, jak používat jejich knihovny a jak jsem strukturoval svůj kód:

Nejprve se podívejme rychle na senzor a metody API knihovny neopixelů, které použijeme

1. Neopixel API od adafruit

Z této knihovny použijeme metody, které řídí barvu jednotlivých LED a aplikují je

- zahrnout knihovnu:

#zahrnout

- prohlásit knihovnu

#define NEOPIXED_CONTROL_PIN 6

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

- inicializovat

#typicky uvnitř instalačního bloku

neplatné nastavení () {strip.begin (); # možná tu jsou další věci #…. }

- rozsvítit jednotlivé pixely a poté aplikovat všechny úpravy na pruh (vykreslit ho způsobem)

# nastavte pixel 0 na červený

strip.setPixelColor (0, strip. Color (255, 0, 0)); # nastavit pixel 1 na zelený proužek.setPixelColor (1, strip. Color (0, 255, 0)); # nastavit pixel 2 na modrý pruh.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. Senzor gest APDS 9960

Z této knihovny budeme používat funkci „gesto čtení“. Tato funkce bude schopna rozlišovat mezi příkazy zleva doprava, nahoru-dolů a zblízka. Tady je trik, nebudeme se ptát senzoru nepřetržitě na poslední vnímané gesto. Deska má schopnost "pingovat" přerušením, že bylo nalezeno gesto.

- zahrnout knihovnu, podobnou neopixelu

- deklarujte knihovnu pin přerušení a příznak přerušení

#define APDS9960_INT 2

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

- inicializujte knihovnu, obvykle uvnitř funkce nastavení

neplatné nastavení ()

{ # deklarujte pin přerušení jako VSTUP a připojte k němu funkci pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Inicializace APDS-9960 dokončena"); } else {Serial.println ("Něco se pokazilo během inicializace APDS-9960!"); } # možná inicializovat další věci}

- definujte funkci přerušení, zde nastavíme pouze příznak

void interruptRoutine () {

isr_flag = 1; }

- uvnitř funkce smyčky pravidelně kontrolujte vlajku, abyste zjistili, zda bylo detekováno gesto

prázdná smyčka ()

{ # zkontrolujte příznak if (isr_flag == 1) { # pokud je příznak nastaven, odstraňte přerušení, proveďte nezbytné zpracování uvnitř funkce handleGesture () # a poté resetujte příznak a znovu připojte přerušení detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # možná nějaký jiný kód zde}

- definujte funkci handleGesture (), kde můžeme požádat o poslední gesto

void handleGesture () {

# pokud není k dispozici žádné gesto, je to jen bezpečná kontrola, pokud (! apds.isGestureAvailable ()) {return; } # přečte poslední gesto, porovná se známými a vytiskne přepínač zpráv (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); přestávka; případ DIR_DOWN: Serial.println ("DOWN"); přestávka; případ DIR_LEFT: Serial.println ("VLEVO"); přestávka; případ DIR_RIGHT: Serial.println ("RIGHT"); přestávka; případ DIR_FAR: Serial.println ("FAR"); přestávka; }}

Nyní se podívejme na celý kód v akci:

Vysvětlil jsem tedy základní API senzoru gest a prstence neopixelů, teď pojďme dát věci dohromady:

Algoritmus běží takto:

- inicializovat knihovny (viz kód výše)

- vytvořte řadu intenzit LED nazývaných „ledStates“. Toto pole bude obsahovat 24 intenzit LED, které jsou uspořádány sestupně od 150 do 2

- uvnitř hlavní smyčky zkontrolujte, zda byl přerušovací kolík upraven, pokud ano, je tedy čas změnit animaci nebo barvu LED

- funkce "handleGesture ()" zkontroluje poslední gesto a zavolá funkci "toggleColor" pro Gesta NAHORU -DOLŮ nebo nastaví globální proměnnou "ledDirection" pro LEFT - RIGHT gesta

- funkce "toggleColor ()" jednoduše změní globální proměnnou s názvem "colorSelection" s jednou z hodnot 0, 1, 2

- také uvnitř funkce hlavní smyčky další funkce s názvem "animateLeds ();" je nazýván. Tato funkce kontroluje, zda uplynulo 100 milisekund, a pokud ano, otočí diody pomocí funkce „rotateLeds ()“a poté je překreslí

- "rotateLeds ()" "otočí" diody dopředu nebo dozadu pomocí jiného pole s názvem "intermediateLedStates".

Efekt otáčení bude vypadat takto:

# po inicializaci

{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, 0}; # after rotateLeds () se nazývá {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # after rotateLeds () se znovu nazývá {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # a tak dále

Za tímto účelem nejprve vytvoří nové pole a zkopíruje staré intenzity LED na nové pozice (zvýší pozici nebo sníží). Poté přepíše pole „ledStates“„mezilehléStáty“, takže proces bude pokračovat po dalších 100 milisekundách.

#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, NEOPIXED_CONTROL_ SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned long lastLedChangeTime = 0; short ledDirection = 0; short colorSelection = 0; byte 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, 0}; int isr_flag = 0; neplatné nastavení () {Serial.begin (9600); Serial.println ("Program spuštěn"); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Inicializace APDS-9960 dokončena"); } else {Serial.println ("Něco se pokazilo během inicializace APDS-9960!"); } lastLedChangeTime = millis (); Serial.println ("Úspěšně zahájeno"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * To zvládne gesta ze senzoru APDS9960 * Gesta nahoru a dolů budou volat funkci toggleColor * Gesta vlevo a vpravo změní animaci LED * / void handleGesture () {if (! Apds.isGestureAvailable ()) {návrat; } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); přestávka; případ DIR_DOWN: Serial.println ("DOWN"); toggleColor (); přestávka; případ DIR_LEFT: ledDirection = 1; Serial.println ("VLEVO"); přestávka; případ DIR_RIGHT: ledDirection = -1; Serial.println ("PRÁVO"); přestávka; případ DIR_FAR: ledDirection = 0; Serial.println ("FAR"); přestávka; }} / ** * Změnit aktuální barvu LED * Při každém volání této funkce se změní stav LED * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Animace poběží po milisekundách LED_SPEED_STEP_INTERVAL * Nejprve se zavolá funkce rotateLeds, poté se nastaví barvy LED pomocí pruhu api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {návrat; } rotateLeds (); for (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates )); strip.show (); } lastLedChangeTime = millis (); } /** * Pomocí sekundárního pole „intermediateLedStates“se animují intenzity LED * Nejprve se hodnoty z „ledStates“zkopírují na „intermediateLedStates“podobně, tak * pojďme sedět pole „ledStates“je {100, 80, 60, 0, 0, 0} a ledDirection je 1 *, potom poté, co se tato funkce nazývá „ledStates“, je pole {0, 100, 80, 60, 0, 0} simulující efekt otáčení */ void rotateLeds () {byte intermediateLedStates [NUM_LEDS]; pro (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 ; }}} for (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int intenzita) {switch (colorSelection) {case 0: return strip. Color (intenzita, 0, 0); případ 1: zpětný proužek. barva (0, intenzita, 0); výchozí: návratový proužek. Barva (0, 0, intenzita); }}

Doufám, že se vám to líbilo, můžete mi v sekci komentářů klást otázky.

Doporučuje: