Sisällysluettelo:

Neopixel -led -renkaan ohjaaminen eleanturilla: 3 vaihetta (kuvilla)
Neopixel -led -renkaan ohjaaminen eleanturilla: 3 vaihetta (kuvilla)

Video: Neopixel -led -renkaan ohjaaminen eleanturilla: 3 vaihetta (kuvilla)

Video: Neopixel -led -renkaan ohjaaminen eleanturilla: 3 vaihetta (kuvilla)
Video: Arduino MIDI-rummut Piezo Disc Triggereillä (kaaviolla ja koodilla) 2024, Marraskuu
Anonim
Image
Image
Kokoonpano ja lataus
Kokoonpano ja lataus

Tässä opetusohjelmassa aiomme leikkiä eleanturilla (APDS-9960) ja neopikselirenkaalla oppiaksesi yhdistämään ne molemmat Arduino UNO: n avulla.

Lopputuote reagoi vasemman ja oikean eleisiin animoimalla ledin liikettä oikealle tai vasemmalle ja ylöspäin osoittaville eleille vaihtamalla ledien väriä.

Seuraavissa vaiheissa näet lyhyesti osaluettelon ja osien liittämisen. Ja sitten tarkastelemme koodia vaihe vaiheelta oppiaksemme kuinka se toimii.

Vaihe 1: Komponentit

1. Arduino UNO

2. usb -kaapeli

3. APDS9960 -eleanturi (https://www.sparkfun.com/products/12787)

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

5. uros-naaras, uros-uros leipälautakaapelit

6. leipälauta

7. 5 V: n virtalähde led -renkaalle (käytän 4 paristoa)

8. Neopikselirenkaan kiinnittämiseksi leipälevyyn sinun on juotettava siihen kolme urospistettä: GND, PWR ja ohjaustappi. Tätä varten tarvitset juotosraudan ja virran

Pääkomponentit ovat APDS-9960-eleanturi ja 24 neopikselirengas. Voit vaihtaa eri arduinoja, usb -kaapeleita ja virtalähteitä haluamallasi tavalla.

Vaihe 2: Kokoaminen ja lataaminen

Kokoonpano

Ennen kuin aloitat, varmista, että kaikki komponentit ovat pöydälläsi. Meillä on mukavia vaiheita seurata:). Olen myös liittänyt Fritzing -kaavion kuvana ja myös fritzing -muodossa.

1. Juotos 3 urospistettä neopikselirenkaaseen (GND, PWR, ohjaustappi)

2. kiinnitä neopikselirengas leipälevyyn

3. kiinnitä APDS9960 -anturi leipälevyyn

4. liitä perusteet: akku, arduino UNO, APDS9960 ja neopixel leipälevyn maahan

5. kytke virta: arduino UNO 3V APDS9960 -virtapistokkeeseen, neopikseli akun virtalähteeseen

6. liitä neopikselin ohjaustappi arduino D6 -tappiin

7. liitä APDS9960: n SDA ja SCL A4- ja A5 -liittimiin

8. kytke APDS9960 -keskeytystappi arduino D2: een

Koodin lataus

Ensinnäkin sinun on ladattava ja asennettava tarvittavat arduino -kirjastot:

1. Neopixel -rengaskirjasto:

2. Ele-anturikirjasto:

Jos et tiedä kuinka asentaa arduino -kirjastoja, tutustu tähän opetusohjelmaan.

Kun olet ladannut ja asentanut yllä olevat kirjastot, voit kloonata tai ladata arduino -arkistoni, joka sijaitsee täällä: https://github.com/danionescu0/arduino, ja käytämme tätä luonnosta: https://github.com/danionescu0 /arduino/tree/master/project/neopixel_ring_gestures

Seuraavassa osassa upotan koodin suoraan tähän opetusohjelmaan, joten jos haluat, voit kopioida ja liittää sen sieltä.

Liitä lopuksi arduino tietokoneeseen USB -kaapelilla, aseta 1,5 voltin paristot akkuun ja lataa luonnos arduinoon.

Vaihe 3: Miten se toimii?

Tässä viimeisessä osassa opimme, kuinka nämä komponentit yhdistetään yhteen, miten niiden kirjastoja käytetään ja miten olen jäsentänyt koodini:

Katsotaanpa ensin vilkaisua anturin ja käyttämiemme neopikselikirjaston API -menetelmien läpi

1. Neopixel API API

Tästä kirjastosta käytämme menetelmiä, jotka ohjaavat yksittäisten ledien värejä ja käyttävät niitä

- sisällyttää kirjastoon:

#sisältää

- julistaa kirjastoa

#define NEOPIXED_CONTROL_PIN 6

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

- alustaa

#tyypillisesti asennuslohkon sisällä

void setup () {strip.begin (); # ehkä jotain muuta täällä #…. }

- sytytä yksittäiset pikselit ja tee sitten kaikki muutokset nauhaan (renderöi se tavalla)

# määritä pikseli 0 punaiseksi

strip.setPixelColor (0, strip. Color (255, 0, 0)); # aseta pikseli 1 vihreäksi nauhaksi. setPixelColor (1, strip. Color (0, 255, 0)); # aseta pikseli 2 siniseksi kaistaleksi. setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. APDS 9960 eleanturi

Tästä kirjastosta käytämme "lukuele" -toimintoa. Tämä toiminto pystyy erottamaan vasen-oikea, ylös-alas, lähellä-kaukosäätimen komennot. Tässä on temppu, emme kysy anturilta jatkuvasti viimeistä havaittua eletä. Taululla on kyky "pingittää" keskeytyksen kautta, että ele on löydetty.

- sisällyttää kirjasto, samanlainen kuin neopikseli

- julistaa kirjaston keskeytysnappiksi ja keskeytyslipuksi

#define APDS9960_INT 2

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

- Alusta kirjasto, yleensä asennustoiminnon sisällä

mitätön asennus ()

{ # julistaa keskeytysnastan INPUT: ksi ja liittää siihen toiminnon pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960-alustus valmis"); } else {Serial.println ("Jotain meni pieleen APDS-9960 init: n aikana!"); } # alustaa muita asioita ehkä}

- määritä keskeytystoiminto, tässä asetamme vain lipun

void interruptRoutine () {

isr_flag = 1; }

- Tarkista silmukkatoiminnon sisällä lippu säännöllisesti nähdäksesi, onko ele havaittu

tyhjä silmukka ()

{ # tarkista lippu, jos (isr_flag == 1) { # jos lippu on asetettu, poista keskeytys, suorita tarvittava käsittely handleGesture () -toiminnon # sisällä ja nollaa sitten lippu ja kiinnitä uudelleen keskeytyksen detachInterrupt (0); kahvaEle (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # joku muu koodi täällä ehkä}

- define handleGesture () -toiminto, jossa voimme pyytää viimeisen eleen

void handleGesture () {

# jos ele ei ole käytettävissä, palautus on vain turvallinen tarkistus, jos (! apds.isGestureAvailable ()) {return; } # lukee viimeisen eleen, vertaa tunnettuihin ja tulostaa viestikytkimen (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); tauko; tapaus DIR_DOWN: Serial.println ("DOWN"); tauko; tapaus DIR_LEFT: Serial.println ("LEFT"); tauko; tapaus DIR_RIGHT: Serial.println ("OIKEA"); tauko; tapaus DIR_FAR: Serial.println ("FAR"); tauko; }}

Katsotaan nyt koko koodi toiminnassa:

Joten olen selittänyt eleanturin ja neopikselirenkaan perussovellusliittymän, nyt laitetaan asiat yhteen:

Algoritmi toimii näin:

- alustaa kirjastot (katso yllä oleva koodi)

- Luo joukko led -intensiteettejä nimeltä "ledStates". Tämä taulukko sisältää 24 led -intensiteettiä, jotka on järjestetty laskevasti 150: stä 2: een

- Tarkista pääsilmukan sisällä, onko keskeytystappia muutettu, jos on aika vaihtaa ledin animaatio tai väri

- "handleGesture ()" -toiminto tarkistaa viimeisen eleen ja kutsuu toiminnon "toggleColor" YLÖS -ALLE -eleille tai asettaa globaalin muuttujan "ledDirection" VASEN - OIKEA eleille

- "toggleColor ()" -toiminto yksinkertaisesti muuttaa globaalin muuttujan nimeltä "colorSelection" jollakin arvoista 0, 1, 2

- myös pääsilmukan sisällä toinen toiminto nimeltä "animateLeds ();" kutsutaan. Tämä toiminto tarkistaa, onko 100 millisekuntia kulunut, ja jos näin on, se kiertää ledejä käyttämällä "rotateLeds ()" -toimintoa ja piirtää ne sitten uudelleen

- "rotateLeds ()" "kiertää" ledejä eteen- tai taaksepäin käyttämällä toista matriisia nimeltä "intermediateLedStates".

Kierto "vaikutus" näyttää tältä:

# alustamisen jälkeen

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # rotateLeds () jälkeen kutsutaan {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # rotateLeds () jälkeen kutsutaan uudelleen {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # ja niin edelleen

Tämä luo ensin uuden taulukon ja kopioi vanhat led -intensiteetit uusille paikoille (lisää tai vähennä paikkaa). Sen jälkeen se korvaa "ledStates" -matriisin "intermediateLedStates" -toiminnolla, joten prosessi jatkuu vielä 100 millisekunnin kuluttua.

#include "SparkFun_APDS9960.h"

#include "Adafruit_NeoPixel.h"

#sisällytä "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, NEO_NEO_NOO; NEOPIX) SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned long lastLedChangeTime = 0; lyhyt ledSuunta = 0; lyhyt colorSelection = 0; tavu 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 ("Ohjelma käynnistyi"); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960-alustus valmis"); } else {Serial.println ("Jotain meni pieleen APDS-9960 init: n aikana!"); } lastLedChangeTime = millis (); Serial.println ("Init onnistuneesti"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); kahvaEle (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * Tämä käsittelee eleitä APDS9960 -anturista; } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); tauko; tapaus DIR_DOWN: Serial.println ("DOWN"); toggleColor (); tauko; tapaus DIR_LEFT: ledDirection = 1; Serial.println ("VASEN"); tauko; tapaus DIR_RIGHT: ledDirection = -1; Serial.println ("OIKEA"); tauko; tapaus DIR_FAR: ledDirection = 0; Serial.println ("FAR"); tauko; }} / ** * Vaihda nykyisen ledin väri * Aina kun tätä toimintoa kutsutaan, se muuttaa ledien tilaa * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Animaatio suoritetaan LED_SPEED_STEP_INTERVAL millisekunnin jälkeen; } rotateLeds (); for (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates ))); strip.show (); } lastLedChangeTime = millis (); } /** * Käyttämällä toissijaista taulukkoa "intermediateLedStates", ledien intensiteetit animoidaan * Ensin "ledStates" -arvot kopioidaan "intermediateLedStates" -tilaan, kuten * * istutaan "ledStates" -matriisi on {100, 80, 60, 0, 0, 0} ja ledDirection on 1 *, ja tämän funktion "ledStates" -nimisen jälkeen taulukko on {0, 100, 80, 60, 0, 0}, joka simuloi kiertoefektiä */ void rotateLeds () {tavua intermediateLedStates [NUM_LEDS]; for (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 intensiteetti) {switch (colorSelection) {case 0: return strip. Color (intensiteetti, 0, 0); tapaus 1: palautusliuska. Väri (0, voimakkuus, 0); oletus: palautuskaista. Väri (0, 0, voimakkuus); }}

Toivon, että pidit tästä, voit käyttää kommenttien osiossa kysymyksiä.

Suositeltava: