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

Εφαρμογή αισθητήρα χειρονομίας μη αποκλεισμού APDS9960: 5 βήματα
Εφαρμογή αισθητήρα χειρονομίας μη αποκλεισμού APDS9960: 5 βήματα

Βίντεο: Εφαρμογή αισθητήρα χειρονομίας μη αποκλεισμού APDS9960: 5 βήματα

Βίντεο: Εφαρμογή αισθητήρα χειρονομίας μη αποκλεισμού APDS9960: 5 βήματα
Βίντεο: Όλα όσα πρέπει να γνωρίζετε για Μη Επανδρωμένα Αεροσκάφη στην Ελλάδα 2024, Νοέμβριος
Anonim
Εφαρμογή αισθητήρα χειρονομίας μη αποκλεισμού APDS9960
Εφαρμογή αισθητήρα χειρονομίας μη αποκλεισμού APDS9960
Εφαρμογή αισθητήρα χειρονομίας μη αποκλεισμού APDS9960
Εφαρμογή αισθητήρα χειρονομίας μη αποκλεισμού APDS9960
Εφαρμογή αισθητήρα χειρονομίας μη αποκλεισμού APDS9960
Εφαρμογή αισθητήρα χειρονομίας μη αποκλεισμού APDS9960

Προοίμιο

Αυτό το Instructable περιγράφει λεπτομερώς τον τρόπο δημιουργίας μιας μη αποκλειστικής εφαρμογής του αισθητήρα χειρονομίας APDS9960 χρησιμοποιώντας το SparkFun_APDS-9960_Sensor_Arduino_Library.

Εισαγωγή

Οπότε πιθανώς αναρωτιέστε τι είναι το μη αποκλεισμό; Even ακόμη και μπλοκάρισμα για αυτό το θέμα;

Το πιο σημαντικό γιατί είναι σημαντικό να υπάρχει σωστό μη αποκλεισμός;

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

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

Γιατί λοιπόν είναι σημαντικό αυτό;

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

Από την πλευρά μου θέλω να δημιουργήσω μια επιτραπέζια συσκευή IoT με δυνατότητα MQTT μέσω WiFi, η οποία διαβάζει τοπικές και απομακρυσμένες τιμές θερμοκρασίας/υγρασίας, επίπεδα φωτισμού περιβάλλοντος, βαρομετρική πίεση, παρακολουθεί τον χρόνο, εμφανίζει όλες αυτές τις παραμέτρους σε οθόνη LCD, συνδέεται σε uSD κάρτα σε πραγματικό χρόνο, διαβάζω εισόδους κουμπιών, γράφω σε LED εξόδου και παρακολουθώ χειρονομίες για να ελέγχω πράγματα στην υποδομή IoT και όλα αυτά να ελέγχονται από ένα ESP8266-12.

Δυστυχώς, οι δύο μόνο πηγές της βιβλιοθήκης APDS9960 που μπορούσα να βρω ήταν οι βιβλιοθήκες SparkFun και AdaFruit, οι οποίες και οι δύο ξεσκίστηκαν από τον κώδικα εφαρμογής από το Avago (ο κατασκευαστής του ADPS9960) και διαθέτουν μια κλήση με το όνομα «readGesture» που περιέχει λίγο (1) {}. βρόχος ο οποίος όταν χρησιμοποιείται στο παραπάνω έργο προκαλεί την επαναφορά του ESP8266-12E κάθε φορά που ο αισθητήρας ADPS9960 κορεζόταν (δηλαδή όταν ένα αντικείμενο παρέμενε σε κοντινή απόσταση ή υπήρχε άλλη πηγή IR που φωτίζει τον αισθητήρα).

Κατά συνέπεια, για να επιλύσω αυτήν τη συμπεριφορά, επέλεξα να μεταφέρω την επεξεργασία των κινήσεων σε έναν δεύτερο επεξεργαστή, με τον οποίο ο ESP8266-12E έγινε ο κύριος μικροελεγκτής και αυτό το σύστημα ο υποτελής, όπως απεικονίζεται στις εικόνες 1 & 2 παραπάνω, τα διαγράμματα Επισκόπηση συστήματος και Σύσταση συστήματος αντίστοιχα Το Η εικόνα 3 δείχνει το πρωτότυπο κύκλωμα.

Προκειμένου να περιορίσω τις αλλαγές που έπρεπε να κάνω στον υπάρχοντα κώδικά μου, έγραψα επίσης μια κλάση περιτυλίγματος/βιβλιοθήκη με ευφάνταστη ονομασία «APDS9960_NonBlocking».

Αυτό που ακολουθεί είναι μια λεπτομερής εξήγηση της λύσης μη αποκλεισμού.

Τι ανταλλακτικά χρειάζομαι;

Εάν θέλετε να δημιουργήσετε τη λύση I2C που λειτουργεί με τη βιβλιοθήκη APDS9960_NonBlocking, θα χρειαστείτε τα ακόλουθα μέρη.

  1. 1 έκπτωση ATMega328P εδώ
  2. 1 έκπτωση PCF8574P εδώ
  3. 6 από 10K αντιστάσεις εδώ
  4. 4 off 1K Resistors εδώ
  5. 1 έκπτωση 1Δ914 Δίοδος εδώ
  6. 1 έκπτωση PN2222 NPN Transistor εδώ
  7. 1 έκπτωση κρύσταλλο 16MHz εδώ
  8. 2 εκ των πυκνωτών 0.1uF εδώ
  9. 1 έκπτωση ηλεκτρολυτικός πυκνωτής 1000uF εδώ
  10. 1 έκπτωση 10uF ηλεκτρολυτικός πυκνωτής εδώ
  11. 2 εκτός πυκνωτών 22pF εδώ

Εάν θέλετε να διαβάσετε την έξοδο του αισθητήρα χειρονομίας μέσω της παράλληλης διεπαφής, μπορείτε να ρίξετε το PCF8574P και τρεις αντιστάσεις 10K.

Τι λογισμικό χρειάζομαι;

Arduino IDE 1.6.9

Τι δεξιότητες χρειάζομαι;

Για να ρυθμίσετε το σύστημα, χρησιμοποιήστε τον πηγαίο κώδικα (παρέχεται) και δημιουργήστε το απαραίτητο κύκλωμα που θα χρειαστείτε τα εξής.

  • Μια ελάχιστη γνώση των ηλεκτρονικών,
  • Γνώση του Arduino και του IDE,
  • Κατανόηση του τρόπου προγραμματισμού ενός ενσωματωμένου Arduino (Δείτε το Instructable 'Programming the ATTiny85, ATTiny84 and ATMega328P: Arduino As ISP')
  • Λίγη Υπομονή.

Θέματα που καλύπτονται

  • Σύντομη επισκόπηση του κυκλώματος
  • Σύντομη επισκόπηση του λογισμικού
  • Δοκιμή της συσκευής ανίχνευσης χειρονομίας APDS9960
  • συμπέρασμα
  • βιβλιογραφικές αναφορές

Βήμα 1: Επισκόπηση κυκλώματος

Επισκόπηση κυκλώματος
Επισκόπηση κυκλώματος

Το κύκλωμα χωρίζεται σε δύο τμήματα.

  • Το πρώτο είναι η σειριακή μετατροπή I2C σε παράλληλη που πραγματοποιείται μέσω αντιστάσεων R8… 10 και IC1. Εδώ το R8… R10 έθεσε τη διεύθυνση I2C για το τσιπ επέκτασης I/O 8 bit IC1 και NXP PCF8574A. Τα έγκυρα εύρη διευθύνσεων για αυτήν τη συσκευή είναι 0x38… 0x3F αντίστοιχα. Στο παράδειγμα λογισμικού I2C που παρέχεται 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' θα πρέπει να τροποποιηθεί για να ταιριάζει σε αυτό το εύρος διευθύνσεων.
  • Όλα τα άλλα εξαρτήματα σχηματίζουν ένα Arduino Uno ενσωματωμένο σε υποτελή και έχουν τις ακόλουθες λειτουργίες.

    • Τα R1, T1, R2 και D1 παρέχουν μια βοηθητική είσοδο επαναφοράς συσκευής. Εδώ ένας ενεργός υψηλός παλμός στο IC1 - P7 θα αναγκάσει το U1 να επανεκκινήσει.
    • Τα R3, R4, είναι αντίσταση περιορισμού ρεύματος για την ενσωματωμένη συσκευή που προγραμματίζει γραμμές TX/RX.
    • Τα C5 και R7 επιτρέπουν στο Arduino IDE να προγραμματίζει αυτόματα το U1 μέσω παλμού στη γραμμή DTR μιας προσαρτημένης συσκευής FTDI.
    • Τα R5 και R6 είναι αντιστάσεις I2C για το APDS9960 με το C6 να παρέχει τοπική αποσύνδεση ράγας τροφοδοσίας.
    • Τα U1, C1, C2 και Q1 σχηματίζουν το ενσωματωμένο Arduino Uno και το ρολόι του είναι αντίστοιχα.
    • Τέλος, τα C3 και C4 παρέχουν τοπική αποσύνδεση σιδηροτροχιών ανεφοδιασμού για U1.

Βήμα 2: Επισκόπηση λογισμικού

Επισκόπηση λογισμικού
Επισκόπηση λογισμικού
Επισκόπηση λογισμικού
Επισκόπηση λογισμικού
Επισκόπηση λογισμικού
Επισκόπηση λογισμικού

Προοίμιο

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

SparkFun_APDS9960.h

  • Από: Steve Quinn
  • Σκοπός: Αυτή είναι μια διχαλωτή έκδοση του αισθητήρα SparkFun APDS9960 διχαλωτή από jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Διαθέτει μερικές τροποποιήσεις για να βοηθήσει με τον εντοπισμό σφαλμάτων και διαθέτει έναν ανιχνευτή χωρίς ευαισθητοποίηση για τη μείωση της ψευδούς ενεργοποίησης.
  • Από:

APDS9960_NonBlocking.h

  • Από: Steve Quinn
  • Σκοπός: Παρέχει μια καθαρή διεπαφή για την ενσωμάτωση αυτής της μη αποκλειστικής εφαρμογής του APDS9960 Gesture Sensor στον κώδικα Arduino σας.
  • Από:

Ανατρέξτε στο παρακάτω εγχειρίδιο σχετικά με τον τρόπο προγραμματισμού ενός ενσωματωμένου μικροελεγκτή Arduino Uno (ATMega328P) εάν δεν είστε εξοικειωμένοι με τον τρόπο επίτευξης αυτού.

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΤΩΝ ATTINY85, ATTINY84 ΚΑΙ ATMEGA328P: ARDUINO AS ISP

Λειτουργική Επισκόπηση

Ο ενσωματωμένος μικροελεγκτής ATMega328P σφυγμομετρεί τη γραμμή INT από το ADPS9960. Όταν αυτή η γραμμή μειωθεί, ο μικροελεγκτής διαβάζει τους καταχωρητές ADPS9960 και καθορίζει εάν έχει γίνει αισθητή μια έγκυρη χειρονομία. Εάν έχει εντοπιστεί έγκυρη χειρονομία, ο κωδικός για αυτήν τη χειρονομία 0x0… 0x6, 0xF τοποθετείται στη Θύρα B και το 'nGestureAvailable' είναι χαμηλό.

Όταν η κύρια συσκευή βλέπει το 'nGestureAvailable' ενεργό, διαβάζει την τιμή στη θύρα Β και στη συνέχεια παλμώνει 'nGestureClear' χαμηλά προσωρινά για να επιβεβαιώσει τη λήψη των δεδομένων.

Η υποτελής συσκευή στη συνέχεια καταργεί την ένδειξη «nGestureAvailable» υψηλή και διαγράφει τα δεδομένα στη θύρα Β. Η εικόνα 5 παραπάνω δείχνει μια λήψη οθόνης που έχει ληφθεί από έναν λογικό αναλυτή κατά τη διάρκεια ενός πλήρους κύκλου ανίχνευσης/ανάγνωσης.

Επισκόπηση κώδικα

Η εικόνα 1 περιγράφει λεπτομερώς πώς λειτουργεί το λογισμικό στο U1 του ενσωματωμένου σκλάβου Arduino Uno, μαζί με την εικόνα 2 πώς αλληλεπιδρούν οι δύο εργασίες φόντου/προσκηνίου. Η εικόνα 3 είναι ένα τμήμα κώδικα που περιγράφει τον τρόπο χρήσης της βιβλιοθήκης APDS9960_NonBlocking. Η εικόνα 4 δίνει μια αντιστοίχιση μεταξύ Arduino Uno Digital Pins και πραγματικών ακίδων υλικού στο ATMega328P.

Αφού επαναφέρετε τον ενσωματωμένο μικροελεγκτή σκλάβων, αρχικοποιεί το APDS9960 επιτρέποντας την ανίχνευση χειρονομίας να ενεργοποιήσει την έξοδο INT του και ρυθμίζει την είσοδο/έξοδό του, συνδέοντας τη ρουτίνα διακοπής υπηρεσίας (ISR) «GESTURE_CLEAR ()» για να διακόψει το διάνυσμα INT0 (pinηφιακή ακίδα 2, Hardware IC pin 4), διαμορφώνοντάς το για σκανδάλη που πέφτει. Αυτό σχηματίζει την είσοδο nGestureClear από την κύρια συσκευή.

Ο ακροδέκτης εξόδου διακοπής 'INT' από το APDS9960 είναι συνδεδεμένος με το Digital Pin 4, Hardware IC Pin 6, το οποίο έχει διαμορφωθεί ως είσοδος στο U1.

Η γραμμή σήματος «nGestureAvailable» στον ψηφιακό ακροδέκτη 7, Hardware IC pin έχει διαμορφωθεί ως έξοδος και έχει οριστεί σε υψηλή, ανενεργή (απενεργοποίηση).

Τέλος, τα δυαδικά ψηφία 0… 3 αντίστοιχα διαμορφώνονται ως έξοδοι και ρυθμίζονται χαμηλά. Αυτά σχηματίζουν το τσίμπημα δεδομένων που αντιπροσωπεύει τους διάφορους τύπους εντοπισμένων χειρονομιών. Καμία = 0x0, Σφάλμα = 0xF, Πάνω = 0x1, Κάτω = 0x2, Αριστερά = 0x3, Δεξιά = 0x4, Κοντά = 0x5 και Μακριά = 0x6.

Η εργασία στο παρασκήνιο «Βρόχος» έχει προγραμματιστεί η οποία διερευνά συνεχώς την έξοδο διακοπής APDS9960 INT μέσω ανάγνωσης ψηφιακού πείρου 4. Όταν η έξοδος INT από το APDS9960 ενεργοποιείται χαμηλά υποδεικνύοντας ότι ο αισθητήρας έχει ενεργοποιηθεί, ο μικροελεγκτής προσπαθεί να ερμηνεύσει οποιαδήποτε χειρονομία καλώντας το «readGesture () 'with it while (1) {}; ατέρμων βρόχος.

Εάν έχει εντοπιστεί έγκυρη χειρονομία, αυτή η τιμή γράφεται στη Θύρα Β, επιβεβαιώνεται η έξοδος «nGestureAvailable» και ορίζεται ο boolean semaphore «bGestureAvailable», αποτρέποντας την καταγραφή τυχόν περαιτέρω χειρονομιών.

Μόλις ο κύριος εντοπίσει την ενεργή έξοδο «nGestureAvailable», διαβάζει αυτή τη νέα τιμή και πατάει χαμηλά το «nGestureClear». Αυτή η πτώση προκαλεί την εργασία στο προσκήνιο «ISR GESTURE_CLEAR ()» να προγραμματιστεί για αναστολή της εκτέλεσης της εργασίας στο παρασκήνιο «Βρόχος», εκκαθάριση της θύρας Β, σηματοδότης «bGestureAvailable» και έξοδος «nGestureAvailable».

Η εργασία στο προσκήνιο "GESTURE_CLEAR ()" έχει πλέον ανασταλεί και η εργασία στο παρελθόν "Loop" επαναπρογραμματίζεται. Περαιτέρω χειρονομίες από το APDS9960 μπορούν πλέον να γίνουν αντιληπτές.

Χρησιμοποιώντας εργασίες που ενεργοποιούνται σε διακοπή στο προσκήνιο/στο παρασκήνιο με αυτόν τον τρόπο, ο δυνητικός άπειρος βρόχος στο 'readGesture ()' της υποτελούς συσκευής δεν θα επηρεάσει τη λειτουργία της κύριας συσκευής και δεν θα εμποδίσει την εκτέλεση της συσκευής υποτελείας. Αυτό αποτελεί τη βάση ενός πολύ απλού λειτουργικού συστήματος σε πραγματικό χρόνο (RTOS).

Σημείωση: Το πρόθεμα «n» σημαίνει ενεργό χαμηλό ή επιβεβαιώνεται όπως στο «nGestureAvailable»

Βήμα 3: Δοκιμή της συσκευής ανίχνευσης κινήσεων μη αποκλεισμού APDS9960

Δοκιμή της συσκευής ανίχνευσης κινήσεων μη αποκλεισμού APDS9960
Δοκιμή της συσκευής ανίχνευσης κινήσεων μη αποκλεισμού APDS9960
Δοκιμή της συσκευής ανίχνευσης κινήσεων μη αποκλεισμού APDS9960
Δοκιμή της συσκευής ανίχνευσης κινήσεων μη αποκλεισμού APDS9960
Δοκιμή της συσκευής ανίχνευσης κινήσεων μη αποκλεισμού APDS9960
Δοκιμή της συσκευής ανίχνευσης κινήσεων μη αποκλεισμού APDS9960
Δοκιμή της συσκευής ανίχνευσης κινήσεων μη αποκλεισμού APDS9960
Δοκιμή της συσκευής ανίχνευσης κινήσεων μη αποκλεισμού APDS9960

Προοίμιο

Παρόλο που η μονάδα APDS9960 παρέχεται με +5v, χρησιμοποιεί ενσωματωμένο ρυθμιστή +3v3 που σημαίνει ότι οι γραμμές I2C είναι συμβατές με +3v3 και όχι +5v. Αυτός είναι ο λόγος για τον οποίο επέλεξα να χρησιμοποιήσω το συμβατό με +3v3 Arduino Due ως δοκιμαστικό μικροελεγκτή, για να αποφύγω την ανάγκη αλλαγής επιπέδου.

Εάν, ωστόσο, επιθυμείτε να χρησιμοποιήσετε ένα πραγματικό Arduino Uno, τότε θα χρειαστεί να αλλάξετε επίπεδο τις γραμμές I2C σε U1. Δείτε το παρακάτω Instructable όπου έχω επισυνάψει ένα χρήσιμο σετ διαφανειών (I2C_LCD_With_Arduino) το οποίο δίνει πολλές πρακτικές συμβουλές για τη χρήση του I2C.

Δοκιμή διεπαφής I2C

Οι φωτογραφίες 1 και 2 παραπάνω δείχνουν τον τρόπο ρύθμισης και προγραμματισμού του συστήματος για τη διεπαφή I2C. Θα πρέπει πρώτα να κατεβάσετε και να εγκαταστήσετε τη βιβλιοθήκη APDS9960_NonBlocking. εδώ

Παράλληλη δοκιμή διεπαφής

Οι φωτογραφίες 3 και 4 περιγράφουν το ίδιο για την παράλληλη διεπαφή

Βήμα 4: Συμπέρασμα

συμπέρασμα
συμπέρασμα

Γενικός

Ο κώδικας λειτουργεί καλά και ανιχνεύει χειρονομίες με απόκριση χωρίς ψευδώς θετικά. Λειτουργεί εδώ και μερικές εβδομάδες ως συσκευή σκλάβου στο επόμενο έργο μου. Δοκίμασα πολλούς διαφορετικούς τρόπους αποτυχίας (και το ίδιο έκανε και ο ερευνητής Quinn house moggie) που προηγουμένως είχε ως αποτέλεσμα την επαναφορά του ESP8266-12, χωρίς αρνητικό αποτέλεσμα.

Πιθανές βελτιώσεις

  • Το προφανές. Ξαναγράψτε τη βιβλιοθήκη APDS9960 Gesture Sensor για μη αποκλεισμό.

    Πραγματικά, επικοινώνησα με την Broadcom που με έβαλε σε έναν τοπικό διανομέα ο οποίος αγνόησε αμέσως το αίτημά μου για υποστήριξη, δεν είμαι SparkFun ή AdaFruit, υποθέτω. Οπότε αυτό μάλλον θα πρέπει να περιμένει λίγο

  • Μεταφέρετε τον κωδικό σε μικρότερο βοηθητικό μικροελεγκτή. Η χρήση ενός ATMega328P για μία εργασία είναι λίγο υπερβολική. Αν και αρχικά κοίταξα το ATTiny84, σταμάτησα να χρησιμοποιώ ένα καθώς ένιωσα ότι το μεταγλωττισμένο μέγεθος του κώδικα ταιριάζει με μια γραμμή γραμμής. Με την προστιθέμενη επιβάρυνση να χρειάζεται να τροποποιήσετε τη βιβλιοθήκη APDS9960 για να εργαστείτε με διαφορετική βιβλιοθήκη I2C.

Βήμα 5: Αναφορές

Απαιτείται για τον προγραμματισμό του ενσωματωμένου arduino (ATMega328P - U1)

SparkFun_APDS9960.h

  • Από: Steve Quinn
  • Σκοπός: Αυτή είναι μια διχαλωτή έκδοση του αισθητήρα SparkFun APDS9960 διχαλωτή από jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Διαθέτει μερικές τροποποιήσεις για να βοηθήσει με τον εντοπισμό σφαλμάτων και διαθέτει έναν ανιχνευτή χωρίς ευαισθητοποίηση για τη μείωση της ψευδούς ενεργοποίησης.
  • Από:

Απαιτείται να ενσωματώσετε αυτήν τη λειτουργία χωρίς αποκλεισμούς στον κώδικα arduino και να δώσετε επεξεργασμένα παραδείγματα

APDS9960_NonBlocking.h

  • Από: Steve Quinn
  • Σκοπός: Παρέχει μια καθαρή διεπαφή για την ενσωμάτωση αυτής της μη αποκλειστικής εφαρμογής του APDS9960 Gesture Sensor στον κώδικα Arduino σας.
  • Από:

Λειτουργικό σύστημα σε πραγματικό χρόνο

https://en.wikipedia.org/wiki/Real-time_operating_system

Φύλλο δεδομένων APDS9960

https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf

Συνιστάται: