Sadržaj:
Video: Upravljanje neopikselnim prstenom sa senzorom pokreta: 3 koraka (sa slikama)
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:07
U ovom vodiču igrat ćemo se sa senzorom gesta (APDS-9960) i prstenom od neopiksela kako bismo naučili kako ih kombinirati pomoću Arduino UNO-a.
Krajnji proizvod će reagirati na pokrete lijevo -desno animirajući kretanje LED -a desno ili lijevo, a na pokrete gore -dolje promjenom boje LED dioda.
U sljedećim koracima kratko ćete pregledati popis dijelova i kako spojiti komponente. Zatim ćemo pregledati kod korak po korak kako bismo saznali kako radi.
Korak 1: Komponente
1. Arduino UNO
2. USB kabl
3. APDS9960 senzor gesta (https://www.sparkfun.com/products/12787)
4. 24 LED neopixel LED prsten (https://www.adafruit.com/product/1586)
5. muški-ženski, muški-muški kabeli za matičnu ploču
6. osnova
7. Napajanje od 5 V za LED prsten (koristim zadnju bateriju od 4 baterije)
8. Za pričvršćivanje neopikselnog prstena na matičnu ploču morate na njega lemiti tri muška igla: GND, PWR i kontrolni pin. Za to će vam trebati lemilica i fluks
Glavne komponente ovdje su senzor gesta APDS-9960 i prsten od 24 neopiksela. Po želji možete mijenjati različite arduine, USB kablove i napajanje.
Korak 2: Montaža i učitavanje
Montaža
Prije nego počnete, provjerite imate li sve komponente na stolu. Morat ćemo slijediti neke lijepe korake:). Takođe sam priložio šemu Fritzinga kao sliku i takođe u formatu fritzinga.
1. Lemite 3 muška pina na prsten od neopiksela (GND, PWR, kontrolni pin)
2. pričvrstite prsten neopiksela na matičnu ploču
3. priključite senzor APDS9960 na matičnu ploču
4. spojite uzemljenje: bateriju, arduino UNO, APDS9960 i neopixel na masu matične ploče
5. spojite napajanje: arduino UNO 3V na pin za napajanje APDS9960, neopixel na napajanje iz baterije
6. spojite kontrolni pin neopiksela na pin arduino D6
7. spojite SDA i SCL APDS9960 na A4 odnosno A5
8. spojite pin prekida APDS9960 na arduino D2
Otpremanje koda
Prije svega, trebate preuzeti i instalirati potrebne arduino biblioteke:
1. Neopixel prsten biblioteka:
2. Biblioteka senzora pokreta:
Ako ne znate kako instalirati arduino biblioteke, pogledajte ovaj vodič.
Nakon što preuzmete i instalirate gore navedene biblioteke, možete klonirati ili preuzeti moje arduino spremište koje se nalazi ovdje: https://github.com/danionescu0/arduino, a mi ćemo koristiti ovu skicu: https://github.com/danionescu0 /arduino/tree/master/projects/neopixel_ring_gestures
U sljedećem odjeljku ugradit ću kôd izravno u ovaj vodič, pa ako želite, možete ga kopirati i zalijepiti odatle.
Na kraju spojite arduino računar pomoću USB kabla, umetnite baterije od 1,5 V u bateriju i prenesite skicu u arduino.
Korak 3: Kako to funkcionira?
U ovom posljednjem dijelu naučit ćemo kako se ove komponente kombiniraju zajedno, kako koristiti njihove biblioteke i kako sam strukturirao svoj kôd:
Prvo pogledajmo senzor i API metode biblioteke neopiksela koje ćemo koristiti
1. Neopixel API iz adafruit -a
Iz ove biblioteke koristit ćemo metode za kontrolu boje pojedinih LED dioda i njihovu primjenu
- uključi biblioteku:
#include
- proglasiti biblioteku
#define NEOPIXED_CONTROL_PIN 6
#define NUM_LEDS 24 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);
- inicijalizirati
#tipično unutar instalacijskog bloka
void setup () {strip.begin (); # možda ovdje ima još nekih stvari…. }
- osvijetlite pojedinačne piksele, a zatim primijenite sve izmjene na traku (iscrtajte je na neki način)
# postavite piksel 0 da bude crven
strip.setPixelColor (0, strip. Color (255, 0, 0)); # postavite piksel 1 da bude zelena traka.setPixelColor (1, strip. Color (0, 255, 0)); # postavite piksel 2 da bude plava strip.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();
2. APDS 9960 senzor pokreta
Iz ove biblioteke koristit ćemo funkciju "čitanje gesta". Ova funkcija će moći razlikovati naredbe lijevo-desno, gore-dolje, blizu. Ovdje postoji trik, nećemo stalno pitati senzor za posljednji primijećeni gest. Ploča ima mogućnost "pinganja" kroz prekid da je gest pronađen.
- uključi biblioteku, slično neopikselu
- deklarirati biblioteku prekidnom iglicom i zastavicom prekida
#define APDS9960_INT 2
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); int isr_flag = 0;
- inicijalizirati biblioteku, obično unutar funkcije postavljanja
void setup ()
{ # deklarirati pin prekida kao INPUT i dodati mu funkciju pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 inicijalizacija dovršena"); } else {Serial.println ("Nešto je pošlo po zlu tokom pokretanja APDS-9960!"); } # inicijalizacija drugih stvari možda}
- definirajte funkciju prekida, ovdje ćemo postaviti samo zastavicu
void interruptRoutine () {
isr_flag = 1; }
- unutar funkcije petlje povremeno provjeravajte zastavicu da vidite je li gesta otkrivena
void loop ()
{ # provjerite zastavicu if (isr_flag == 1) { # ako je zastava postavljena, uklonite prekid, izvršite potrebnu obradu unutar handleGesture () funkcije #, a zatim resetirajte zastavicu i ponovo spojite prekid detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # ovdje možda još neki kôd}
- definirajte handleGesture () funkciju gdje možemo zatražiti posljednju gestu
void handleGesture () {
# ako nijedan pokret nije dostupan, ovo je samo sigurna provjera ako (! apds.isGestureAvailable ()) {return; } # čita posljednji pokret, uspoređuje se s poznatim i ispisuje prekidač za poruku (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); break; slučaj DIR_DOWN: Serial.println ("DOLJE"); break; slučaj DIR_LEFT: Serial.println ("LIJEVO"); break; slučaj DIR_RIGHT: Serial.println ("RIGHT"); break; slučaj DIR_FAR: Serial.println ("FAR"); break; }}
Pogledajmo sada cijeli kôd na djelu:
Objasnio sam osnovni API senzora gesta i neopikselnog prstena, ajmo sada spojiti stvari:
Algoritam radi ovako:
- inicijalizirajte biblioteke (pogledajte gornji kod)
- stvoriti niz LED intenziteta pod nazivom "ledStates". Ovaj niz će sadržavati 24 LED intenziteta koji su raspoređeni silazno od 150 do 2
- unutar glavne petlje provjerite je li prekidni pin promijenjen ako je tako, vrijeme je da promijenite animaciju ili boju LED -a
- funkcija "handleGesture ()" provjerava posljednji pokret i poziva funkciju "toggleColor" za pokrete GORE -DOLJE ili postavlja globalnu varijablu "ledDirection" za pokrete LIJEVO - DESNO
- funkcija "toggleColor ()" jednostavno mijenja globalnu varijablu pod nazivom "colorSelection" s jednom od vrijednosti 0, 1, 2
- takođe unutar funkcije glavne petlje druga funkcija pod nazivom "animateLeds ();" se zove. Ova funkcija provjerava je li prošlo 100 milisekundi i u tom slučaju rotira LED diode pomoću funkcije "rotateLeds ()", a zatim ih ponovno iscrtava
- "rotateLeds ()" će "rotirati" LED diode naprijed ili natrag pomoću drugog niza koji se naziva "intermediateLedStates".
"Efekat" rotacije će izgledati ovako:
# nakon inicijalizacije
{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # nakon rotateLeds () se naziva {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # nakon što se rotateLeds () ponovo pozove {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # i tako dalje
Jer ovo prvo stvara novi niz i kopira stare intenzitete LED dioda na novim pozicijama (povećava položaj ili smanjuje). Nakon toga, on prepisuje "ledStates" niz sa "intermediateLedStates" tako da će se proces nastaviti nakon još 100 milisekundi.
#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_); SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned long lastLedChangeTime = 0; kratak ledDirection = 0; short colorSelection = 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}; int isr_flag = 0; void setup () {Serial.begin (9600); Serial.println ("Program je pokrenut"); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 inicijalizacija dovršena"); } else {Serial.println ("Nešto nije u redu tokom pokretanja APDS-9960!"); } lastLedChangeTime = millis (); Serial.println ("Init uspješno"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * Ovo će obraditi pokrete sa senzora APDS9960 * Pokreti gore i dolje će pozvati funkciju toggleColor * Pokreti lijevo i desno promijenit će LED animaciju * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } prekidač (apds.readGesture ()) {slučaj DIR_UP: Serial.println ("GORE"); toggleColor (); break; slučaj DIR_DOWN: Serial.println ("DOLJE"); toggleColor (); break; slučaj DIR_LEFT: ledDirection = 1; Serial.println ("LIJEVO"); break; slučaj DIR_RIGHT: ledDirection = -1; Serial.println ("DESNO"); break; slučaj DIR_FAR: ledDirection = 0; Serial.println ("FAR"); break; }} / ** * Promijeni trenutnu boju LED dioda * Svaki put kada se pozove ova funkcija promijenit će stanje LED dioda * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Animacija će se pokrenuti nakon LED_SPEED_STEP_INTERVAL millis * Prvo se pozove rotateLeds funkcija, zatim se boje LED dioda postave pomoću api trake * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return; } rotateLeds (); for (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates )); strip.show (); } lastLedChangeTime = millis (); } /** * Koristeći sekundarni niz "intermediateLedStates", intenziteti LED dioda se animiraju * Prvo se vrijednosti iz "ledStates" kopiraju na "intermediateLedStates", tako da * idemo na red "ledStates" niz je {100, 80, 60, 0, 0, 0} i ledDirection je 1 *, a nakon što se ova funkcija nazove "ledStates" niz je {0, 100, 80, 60, 0, 0} simulirajući efekt rotacije */ void rotateLeds () {bajt intermediateLedStates [NUM_LEDS]; za (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 (int intenzitet) {switch (colorSelection) {case 0: return strip. Color (intenzitet, 0, 0); slučaj 1: povratna traka. Boja (0, intenzitet, 0); default: povratna traka. Boja (0, 0, intenzitet); }}
Nadam se da vam se ovo svidjelo, možete koristiti odjeljak komentara da mi postavljate pitanja.
Preporučuje se:
Žiroskop zabava s neopikselnim prstenom: 4 koraka (sa slikama)
Zabava sa žiroskopom s neopikselnim prstenom: U ovom ćemo vodiču koristiti žiroskop MPU6050, prsten od neopiksela i arduino za izradu uređaja koji svijetli LED diode prema kutu nagiba. Ovo je jednostavan i zabavan projekt. biti sastavljen na osnovnoj ploči
Pomodoro mjerač vremena sa LED prstenom: 5 koraka
Pomodoro mjerač vremena sa LED prstenom: Za svaki ITTT-projekt unesite različite varijacije Pomodoro tajmera. De Pomodoro " tehnika " je een tijdmanagementmethode die gebruikers can can help om grote projecten in kleine stappen te verdelen en regelmatig pauze te houden. Hierbij
Arduino povezivanje s ultrazvučnim senzorom i beskontaktnim temperaturnim senzorom: 8 koraka
Arduino povezivanje s ultrazvučnim senzorom i beskontaktnim temperaturnim senzorom: Danas proizvođači, programeri preferiraju Arduino za brzi razvoj prototipova projekata. Arduino je elektronička platforma otvorenog koda zasnovana na hardveru i softveru koji se lako koristi. Arduino ima vrlo dobru korisničku zajednicu. U ovom projektu
Uradi sam: Mini -senzorska kutija montirana na plafon sa fokusiranim senzorom pokreta: 4 koraka
Uradi sam: Mini -senzorska kutija postavljena na plafon sa fokusiranim senzorom pokreta: Zdravo. Prije nekog vremena pomagao sam svom prijatelju s konceptom pametne kuće i stvorio mini kutiju senzora prilagođenog dizajna koja se može montirati na strop u rupu 40x65 mm. Ova kutija pomaže u: • mjerenju intenziteta svjetla • mjerenju vlažnog
LED traka aktivirana senzorom pokreta s tajmerom: 6 koraka (sa slikama)
LED traka s tajmerom aktivirana senzorom pokreta: Pozdrav svima! Zaista sam sretan što sada pišem još jedno uputstvo. Ovaj projekat je nastao kada me prije nekoliko mjeseci kontaktirao kolega sa instrukcijama (?!) (David @dducic) tražeći pomoć u dizajnu. Pa evo originalne specifikacije: & q