
Satura rādītājs:
2025 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2025-01-23 14:59



Šajā apmācībā mēs spēlēsim ar žestu sensoru (APDS-9960) un neopikselu gredzenu, lai uzzinātu, kā tos abus apvienot, izmantojot Arduino UNO.
Galaprodukts reaģēs uz žestiem pa kreisi un pa labi, animējot gaismas kustību pa labi vai pa kreisi, un uz augšupvērstiem žestiem, mainot gaismas diožu krāsu.
Nākamajās darbībās jūs īsumā apskatīsit detaļu sarakstu un to, kā savienot komponentus. Un tad mēs soli pa solim pārskatīsim kodu, lai uzzinātu, kā tas darbojas.
1. darbība: sastāvdaļas
1. Arduino UNO
2. usb kabelis
3. APDS9960 žestu sensors (https://www.sparkfun.com/products/12787)
4. 24 ledus neopikseļu gredzens (https://www.adafruit.com/product/1586)
5. vīriešu-sieviešu, vīriešu-vīriešu maizes dēļu kabeļi
6. maizes dēlis
7. 5 V barošanas avots LED gredzenam (es izmantoju 4 bateriju aizmuguri)
8. Lai piestiprinātu neopikseļu gredzenu pie maizes dēļa, pie tā jāpielodē trīs tapas: GND, PWR un vadības tapa. Šim nolūkam jums būs nepieciešams lodāmurs un plūsma
Šeit galvenie komponenti ir žestu sensors APDS-9960 un 24 neopikseļu gredzens. Jūs varat pārslēgt dažādus arduinos, USB kabeļu barošanas avotus un maizes dēļus, kā vēlaties.
2. darbība: montāža un augšupielāde
Montāža
Pirms darba sākšanas pārliecinieties, vai uz galda ir visas sastāvdaļas. Mums būs daži jauki soļi, kas jāievēro:). Es arī pievienoju Fritzing shematiku kā attēlu un arī fritzing formātā.
1. Lodēt 3 ārējās tapas pie neopikseļu gredzena (GND, PWR, vadības tapa)
2. piestipriniet neopikselu gredzenu pie maizes dēļa
3. pievienojiet APDS9960 sensoru pie maizes dēļa
4. pievienojiet pamatni: akumulatoru, arduino UNO, APDS9960 un neopikseli maizes dēļa zemei
5. pievienojiet strāvu: arduino UNO 3V līdz APDS9960 strāvas tapai, neopikselu - akumulatora jaudai
6. pievienojiet neopikselu vadības tapu arduino D6 tapai
7. savienojiet APDS9960 SDA un SCL attiecīgi ar A4 un A5
8. pievienojiet APDS9960 pārtraukšanas tapu arduino D2
Koda augšupielāde
Pirmkārt, jums būs jālejupielādē un jāinstalē nepieciešamās arduino bibliotēkas:
1. Neopikselu gredzenu bibliotēka:
2. Žestu sensoru bibliotēka:
Ja jūs nezināt, kā instalēt arduino bibliotēkas, skatiet šo apmācību.
Kad esat lejupielādējis un instalējis iepriekš minētās bibliotēkas, varat klonēt vai lejupielādēt manu arduino krātuvi, kas atrodas šeit: https://github.com/danionescu0/arduino, un mēs izmantosim šo skici: https://github.com/danionescu0 /arduino/tree/master/project/neopixel_ring_gestures
Nākamajā sadaļā es iegulšu kodu tieši šajā apmācībā, tāpēc, ja vēlaties, varat to nokopēt un ielīmēt no turienes.
Visbeidzot pievienojiet arduino datoram, izmantojot USB kabeli, ievietojiet 1,5 V baterijas akumulatorā un augšupielādējiet skici arduino.
3. darbība. Kā tas darbojas?
Šajā pēdējā daļā mēs uzzināsim, kā šie komponenti tiek apvienoti kopā, kā izmantot to bibliotēkas un kā esmu strukturējis savu kodu:
Vispirms ātri apskatīsim sensoru un izmantotās neopikselu bibliotēkas API metodes
1. Neopixel API no adafruit
No šīs bibliotēkas mēs izmantosim metodes, kas kontrolē atsevišķu LED krāsu un tās pielieto
- iekļaut bibliotēku:
#iekļaut
- pasludināt bibliotēku
#define NEOPIXED_CONTROL_PIN 6
#define NUM_LEDS 24 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);
- palaist
#rakstiski iestatīšanas bloka iekšpusē
void setup () {strip.begin (); # varbūt šeit ir citas lietas #…. }
- izgaismojiet atsevišķus pikseļus un pēc tam izmantojiet visas izmaiņas joslā (atveidojiet to savā veidā)
# iestatiet pikseli 0 sarkanu
strip.setPixelColor (0, strip. Color (255, 0, 0)); # iestatiet 1. pikseļu kā zaļu joslu. setPixelColor (1, sloksne. Krāsa (0, 255, 0)); # iestatiet 2. pikseļu kā zilu sloksni.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();
2. APDS 9960 žestu sensors
No šīs bibliotēkas mēs izmantosim funkciju "lasīt žestu". Šī funkcija varēs atšķirt komandas no kreisās-labās, augšupvērstās un tuvās. Šeit ir triks, mēs nepārtraukti neprasīsim sensoram pēdējo uztverto žestu. Dēlis spēj “pingēt”, pārtraucot, ka ir atrasts žests.
- iekļaut bibliotēku, līdzīgi neopikselim
- pasludiniet bibliotēku par pārtraukuma tapu un pārtraukuma karodziņu
#define APDS9960_INT 2
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); int isr_flag = 0;
- inicializējiet bibliotēku, parasti iestatīšanas funkcijā
anulēts iestatījums ()
{ # pasludiniet pārtraukuma tapu kā INPUT un pievienojiet tai funkciju pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 inicializācija pabeigta"); } else {Serial.println ("APDS-9960 init laikā radās problēma!"); } # inicializējiet citas lietas, iespējams}
- definējiet pārtraukšanas funkciju, šeit mēs iestatīsim tikai karodziņu
void interruptRoutine () {
isr_flag = 1; }
- cilpas funkcijas iekšpusē periodiski pārbaudiet karodziņu, lai redzētu, vai ir konstatēts žests
tukša cilpa ()
{ # pārbaudiet karodziņu, ja (isr_flag == 1) { # ja karogs ir iestatīts, noņemiet pārtraukumu, veiciet nepieciešamo apstrādi iekšā handleGesture () funkcija # un pēc tam atiestatiet karogu un atkārtoti pievienojiet pārtraukuma detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # varbūt kāds cits kods šeit}
- definējiet funkciju handleGesture (), kur mēs varam lūgt pēdējo žestu
void handleGesture () {
# ja nav pieejams žests, atgriešanās, tā ir tikai droša pārbaude, ja (! apds.isGestureAvailable ()) {return; } # nolasa pēdējo žestu, salīdzina ar zināmajiem un izdrukā ziņojumu slēdzi (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); pārtraukums; gadījums DIR_DOWN: Serial.println ("DOWN"); pārtraukums; gadījums DIR_LEFT: Serial.println ("LEFT"); pārtraukums; gadījums DIR_RIGHT: Serial.println ("RIGHT"); pārtraukums; gadījums DIR_FAR: Serial.println ("FAR"); pārtraukums; }}
Tagad apskatīsim visu kodu darbībā:
Tāpēc es esmu izskaidrojis žestu sensora un neopikselu gredzena bāzes API, tagad apkoposim lietas:
Algoritms darbojas šādi:
- inicializējiet bibliotēkas (skatiet kodu iepriekš)
- izveidojiet LED intensitātes masīvu, ko sauc par "ledStates". Šajā masīvā būs 24 gaismas intensitātes, kas sakārtotas dilstošā veidā no 150 līdz 2
- galvenās cilpas iekšpusē pārbaudiet, vai pārtraukuma tapa ir mainīta, ja ir pienācis laiks mainīt LED animāciju vai krāsu
- funkcija "handleGesture ()" pārbauda pēdējo žestu un izsauc funkciju "toggleColor" augšupvērstiem žestiem vai nosaka globālo mainīgo "ledDirection" žestiem pa kreisi - pa labi
- funkcija "toggleColor ()" vienkārši maina globālo mainīgo ar nosaukumu "colorSelection" ar vienu no vērtībām 0, 1, 2
- arī galvenās cilpas funkcijas iekšpusē cita funkcija ar nosaukumu "animateLeds ();" tiek saukts. Šī funkcija pārbauda, vai ir pagājušas 100 milisekundes, un, ja tā, tā rotē gaismas diodes, izmantojot funkciju "rotateLeds ()", un pēc tam tos pārzīmē
- "rotateLeds ()" "rotēs" gaismas diodes uz priekšu vai atpakaļ, izmantojot citu masīvu ar nosaukumu "intermediateLedStates".
Rotācijas efekts izskatīsies šādi:
# pēc inicializācijas
{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ēc rotateLeds () sauc par {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ēc rotateLeds () tiek izsaukts vēlreiz {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # un tā tālāk
Šim nolūkam vispirms tiek izveidots jauns masīvs un jaunās pozīcijās tiek kopēta vecā LED intensitāte (palieliniet pozīciju vai samaziniet to). Pēc tam tas pārraksta masīvu "ledStates" ar "intermediateLedStates", tāpēc process turpināsies vēl pēc 100 milisekundēm.
#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, NEOX SparkFun_APDS9960 apds = SparkFun_APDS9960 (); neparakstīts ilgi lastLedChangeTime = 0; īss ledDirection = 0; īsa krāsaSelection = 0; baitu 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 ("Programma sākta"); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 inicializācija pabeigta"); } else {Serial.println ("APDS-9960 init laikā radās problēma!"); } lastLedChangeTime = milis (); Serial.println ("Init veiksmīgi"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * Tas apstrādās žestus no APDS9960 sensora * Augšup un lejup vērstie žesti izsauks pārslēgšanu Krāsu funkcija * Žesti pa kreisi un pa labi mainīs LED animāciju * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); pārtraukums; gadījums DIR_DOWN: Serial.println ("DOWN"); toggleColor (); pārtraukums; gadījums DIR_LEFT: ledDirection = 1; Serial.println ("LEFT"); pārtraukums; gadījums DIR_RIGHT: ledDirection = -1; Serial.println ("RIGHT"); pārtraukums; gadījums DIR_FAR: ledDirection = 0; Serial.println ("FAR"); pārtraukums; }} / ** * Mainīt pašreizējo gaismas diodes krāsu * Katru reizi, kad šī funkcija tiek izsaukta, tiks mainīts LED stāvoklis * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } cits if (colorSelection == 1) {colorSelection = 2; } cits {colorSelection = 0; }} / ** * Animācija darbosies pēc LED_SPEED_STEP_INTERVAL milisiem; } rotateLeds (); for (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates ))); strip.show (); } lastLedChangeTime = milis (); /**, 0, 0}.]; par (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } par (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } else {intermediateLedStates [i + 1] = ledStates ; }} cits {if (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } else {intermediateLedStates [i - 1] = ledStates ; }}} priekš (int i = 0; i <NUM_LEDS; i ++) {ledStates = starpposmaLedStates ; }} uint32_t getColor (int intensitāte) {switch (colorSelection) {case 0: return strip. Color (intensitāte, 0, 0); 1. gadījums: atgriešanās sloksne. Krāsa (0, intensitāte, 0); noklusējums: atgriešanas josla. Krāsa (0, 0, intensitāte); }}
Es ceru, ka jums tas patika, jūs varat izmantot komentāru sadaļu, lai uzdotu man jautājumus.
Ieteicams:
Smart Desk LED gaisma - Viedais apgaismojums ar Arduino - Neopikseļu darbvieta: 10 soļi (ar attēliem)

Smart Desk LED gaisma | Viedais apgaismojums ar Arduino | Neopikselu darbvieta: tagad mēs daudz laika pavadām mājās, mācāmies un strādājam virtuāli, kāpēc gan nepalielināt mūsu darba telpu, izmantojot pielāgotu un gudru apgaismojuma sistēmu, kuras pamatā ir Arduino un Ws2812b gaismas diodes. Šeit es jums parādīšu, kā veidot savu viedo Galda LED gaisma, kas
Attāluma tuvuma mērīšana ar žestu sensoru APDS9960: 6 soļi

Attāluma tuvuma mērīšana ar žestu sensoru APDS9960: šajā apmācībā mēs iemācīsimies izmērīt attālumu, izmantojot žestu sensoru APDS9960, arduino un Visuino. Noskatieties video
Neopikseļu pulkstenis ar trim neopikseļu gredzeniem: 7 soļi

Neopikseļu pulkstenis ar trim neopikseļu gredzeniem: Stīva Menlija izcilā Neo Pixel pulksteņa radīšana lika man izveidot šo instrukciju par to, kā izveidot līdzīgu pulksteni par vismazāko naudas summu. (Svarīgs holandiešu ieradums vienmēr cenšas ietaupīt naudu ;-)) Es uzzināju, ka
Kā lietot APDS9960 žestu sensoru ar Arduino: 7 soļi

Kā lietot APDS9960 žestu sensoru ar Arduino: Šajā apmācībā mēs uzzināsim, kā lietot APDS9960 žestu sensoru ar Arduino, lai parādītu roku norādes OLED displejā, izmantojot Visuino programmatūru. Noskatieties video
DF žestu atpazīšanas sensoru jaunā diena: 5 soļi

DF žestu atpazīšanas sensoru jaunā diena: Pirms pāris dienām es saņēmu žestu atpazīšanas sensoru, kā redzams attēlā. Es to izmantoju pāris dienas, esmu diezgan pārliecināts, ka šī Gravity: Gesture & Skārienjutīgais sensors ir klasisks darbs! Žestu atpazīšana, kas vienmēr ir aprīkota ar fantastisku, foršu