Πίνακας περιεχομένων:

Έλεγχος δακτυλίου led Neopixel με αισθητήρα χειρονομίας: 3 βήματα (με εικόνες)
Έλεγχος δακτυλίου led Neopixel με αισθητήρα χειρονομίας: 3 βήματα (με εικόνες)

Βίντεο: Έλεγχος δακτυλίου led Neopixel με αισθητήρα χειρονομίας: 3 βήματα (με εικόνες)

Βίντεο: Έλεγχος δακτυλίου led Neopixel με αισθητήρα χειρονομίας: 3 βήματα (με εικόνες)
Βίντεο: #5 TINKERCAD LED-ΜΠΑΤΑΡΙΑ!!! 2024, Νοέμβριος
Anonim
Image
Image
Συναρμολόγηση & Μεταφόρτωση
Συναρμολόγηση & Μεταφόρτωση

Σε αυτό το σεμινάριο θα παίξουμε με έναν αισθητήρα χειρονομίας (APDS-9960) και ένα δαχτυλίδι neopixel για να μάθουμε πώς να τα συνδυάζουμε και τα δύο χρησιμοποιώντας ένα Arduino UNO.

Το τελικό προϊόν θα ανταποκρίνεται στις κινήσεις αριστερά - δεξιά κινούμενες κινήσεις led δεξιά ή αριστερά και σε χειρονομίες προς τα κάτω αλλάζοντας χρώμα leds.

Στα επόμενα βήματα, θα κάνετε μια σύντομη επισκόπηση της λίστας μερών και του τρόπου σύνδεσης των στοιχείων. Στη συνέχεια, θα αναθεωρήσουμε τον κώδικα βήμα προς βήμα για να μάθουμε πώς λειτουργεί.

Βήμα 1: Στοιχεία

1. Arduino UNO

2. καλώδιο usb

3. Αισθητήρας χειρονομίας APDS9960 (https://www.sparkfun.com/products/12787)

4. Δαχτυλίδι led 24 neopixel led (https://www.adafruit.com/product/1586)

5. αρσενικά-θηλυκά, αρσενικά-αρσενικά καλώδια σανίδων

6. σανίδα ψωμιού

7. Τροφοδοσία 5 V για το δακτύλιο led (χρησιμοποιώ 4 μπαταρίες πίσω)

8. Για να συνδέσετε το δακτύλιο neopixel στο breadboard θα πρέπει να κολλήσετε τρεις αρσενικές καρφίτσες σε αυτό: GND, PWR και καρφίτσα ελέγχου. Για αυτό θα χρειαστείτε κολλητήρι και ροή

Τα κύρια στοιχεία εδώ είναι ο αισθητήρας χειρονομίας APDS-9960 και ο δακτύλιος 24 neopixel. Μπορείτε να αλλάξετε διαφορετικά arduinos, τροφοδοτικά καλωδίων usb και σανίδες ψωμιού όπως θέλετε.

Βήμα 2: Συναρμολόγηση και μεταφόρτωση

Συνέλευση

Πριν ξεκινήσετε, βεβαιωθείτε ότι έχετε όλα τα στοιχεία στο τραπέζι σας. Θα έχουμε μερικά ωραία βήματα να ακολουθήσουμε:). Έχω επισυνάψει επίσης το σχήμα Fritzing ως εικόνα και επίσης σε εκπληκτική μορφή.

1. Συγκολλήστε 3 αρσενικές ακίδες στο δακτύλιο neopixel (GND, PWR, καρφίτσα ελέγχου)

2. συνδέστε το δακτύλιο neopixel στο breadboard

3. συνδέστε τον αισθητήρα APDS9960 στην πλάκα ψωμιού

4. Συνδέστε τις βάσεις: μπαταρία, arduino UNO, APDS9960 και neopixel στο έδαφος του breadboard

5. Συνδέστε το τροφοδοτικό: arduino UNO 3V στο APDS9960 pin pin, neopixel στην μπαταρία

6. συνδέστε τον πείρο ελέγχου neopixel στον ακροδέκτη arduino D6

7. συνδέστε το SDA και το SCL του APDS9960 στο A4 και A5 αντίστοιχα

8. συνδέστε τον πείρο διακοπής APDS9960 στο arduino D2

Μεταφόρτωση κώδικα

Πρώτα απ 'όλα θα πρέπει να κατεβάσετε και να εγκαταστήσετε τις απαραίτητες βιβλιοθήκες arduino:

1. Βιβλιοθήκη δακτυλίων Neopixel:

2. Βιβλιοθήκη αισθητήρα χειρονομίας:

Εάν δεν ξέρετε πώς να εγκαταστήσετε βιβλιοθήκες arduino, δείτε αυτό το σεμινάριο.

Αφού κατεβάσετε και εγκαταστήσετε τις παραπάνω βιβλιοθήκες, μπορείτε να κάνετε κλωνοποίηση ή λήψη του αποθετηρίου arduino που βρίσκεται εδώ: https://github.com/danionescu0/arduino και θα χρησιμοποιήσουμε αυτό το σκίτσο: https://github.com/danionescu0 /arduino/tree/master/projects/neopixel_ring_gestures

Στην επόμενη ενότητα θα ενσωματώσω τον κώδικα απευθείας σε αυτό το σεμινάριο, οπότε αν θέλετε μπορείτε να τον αντιγράψετε και να τον επικολλήσετε από εκεί.

Τέλος, συνδέστε το arduino στον υπολογιστή χρησιμοποιώντας το καλώδιο usb, τοποθετήστε μπαταρίες 1,5 v στη μπαταρία και ανεβάστε το σκίτσο στο arduino.

Βήμα 3: Πώς λειτουργεί;

Σε αυτό το τελευταίο μέρος θα μάθουμε πώς συνδυάζονται αυτά τα στοιχεία, πώς χρησιμοποιούνται οι βιβλιοθήκες τους και πώς δομήσα τον κώδικά μου:

Αρχικά ας ρίξουμε μια γρήγορη ματιά στον αισθητήρα και τις μεθόδους API βιβλιοθήκης neopixel που θα χρησιμοποιήσουμε

1. Neopixel API από adafruit

Από αυτήν τη βιβλιοθήκη θα χρησιμοποιούμε τις μεθόδους που ελέγχουν το χρώμα του ατομικού led και θα τις εφαρμόζουμε

- περιλαμβάνει τη βιβλιοθήκη:

#περιλαμβάνω

- δηλώστε τη βιβλιοθήκη

#define NEOPIXED_CONTROL_PIN 6

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

- αρχικοποίηση

#τυπικά μέσα στο μπλοκ εγκατάστασης

void setup () {strip.begin (); # ίσως κάποια άλλα πράγματα εδώ #…. }

- φωτίστε μεμονωμένα εικονοστοιχεία και στη συνέχεια εφαρμόστε όλες τις τροποποιήσεις στη λωρίδα (αποδώστε το με έναν τρόπο)

# ρυθμίστε το pixel 0 να είναι κόκκινο

strip.setPixelColor (0, strip. Color (255, 0, 0)); # ρυθμίστε το pixel 1 να είναι πράσινο strip.setPixelColor (1, strip. Color (0, 255, 0)); # ρυθμίστε το pixel 2 να είναι μπλε strip.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. Αισθητήρας χειρονομίας APDS 9960

Από αυτήν τη βιβλιοθήκη θα χρησιμοποιούμε τη λειτουργία "ανάγνωση χειρονομίας". Αυτή η λειτουργία θα είναι σε θέση να διακρίνει μεταξύ εντολών αριστερά-δεξιά, πάνω-κάτω, κοντά-μακριά. Υπάρχει ένα τέχνασμα εδώ, δεν πρόκειται να ζητάμε συνεχώς από τον αισθητήρα για την τελευταία κίνηση που έγινε αντιληπτή. Ο πίνακας έχει τη δυνατότητα να "πινγκάρει" μέσω μιας διακοπής που βρέθηκε μια χειρονομία.

- περιλαμβάνει τη βιβλιοθήκη, παρόμοια με το neopixel

- δηλώστε τη βιβλιοθήκη τον ακροδέκτη διακοπής και τη σημαία διακοπής

#define APDS9960_INT 2

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

- προετοιμάστε τη βιβλιοθήκη, συνήθως μέσα στη λειτουργία εγκατάστασης

void setup ()

{ # δηλώστε τον ακροδέκτη διακοπής ως INPUT και επισυνάψτε μια συνάρτηση σε αυτόν pinMode (APDS9960_INT, INPUT). attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Η προετοιμασία APDS-9960 ολοκληρώθηκε"); } else {Serial.println ("Κάτι πήγε στραβά κατά τη διάρκεια του APDS-9960 init!"); } # αρχικοποιήστε άλλα πράγματα ίσως}

- ορίστε τη λειτουργία διακοπής, εδώ θα ορίσουμε μόνο μια σημαία

void interruptRoutine () {

isr_flag = 1; }

- μέσα στη λειτουργία βρόχου ελέγχετε περιοδικά τη σημαία για να δείτε αν έχει εντοπιστεί κάποια κίνηση

κενός βρόχος ()

{ # ελέγξτε τη σημαία εάν (isr_flag == 1) { # εάν η σημαία έχει οριστεί, αφαιρέστε τη διακοπή, πραγματοποιήστε την απαραίτητη επεξεργασία μέσα στη συνάρτηση handleGesture () # και, στη συνέχεια, επαναφέρετε τη σημαία και επανατοποθετήστε τη διακοπή detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # κάποιος άλλος κωδικός εδώ ίσως}

- ορίστε τη λειτουργία handleGesture () όπου μπορούμε να ζητήσουμε την τελευταία χειρονομία

void handleGesture () {

# εάν καμία χειρονομία δεν είναι εφικτή επιστροφή, αυτό είναι μόνο ένας ασφαλής έλεγχος εάν (! apds.isGestureAvailable ()) {επιστρέψει? } # διαβάζει την τελευταία χειρονομία, συγκρίνεται με τις γνωστές και εκτυπώνει έναν διακόπτη μηνυμάτων (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); Διακοπή; θήκη DIR_DOWN: Serial.println ("DOWN"); Διακοπή; θήκη DIR_LEFT: Serial.println ("ΑΡΙΣΤΕΡΑ"); Διακοπή; θήκη DIR_RIGHT: Serial.println ("RIGHT"); Διακοπή; θήκη DIR_FAR: Serial.println ("FAR"); Διακοπή; }}

Τώρα ας δούμε ολόκληρο τον κώδικα σε δράση:

Έτσι εξήγησα το βασικό API του αισθητήρα χειρονομίας και του δακτυλίου neopixel, τώρα ας ενώσουμε τα πράγματα:

Ο αλγόριθμος λειτουργεί ως εξής:

- προετοιμάστε τις βιβλιοθήκες (δείτε τον παραπάνω κώδικα)

- Δημιουργήστε μια σειρά εντάσεων led που ονομάζονται "ledStates". Αυτός ο πίνακας θα περιέχει 24 εντάσεις led που είναι διατεταγμένες κατά φθίνουσα σειρά από 150 σε 2

- μέσα στον κύριο βρόχο ελέγξτε αν έχει τροποποιηθεί ο πείρος διακοπής, αν ναι, ήρθε η ώρα να αλλάξετε την κίνηση ή το χρώμα του led

- η λειτουργία "handleGesture ()" ελέγχει την τελευταία χειρονομία και καλεί τη λειτουργία "toggleColor" για χειρονομίες ΕΠΑΝΩ -ΚΑΤΩ ή ορίστε μια καθολική μεταβλητή "ledDirection" για ΑΡΙΣΤΕΡΕΣ - ΔΕΞΙΕΣ χειρονομίες

- η συνάρτηση "toggleColor ()" αλλάζει απλώς μια καθολική μεταβλητή που ονομάζεται "colorSelection" με μία από τις τιμές 0, 1, 2

- επίσης μέσα στη λειτουργία κύριου βρόχου μια άλλη συνάρτηση που ονομάζεται "animateLeds ();" λέγεται. Αυτή η συνάρτηση ελέγχει εάν πέρασαν 100 χιλιοστά του δευτερολέπτου και αν ναι, περιστρέφει τα led χρησιμοποιώντας τη συνάρτηση "rotateLeds ()" και στη συνέχεια τα ξανασχεδιάζει

- το "rotateLeds ()" θα "περιστρέψει" τα led προς τα εμπρός ή προς τα πίσω χρησιμοποιώντας έναν άλλο πίνακα που ονομάζεται "intermediateLedStates".

Το "εφέ" περιστροφής θα μοιάζει με αυτό:

# μετά την προετοιμασία

{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}? # after rotateLeds () ονομάζεται {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 () καλείται ξανά {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}; # και ούτω καθεξής

Για αυτό δημιουργεί πρώτα τη νέα συστοιχία και αντιγράφει τις παλιές εντάσεις led στις νέες θέσεις (αυξήστε τη θέση ή μειώστε τη). Στη συνέχεια αντικαθιστά τον πίνακα "ledStates" με το "intermediateLedStates", έτσι η διαδικασία θα συνεχιστεί μετά από άλλα 100 χιλιοστά του δευτερολέπτου.

#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 (NEOPLEX), NEOPLEX SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned long lastLedChangeTime = 0; σύντομο 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}; int isr_flag = 0; void setup () {Serial.begin (9600); Serial.println ("Έναρξη προγράμματος"); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Η προετοιμασία APDS-9960 ολοκληρώθηκε"); } else {Serial.println ("Κάτι πήγε στραβά κατά τη διάρκεια του APDS-9960 init!"); } lastLedChangeTime = millis (); Serial.println ("Έναρξη με επιτυχία"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * Αυτό θα χειρίζεται χειρονομίες από τον αισθητήρα APDS9960 * Οι χειρονομίες πάνω και κάτω θα καλούν τη λειτουργία εναλλαγής * Χρώμα * Οι χειρονομίες αριστερά και δεξιά θα αλλάξουν το led animation * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return ? } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); Διακοπή; θήκη DIR_DOWN: Serial.println ("DOWN"); toggleColor (); Διακοπή; θήκη DIR_LEFT: ledDirection = 1; Serial.println ("ΑΡΙΣΤΕΡΑ"); Διακοπή; θήκη DIR_RIGHT: ledDirection = -1; Serial.println ("ΔΕΞΙΑ"); Διακοπή; θήκη DIR_FAR: ledDirection = 0; Serial.println ("FAR"); Διακοπή; }} / ** * Αλλαγή τρέχοντος χρώματος leds * Κάθε φορά που καλείται αυτή η λειτουργία αλλάζει την κατάσταση leds * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Η κινούμενη εικόνα θα εκτελεστεί μετά από LED_SPEED_STEP_INTERVAL χιλιοστά * Πρώτα καλείται η λειτουργία rotateLeds και, στη συνέχεια, τα χρώματα leds ορίζονται χρησιμοποιώντας τη λωρίδα api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return ? } rotateLeds (); για (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates )); strip.show (); } lastLedChangeTime = millis (); } /** * Χρησιμοποιώντας έναν δευτερεύον πίνακα "intermediateLedStates", οι εντάσεις των leds κινούνται, 0, 0} και το ledDirection είναι 1 *, στη συνέχεια, αφού αυτή η συνάρτηση ονομάζεται "ledStates", ο πίνακας είναι {0, 100, 80, 60, 0, 0} που προσομοιώνει ένα φαινόμενο περιστροφής */ void rotateLeds () {byte intermediateLedStates [NUM_LEDS]; για (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } για (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 ; }}} για (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (ένταση int) {switch (colorSelection) {περίπτωση 0: λωρίδα επιστροφής. Χρώμα (ένταση, 0, 0); θήκη 1: λωρίδα επιστροφής. Χρώμα (0, ένταση, 0). προεπιλογή: λωρίδα επιστροφής. Χρώμα (0, 0, ένταση); }}

Ελπίζω να σας άρεσε αυτό, μπορείτε να χρησιμοποιήσετε την ενότητα σχολίων για να μου κάνετε ερωτήσεις.

Συνιστάται: