Sisukord:
Video: Neopikseli LED -rõnga juhtimine žestianduriga: 3 sammu (piltidega)
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:48
Selles õpetuses mängime žestianduri (APDS-9960) ja neopikselrõngaga, et õppida, kuidas neid mõlemat Arduino UNO abil kombineerida.
Lõpptoode reageerib vasakule -paremale suunatud žestidele, animeerides LED -i liikumist paremale või vasakule, ja üles -alla žestidele, muutes LED -ide värvi.
Järgmistes sammudes saate lühidalt ülevaate osade loendist ja komponentide ühendamisest. Ja siis vaatame koodi samm -sammult üle, et teada saada, kuidas see toimib.
Samm: komponendid
1. Arduino UNO
2. usb kaabel
3. APDS9960 žestiandur (https://www.sparkfun.com/products/12787)
4. 24 led neopixel led ring (https://www.adafruit.com/product/1586)
5. mees-naine, mees-mees leivaplaadi kaablid
6. leivalaud
7. 5 V toiteallikas LED -rõnga jaoks (kasutan 4 patareiga akut)
8. Neopikselrõnga leivaplaadile kinnitamiseks peate selle külge jootma kolm isast tihvti: GND, PWR ja juhtnõel. Selleks vajate jootekolvi ja voolu
Peamised komponendid on siin žestiandur APDS-9960 ja 24 neopikselrõngas. Soovi korral saate vahetada erinevaid arduinosid, USB -kaablite toiteallikaid ja leivaplaate.
Samm: kokkupanek ja üleslaadimine
Kokkupanek
Enne alustamist veenduge, et teie laual oleksid kõik komponendid. Meil on mõned toredad sammud, mida järgida:). Lisasin ka Fritzingi skemaatika pildina ja ka fritzing formaadis.
1. Jootke 3 isast tihvti neopikselrõnga külge (GND, PWR, kontrollnõel)
2. kinnitage neopikselrõngas leivalaua külge
3. kinnitage APDS9960 andur leivalaua külge
4. ühendage alused: aku, arduino UNO, APDS9960 ja neopixel leivaplaadi maapinnaga
5. ühendage toide: arduino UNO 3V APDS9960 toitepistikuga, neopiksel akuga
6. ühendage neopikseli juhttihvt arduino D6 tihvtiga
7. ühendage APDS9960 SDA ja SCL vastavalt A4 ja A5 -ga
8. ühendage APDS9960 katkestusnõel arduino D2 -ga
Koodi üleslaadimine
Kõigepealt peate alla laadima ja installima vajalikud arduino teegid:
1. Neopixeli rõngasteek:
2. Liigutusandurite kogu:
Kui te ei tea, kuidas arduino raamatukogusid installida, vaadake seda õpetust.
Pärast ülaltoodud teekide allalaadimist ja installimist saate kloonida või alla laadida minu arduino hoidla, mis asub siin: https://github.com/danionescu0/arduino, ja me kasutame seda visandit: https://github.com/danionescu0 /arduino/puu/master/projektid/neopixel_ring_gestures
Järgmises osas lisan koodi otse sellesse õpetusse, nii et kui soovite, saate selle sealt kopeerida ja kleepida.
Lõpuks ühendage arduino arvuti USB -kaabli abil, pange 1,5 V patareid akupakki ja laadige eskiis üles arduino.
3. samm: kuidas see toimib?
Selles viimases osas õpime, kuidas neid komponente omavahel kombineeritakse, kuidas nende teeke kasutada ja kuidas olen oma koodi üles ehitanud:
Kõigepealt vaatame kiiresti läbi anduri ja kasutatavate neopikseliteegi API meetodite
1. Neopixeli API adafruitist
Sellest raamatukogust kasutame meetodeid, mis juhivad üksikute LED -ide värvi ja rakendavad neid
- kaasa raamatukogu:
#kaasake
- kuulutada raamatukogu
#define NEOPIXED_CONTROL_PIN 6
#define NUM_LEDS 24 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);
- initsialiseerida
#tüüpiliselt seadistusploki sees
void setup () {strip.begin (); # võib -olla on siin muid asju #…. }
- süttige üksikud pikslid ja seejärel rakendage ribale kõik muudatused (renderdage see omamoodi)
# seadistage piksel 0 punaseks
strip.setPixelColor (0, riba. Värv (255, 0, 0)); # seadistage piksel 1 roheliseks ribaks.setPixelColor (1, riba. Värv (0, 255, 0)); # seadistage piksel 2 siniseks ribaks.setPixelColor (2, riba. Värv (0, 0 255)); strip.show ();
2. APDS 9960 žestiandur
Sellest raamatukogust kasutame funktsiooni "lugemisžest". See funktsioon suudab eristada vasak-parem, üles-alla ja lähedal-käske. Siin on trikk, me ei hakka andurilt pidevalt küsima viimast tajutavat žesti. Tahvlil on võimalus "pingutada" katkestuse kaudu, et žest on leitud.
- lisada raamatukogu, sarnaselt neopikseliga
- kuulutada raamatukogu katkestusnupuks ja katkestuslipuks
#define APDS9960_INT 2
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); int isr_flag = 0;
- teegi initsialiseerimine, tavaliselt seadistusfunktsiooni sees
tühine seadistus ()
{ # kuulutage katkestusnupp sisendiks ja lisage sellele funktsioon pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 initsialiseerimine lõpetatud"); } else {Serial.println ("Midagi läks valesti APDS-9960 algatamise ajal!"); } # initsialiseeri muid asju võib -olla}
- määratle katkestusfunktsioon, siin määrame ainult lipu
void interruptRoutine () {
isr_flag = 1; }
- silmusefunktsiooni sees kontrollige perioodiliselt lippu, et näha, kas žest on tuvastatud
tühine tsükkel ()
{ # kontrollige lippu, kui (isr_flag == 1) { # kui lipp on seatud, eemaldage katkestus, tehke vajalik käsk töötlemisel handleGesture () funktsiooni # sees ja seejärel lähtestage lipp ning kinnitage uuesti katkestus detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRutine, FALLING); } # ehk mõni muu kood siin}
- define handleGesture () funktsioon, kus saame küsida viimast žesti
void handleGesture () {
# kui ükski žest pole kättesaadav tagastamine, on see ainult ohutu kontroll, kas (! apds.isGestureAvailable ()) {return; } # loeb viimast žesti, võrdleb teadaolevatega ja prindib sõnumilüliti (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); murda; juhtum DIR_DOWN: Serial.println ("DOWN"); murda; juhtum DIR_LEFT: Serial.println ("LEFT"); murda; juhtum DIR_RIGHT: Serial.println ("RIGHT"); murda; juhtum DIR_FAR: Serial.println ("FAR"); murda; }}
Nüüd vaatame kogu koodi tegevuses:
Nii et olen selgitanud žestianduri baas -API -d ja neopikselrõngast, paneme nüüd asjad kokku:
Algoritm töötab järgmiselt:
- initsialiseerige raamatukogud (vt ülaltoodud koodi)
- looge led -intensiivsuste massiiv, mida nimetatakse "ledStates". See massiiv sisaldab 24 led -intensiivsust, mis on paigutatud kahaneval viisil 150 -lt 2 -le
- kontrollige põhiahelas, kas katkestusnõela on muudetud, kui on aeg muuta LED -i animatsiooni või värvi
- funktsioon "handleGesture ()" kontrollib viimast žesti ja kutsub üles -alla liigutuste jaoks funktsiooni "toggleColor" või määrab vasakule -paremale suunatud liigutuste jaoks globaalse muutuja "ledDirection"
- funktsioon "toggleColor ()" muudab lihtsalt globaalse muutuja nimega "colorSelection" ühe väärtusega 0, 1, 2
- ka peasilmuse funktsioonis veel üks funktsioon nimega "animateLeds ();" kutsutakse. See funktsioon kontrollib, kas 100 millisekundit on möödunud, ja kui jah, siis pöörab LED -e funktsiooni "rotateLeds ()" abil ja seejärel joonistab need uuesti
- "rotateLeds ()" "pöörab" LED -e edasi või tagasi, kasutades teist massiivi nimega "intermediateLedStates".
Pöörlemise "efekt" näeb välja selline:
# pärast lähtestamist
{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ärast rotateLeds () nimetatakse {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ärast rotateLeds () kutsutakse uuesti {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 nii edasi
Selleks loob esmalt uue massiivi ja kopeerib uute positsioonide vanad LED -intensiivsused (suurendage positsiooni või vähendage seda). Pärast seda kirjutab see masina "ledStates" üle "intermediateLedStates", nii et protsess jätkub veel 100 millisekundi pärast.
#include "SparkFun_APDS9960.h"
#include "Adafruit_NeoPixel.h"
#sisalda "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #defineeri 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 (); allkirjastamata kaua lastLedChangeTime = 0; lühike ledDirection = 0; lühike värvivalik = 0; bait 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 ("Programm käivitati"); riba.algus (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 initsialiseerimine lõpetatud"); } else {Serial.println ("Midagi läks valesti APDS-9960 algatamise ajal!"); } lastLedChangeTime = millis (); Serial.println ("Init edukalt"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRutine, FALLING); } animateLeds (); } tühine interruptRoutine () {isr_flag = 1; } / ** * See tegeleb APDS9960 anduri liigutustega * Üles ja alla liigutused kutsuvad toggle Värvifunktsioon * Vasak ja parem liigutused muudavad LED -animatsiooni * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); murda; juhtum DIR_DOWN: Serial.println ("DOWN"); toggleColor (); murda; juhtum DIR_LEFT: ledDirection = 1; Serial.println ("LEFT"); murda; juhtum DIR_RIGHT: ledDirection = -1; Serial.println ("ÕIGE"); murda; juhtum DIR_FAR: ledDirection = 0; Serial.println ("FAR"); murda; }} / ** * Muuda praeguse LED -i värvi * Iga kord, kui seda funktsiooni kutsutakse, muudab LED -i olekut * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Animatsioon käivitatakse pärast LED_SPEED_STEP_INTERVAL millis * Esmalt kutsutakse funktsioon rotateLeds, seejärel määratakse ledide värvid riba abil api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return; } rotateLeds (); jaoks (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates )); strip.show (); } lastLedChangeTime = millis (); /**, 0, 0} ja ledDirection on 1 *, siis pärast selle funktsiooni nimetamist "ledStates" on massiiv {0, 100, 80, 60, 0, 0}, mis simuleerib pöörlemisefekti */ void rotateLeds () {baiti intermediateLedStates [NUM_LEDS]; jaoks (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } jaoks (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 ; }}} jaoks (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int intensiivsus) {switch (colorSelection) {case 0: return strip. Color (intensiivsus, 0, 0); juhtum 1: tagastamisriba. Värv (0, intensiivsus, 0); vaikimisi: tagastusriba. Värv (0, 0, intensiivsus); }}
Loodan, et teile meeldis see, saate kommentaaride jaotises mulle küsimusi esitada.
Soovitan:
Neopikseli tester: 4 sammu
Neopixeli tester: Võib -olla loote projekti, mis kasutab Neopixeli LED -e või on teie komponendikarbis mõni, mille toimivust soovite kontrollida. Mul oli sama vajadus, kuid selle asemel, et probleemi leidmiseks oodata, kuni projekt on lõpule jõudnud, tahtsin veenduda, et nad
Kolme neopikseli sõrmusega neopikselkell: 7 sammu
Neopikselkell kolme neopikselrõngaga: Steve Manley geniaalne Neo Pixeli kella loomine ajendas mind koostama selle juhise selle kohta, kuidas luua võimalikult vähese raha eest sarnane kell. (Hollandi oluline harjumus on alati raha kokku hoida;-)) Sain teada, et o
Seadme juhtimine Androidi WiFi abil Esp8266 Juhtimine: 6 sammu
Seadme juhtimine Androidi WiFi abil Esp8266 Juhtimine: nüüd teame, kuidas juhtida seadmeid esp8266 WiFi -mooduli abil ja Arduino teie seadet Androidi WiFi -juhtimise abil lisateabe saamiseks. klõpsake linki mohamed ashraf
ESP8266 RGB LED -riba WIFI juhtimine - NODEMCU IR -kaugjuhtimispuldina LED -riba jaoks, mida juhitakse Wifi kaudu - RGB LED STRIP nutitelefoni juhtimine: 4 sammu
ESP8266 RGB LED -riba WIFI juhtimine | NODEMCU IR -kaugjuhtimispuldina LED -riba jaoks, mida juhitakse Wifi kaudu | RGB LED STRIP nutitelefoni juhtimine: Tere poisid, selles õpetuses õpime, kuidas kasutada nodemcu või esp8266 IR -kaugjuhtimispuldina, et juhtida RGB LED -riba ja Nodemcu saab juhtida nutitelefoniga WiFi kaudu. Nii et põhimõtteliselt saate oma nutitelefoniga juhtida RGB LED -riba
Avatud lähtekoodiga leivaplaadisõbralik modulaarne neopikseli purunemislaud: 4 sammu (koos piltidega)
Avatud lähtekoodiga leivaplaadisõbralik modulaarne neopikseli purunemisplaat: see juhend on umbes pisike (8 mm x 10 mm) leivaplaadisõbralik purunemislaud Neopixeli LED-ide jaoks, mida saab virnastada ja üksteise külge jootma panna, samuti pakub see palju rohkem jäikust kui õhuke LED -riba palju väiksemas vormis