- Απαιτούμενα συστατικά
- Εισαγωγή στον APDS-9960 Digital Proximity RGB & Gesture Sensor
- Διάγραμμα κυκλώματος
- Προγραμματισμός του Arduino για χειρονομία και ανίχνευση χρωμάτων
Σήμερα, τα περισσότερα τηλέφωνα διαθέτουν λειτουργία ελέγχου χειρονομίας για άνοιγμα ή κλείσιμο οποιασδήποτε εφαρμογής, έναρξη μουσικής, παρακολούθηση κλήσεων κ.λπ. Πρόκειται για μια πολύ εύχρηστη λειτουργία για εξοικονόμηση χρόνου και φαίνεται επίσης δροσερό να ελέγχετε οποιαδήποτε συσκευή με χειρονομίες. Χρησιμοποιήσαμε προηγουμένως επιταχυνσιόμετρο για την κατασκευή ρομπότ ελεγχόμενης χειρονομίας και ποντικιού αέρα ελεγχόμενης χειρονομίας Αλλά σήμερα μαθαίνουμε να συνδέουμε έναν αισθητήρα χειρονομίας APDS9960 με το Arduino. Αυτός ο αισθητήρας διαθέτει επίσης έναν αισθητήρα RGB για την ανίχνευση χρωμάτων, ο οποίος θα χρησιμοποιηθεί επίσης σε αυτό το σεμινάριο. Επομένως, δεν χρειάζεται να χρησιμοποιήσετε ξεχωριστούς αισθητήρες για την ανίχνευση χειρονομίας και χρώματος, αν και είναι διαθέσιμος ένας αποκλειστικός αισθητήρας για την ανίχνευση χρώματος - αισθητήρας χρώματος TCS3200 που έχουμε ήδη χρησιμοποιήσει με την Arduino για την κατασκευή μιας μηχανής διαλογής χρωμάτων.
Απαιτούμενα συστατικά
- Arduino UNO
- APDS9960 RGB και αισθητήρας χειρονομίας
- LCD 16x2
- Διακόπτης DPDT
- 100K δοχείο και 10K αντίσταση
- Καλώδια βραχυκύκλωσης
Εισαγωγή στον APDS-9960 Digital Proximity RGB & Gesture Sensor
Το APDS9960 είναι ένας αισθητήρας πολλαπλών λειτουργιών. Μπορεί να ανιχνεύσει κινήσεις, φως περιβάλλοντος και τιμές RGB στο φως. Αυτός ο αισθητήρας μπορεί επίσης να χρησιμοποιηθεί ως αισθητήρας εγγύτητας και χρησιμοποιείται κυρίως σε smartphone, για να απενεργοποιήσετε την οθόνη αφής ενώ παρακολουθείτε μια κλήση.
Αυτός ο αισθητήρας αποτελείται από τέσσερις φωτοδιόδους. Αυτές οι φωτοδιόδους ανιχνεύουν την ανακλώμενη ενέργεια IR που μεταδίδεται από ένα ενσωματωμένο LED. Έτσι, όταν πραγματοποιείται οποιαδήποτε χειρονομία, τότε αυτή η ενέργεια υπερύθρων παρεμποδίζεται και αντανακλά πίσω στον αισθητήρα, τώρα ο αισθητήρας ανιχνεύει τις πληροφορίες (κατεύθυνση, ταχύτητα) σχετικά με τη χειρονομία και τις μετατρέπει σε ψηφιακές πληροφορίες. Αυτός ο αισθητήρας μπορεί να χρησιμοποιηθεί για τη μέτρηση της απόστασης του εμποδίου ανιχνεύοντας το ανακλώμενο φως IR. Διαθέτει φίλτρα αποκλεισμού UV και IR για την ανίχνευση χρωμάτων RGB και παράγει δεδομένα 16 bit για κάθε χρώμα.
Το pin-out του αισθητήρα APDS-9960 φαίνεται παρακάτω. Αυτός ο αισθητήρας λειτουργεί σε πρωτόκολλο επικοινωνίας I 2 C. Καταναλώνει ρεύμα 1μA και τροφοδοτείται από 3.3V, οπότε προσέξτε και μην το συνδέσετε με πείρο 5V. Ο ακροδέκτης INT εδώ είναι ο διακόπτης διακοπής, ο οποίος χρησιμοποιείται για την οδήγηση της επικοινωνίας I 2 C. Και ο ακροδέκτης VL είναι προαιρετικός πείρος τροφοδοσίας για το ενσωματωμένο LED, εάν ο βραχυκυκλωτήρας PS δεν είναι συνδεδεμένος. Εάν ο βραχυκυκλωτήρας PS είναι κλειστός, τότε χρειάζεται μόνο να τροφοδοτήσετε τον πείρο VCC, θα παρέχει ισχύ και στα δύο - τη μονάδα και το LED IR
Διάγραμμα κυκλώματος
Οι συνδέσεις για το APDS960 με το Arduino είναι πολύ απλές. Θα χρησιμοποιήσουμε ένα κουμπί DPDT για εναλλαγή μεταξύ των δύο λειτουργιών RGB Sensing και Gesture Sensing. Πρώτον, οι καρφίτσες επικοινωνίας I2C SDA και SCL του APDS9960 συνδέονται με τους ακροδέκτες Arduino A4 και A5 αντίστοιχα. Όπως αναφέρθηκε νωρίτερα, η τάση λειτουργίας για τον αισθητήρα είναι 3.3v έτσι, τα VCC και GND του APDS9960 συνδέονται με 3.3V και GND του Arduino. Ο ακροδέκτης διακοπής (INT) του APDS9960 συνδέεται με τον ακροδέκτη D2 του Arduino.
Για LCD, οι ακίδες δεδομένων (D4-D7) συνδέονται με ψηφιακές ακίδες D6-D3 του Arduino και οι ακίδες RS και EN συνδέονται με D6 και D7 του Arduino. Το V0 της LCD συνδέεται με το δοχείο και ένα δοχείο 100K χρησιμοποιείται για τον έλεγχο της φωτεινότητας της LCD. Για τα κουμπιά DPDT χρησιμοποιήσαμε μόνο 3 ακίδες. Ο δεύτερος πείρος συνδέεται με τον πείρο D7 του Arduino για είσοδο και οι άλλοι δύο συνδέονται με το GND και το VCC ακολουθούμενο από μια αντίσταση 10K.
Προγραμματισμός του Arduino για χειρονομία και ανίχνευση χρωμάτων
Το μέρος προγραμματισμού είναι απλό και εύκολο και το πλήρες πρόγραμμα με ένα demo βίντεο παρέχεται στο τέλος αυτού του σεμιναρίου.
Πρώτα πρέπει να εγκαταστήσουμε μια βιβλιοθήκη του Sparkfun. Για να εγκαταστήσετε αυτήν τη βιβλιοθήκη, μεταβείτε στο Σκίτσο-> Συμπερίληψη βιβλιοθήκης-> Διαχείριση βιβλιοθηκών.
Τώρα στη γραμμή αναζήτησης πληκτρολογήστε "Sparkfun APDS9960" και κάντε κλικ στο κουμπί εγκατάστασης όταν δείτε τη βιβλιοθήκη.
Και είμαστε έτοιμοι να φύγουμε. Ας αρχίσουμε.
Πρώτα λοιπόν πρέπει να συμπεριλάβουμε όλα τα απαιτούμενα αρχεία κεφαλίδας. Το πρώτο αρχείο κεφαλίδας LiquidCrystal.h χρησιμοποιείται για λειτουργίες LCD. Το δεύτερο αρχείο κεφαλίδας Wire.h χρησιμοποιείται για επικοινωνία I 2 C και το τελευταίο SparkFun_APDS996.h χρησιμοποιείται για τον αισθητήρα APDS9960
#περιλαμβάνω
Τώρα στις επόμενες γραμμές έχουμε ορίσει τις ακίδες για το κουμπί και την οθόνη LCD.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Στο επόμενο τμήμα, έχουμε ορίσει μια μακροεντολή για τον πείρο διακοπής που είναι συνδεδεμένος στον ψηφιακό πείρο 2 και ένα κουμπί μεταβλητής Κατάσταση για την τρέχουσα κατάσταση του κουμπιού και isr_flag για τη ρουτίνα υπηρεσίας διακοπής.
#define APDS9960_INT 2 int κουμπίState; int isr_flag = 0;
Στη συνέχεια δημιουργείται ένα αντικείμενο για το SparkFun_APDS9960, έτσι ώστε να έχουμε πρόσβαση στις κινήσεις χειρονομίας και να ανακτήσουμε τις τιμές RGB
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
Στη λειτουργία εγκατάστασης , η πρώτη γραμμή είναι να πάρει την τιμή από το κουμπί (χαμηλή / υψηλή) και η δεύτερη & τρίτη γραμμή ορίζει τη διακοπή και τον πείρο κουμπιού ως είσοδο. Το apds.init () αρχικοποιεί τον αισθητήρα APDS9960 και το lcd.begin (16,2) αρχικοποιεί την οθόνη LCD.
άκυρη ρύθμιση () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
Στη λειτουργία βρόχου η πρώτη γραμμή παίρνει τις τιμές από το κουμπί και την αποθηκεύει στη μεταβλητή buttonState που ορίστηκε νωρίτερα. Τώρα στις επόμενες γραμμές ελέγχουμε τις τιμές από το κουμπί, εάν είναι υψηλός τότε ενεργοποιούμε τον αισθητήρα φωτός και αν είναι χαμηλός, αρχικοποιήστε τον αισθητήρα κίνησης.
Το attachInterrupt () είναι μια συνάρτηση που χρησιμοποιείται για εξωτερική διακοπή η οποία σε αυτήν την περίπτωση είναι διακοπή του αισθητήρα Το πρώτο όρισμα σε αυτήν τη συνάρτηση είναι ο αριθμός διακοπής. Στο Arduino UNO, υπάρχουν δύο ψηφιακές καρφίτσες διακοπής - 2 και 3 που υποδηλώνονται με INT.0 και INT.1. Και το συνδέσαμε με το pin 2, οπότε γράψαμε 0 εκεί. Το δεύτερο όρισμα καλεί τη συνάρτηση interruptRoutine () που ορίζεται αργότερα. Το τελευταίο επιχείρημα είναι FALLING έτσι ώστε να ενεργοποιεί τη διακοπή όταν ο πείρος πηγαίνει από το υψηλό στο χαμηλότερο. Μάθετε περισσότερα για τις διακοπές Arduino εδώ.
void loop () { buttonState = digitalRead (buttonPin); εάν (buttonState == HIGH) { apds.enableLightSensor (true); }
Στο επόμενο τμήμα, ελέγχουμε την καρφίτσα κουμπιού. Εάν είναι υψηλή, ξεκινήστε τη διαδικασία για τον αισθητήρα RGB. Στη συνέχεια, ελέγξτε αν ο αισθητήρας φωτός διαβάζει τιμές ή όχι. Εάν δεν είναι σε θέση να διαβάσει τις τιμές, τότε σε αυτήν την περίπτωση, εκτυπώστε το " Σφάλμα ανάγνωσης φωτεινών τιμών". Και αν μπορεί να διαβάσει τιμές τότε, συγκρίνετε τις τιμές των τριών χρωμάτων και όποιο είναι το υψηλότερο, εκτυπώστε αυτό το χρώμα στην οθόνη LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Σφάλμα ανάγνωσης φωτεινών τιμών"); } αλλιώς { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Κόκκινο"); καθυστέρηση (1000) lcd.clear (); } ……. ………..
Στις επόμενες γραμμές ελέγξτε ξανά την καρφίτσα κουμπιού, και αν είναι χαμηλή η διαδικασία ο αισθητήρας Gesture. Στη συνέχεια, ελέγξτε για isr_flag και αν είναι 1 τότε καλείται μια συνάρτηση detachInterrupt () . Αυτή η λειτουργία χρησιμοποιείται για να απενεργοποιήσετε τη διακοπή. Η επόμενη γραμμή καλεί το handleGesture () που είναι συνάρτηση που ορίζεται αργότερα. Στις επόμενες επόμενες γραμμές ορίστε το isr_flag στο μηδέν και επισυνάψτε τη διακοπή.
αλλιώς εάν (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); χειρολαβή χειρονομία (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Το επόμενο είναι η συνάρτηση interruptRoutine () . Αυτή η συνάρτηση χρησιμοποιείται για να μετατρέψει τη μεταβλητή isr_flag 1, έτσι ώστε η υπηρεσία διακοπής να μπορεί να αρχικοποιηθεί.
void interrupt Ρουτίνα (). { isr_flag = 1; }
Η συνάρτηση handleGesture () ορίζεται στο επόμενο μέρος. Αυτή η λειτουργία ελέγχει πρώτα για τη διαθεσιμότητα του αισθητήρα χειρονομίας. Εάν είναι διαθέσιμο τότε διαβάζει τις τιμές χειρονομίας και ελέγχει ποια κίνηση είναι (ΠΑΝΩ, ΚΑΤΩ, ΔΕΞΙΑ, ΑΡΙΣΤΕΡΑ, FAR, NEAR) και εκτυπώνει τις αντίστοιχες τιμές στην οθόνη LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); καθυστέρηση (1000) lcd.clear (); Διακοπή; υπόθεση DIR_DOWN: lcd.print ("DOWN"); καθυστέρηση (1000) lcd.clear (); Διακοπή; υπόθεση DIR_LEFT: lcd.print ("LEFT"); καθυστέρηση (1000) lcd.clear (); Διακοπή; υπόθεση DIR_RIGHT: lcd.print ("RIGHT"); καθυστέρηση (1000) lcd.clear (); Διακοπή; υπόθεση DIR_NEAR: lcd.print ("NEAR"); καθυστέρηση (1000) lcd.clear (); Διακοπή; υπόθεση DIR_FAR: lcd.print ("FAR"); καθυστέρηση (1000) lcd.clear (); Διακοπή; προεπιλογή: lcd.print ("NONE"); καθυστέρηση (1000) lcd.clear (); } } }
Τέλος, ανεβάστε τον κωδικό στο Arduino και περιμένετε να ξεκινήσει ο αισθητήρας. Τώρα, ενώ το κουμπί είναι απενεργοποιημένο σημαίνει ότι βρίσκεται σε λειτουργία χειρονομίας. Επομένως, δοκιμάστε να μετακινήσετε τα χέρια σας προς τα αριστερά, δεξιά, πάνω, κάτω. Για πολύ χειρονομία, κρατήστε το χέρι σας σε απόσταση 2-4 ίντσες από τον αισθητήρα για 2-3 δευτερόλεπτα και αφαιρέστε το. Και για σχεδόν χειρονομία κρατήστε το χέρι σας μακριά από τον αισθητήρα και στη συνέχεια πάρτε το κοντά και αφαιρέστε το.
Τώρα ενεργοποιήστε το κουμπί για να το θέσετε σε λειτουργία ανίχνευσης χρώματος και πάρτε ένα, ένα προς ένα κόκκινο, μπλε και πράσινο αντικείμενο κοντά στον αισθητήρα. Θα εκτυπώσει το χρώμα του αντικειμένου.