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

Γυροσκόπιο Διασκέδαση με δαχτυλίδι neopixel: 4 βήματα (με εικόνες)
Γυροσκόπιο Διασκέδαση με δαχτυλίδι neopixel: 4 βήματα (με εικόνες)

Βίντεο: Γυροσκόπιο Διασκέδαση με δαχτυλίδι neopixel: 4 βήματα (με εικόνες)

Βίντεο: Γυροσκόπιο Διασκέδαση με δαχτυλίδι neopixel: 4 βήματα (με εικόνες)
Βίντεο: Virtual Reality: όσα πρέπει να γνωρίζεις (με απλά λόγια) 2024, Νοέμβριος
Anonim
Image
Image

Σε αυτό το σεμινάριο θα χρησιμοποιήσουμε το γυροσκόπιο MPU6050, ένα δαχτυλίδι neopixel και ένα arduino για να φτιάξουμε μια συσκευή που ανάβει το led που αντιστοιχεί στη γωνία κλίσης.

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

Χτίζω αυτό το σεμινάριο λόγω του ενδιαφέροντος που είδα στο πρώτο μου εκπαιδευτικό εδώ (Gyroscope Led Control With Arduino). Σε αυτό το διδακτικό έχω αντικαταστήσει τα απλά led με δαχτυλίδι neopixel. Το δαχτυλίδι είναι πιο απλό στη χρήση μέσω μιας βιβλιοθήκης Adafruit και είναι σίγουρα πιο εντυπωσιακό.

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

Βήμα 1: Απαιτούνται πράγματα

Συνέλευση
Συνέλευση

Ανταλλακτικά

1. Arduino pro mini 328p (eBay) 2 $

2. Breadboard

3. Γυροσκόπιο MPU6050 (eBay) 1,2 $

4. Δαχτυλίδι 24 neopixel led (Adafruit) 17 $

5. Μπαταρία 4 x AA με 4 μπαταρίες

6. Καλώδια άλματος σχήματος U (προαιρετικά). Έχω χρησιμοποιήσει αυτά τα καλώδια jumper επειδή φαίνονται καλύτερα στο breadboard και τα led είναι πιο ορατά με αυτόν τον τρόπο. Μπορείτε να βρείτε ένα κουτί 140 στο ebay περίπου 4 $. Εάν δεν έχετε αυτά τα καλώδια, μπορείτε να τα αντικαταστήσετε με καλώδια dupont.

Εργαλεία:

1. Προσαρμογέας USB σε σειριακό FTDI FT232RL για προγραμματισμό του arduino pro mini

2. Arduino IDE

Δεξιότητες: 1. Συγκόλληση, ελέγξτε αυτό το σεμινάριο

3. Βασικός προγραμματισμός arduino, αυτό το σεμινάριο μπορεί να είναι χρήσιμο

Βήμα 2: Συναρμολόγηση

Συνέλευση
Συνέλευση

Έχω επισυνάψει το συναρπαστικό σχήμα σε μορφή fzz και μια εικόνα του για εύκολη απεικόνιση των συνδέσεων

1. Πρέπει να κολλήσετε 3 αρσενικές καρφίτσες στο πίσω μέρος του δακτυλίου neopixel όπως φαίνεται στην εικόνα

- συγκολλήστε το θετικό πείρο

- συγκολλήστε το έδαφος

- συγκολλήστε τον πείρο εισαγωγής δεδομένων

2. Στη συνέχεια, η θήκη μπαταρίας 4x πρέπει να έχει έναν τρόπο σύνδεσης με το breadboard, μια εύκολη λύση είναι να κολλήσετε δύο αρσενικά καλώδια dupont στους ακροδέκτες του.

3. Ετοιμάστε το breadboard.

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

- Τοποθετήστε όλα τα αρνητικά καλώδια: στον μικροελεγκτή, δακτύλιο neopixel, γυροσκόπιο

- τοποθετήστε όλα τα θετικά καλώδια: στον μικροελεγκτή, δακτύλιο neopixel, γυροσκόπιο

- τοποθετήστε όλα τα καλώδια δεδομένων:

* SDA και SCL από το στο μικροελεγκτή στο γυροσκόπιο

* καρφίτσα D6 από τον μικροελεγκτή στο δακτύλιο neopixel

- Ελέγξτε ξανά όλες τις συνδέσεις πριν την τροφοδοσία

- προαιρετικά χρησιμοποιώντας κολλητική ταινία, κολλήστε την μπαταρία στο πίσω μέρος της σανίδας για να την κρατήσετε στη θέση της και να την κάνετε πιο φορητή

Βήμα 3: Ο κώδικας και η βαθμονόμηση

Πρώτα πρέπει να κατεβάσετε και να εγκαταστήσετε δύο βιβλιοθήκες:

1. Έλατο βιβλιοθήκης Adafruit neopixel που ελέγχει το neopixel

2. Βιβλιοθήκη MPU6050 για το γυροσκόπιο

3. Πηγή βιβλιοθήκης I2CDev

Είναι δύο μεγάλες βιβλιοθήκες που θα κάνουν τα βάρη!

Περισσότερες λεπτομέρειες για τα neopixels εδώ

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

#include "I2Cdev.h"

#include #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 mpu. Λωρίδα Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); χωρίς υπογραφή long lastPrintTime = 0; bool initialization = false; // ορίστε true αν το DMP init ήταν επιτυχές uint8_t mpuIntStatus. // κατέχει πραγματικό byte κατάστασης διακοπής από MPU uint8_t devStatus. // επιστροφή κατάστασης μετά από κάθε λειτουργία συσκευής (0 = επιτυχία,! 0 = σφάλμα) uint16_t packetSize; // αναμενόμενο μέγεθος πακέτου DMP (προεπιλογή είναι 42 byte) uint16_t fifoCount; // αρίθμηση όλων των byte που υπάρχουν στο FIFO uint8_t fifoBuffer [64]; // Ρυθμιστικό αποθήκευσης FIFO Quaternion q; // [w, x, y, z] quaternion container VectorFloat gravity; // [x, y, z] βαρύτητας διάνυσμα float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container και gravity velatile bool mpuInterrupt = false; // υποδεικνύει εάν ο πείρος διακοπής MPU έχει ανέβει ψηλά

void setup ()

{Serial.begin (9600); Serial.println ("Έναρξη προγράμματος"); προετοιμασία = initializeGyroscope (); strip.begin (); } void loop () {if (! προετοιμασία) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); ΕΠΙΣΤΡΟΦΗ; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& βαρύτητα, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} boolean hasFifoOverflown (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = constrain (x, -1 * MAX_ANGLE, MAX_ANGLE); y = περιορισμός (y, -1 * MAX_ANGLE, MAX_ANGLE); αν (y 0) {lightLeds (y, z, 0, 5, 0, 89); } else if (y <0 και z 0 και z 0 και z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {double angle = (atan ((double) abs (x) / (double) abs (y)) * 4068) / 71; int ledNr = χάρτης (γωνία, απόAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, γωνία); uint32_t χρώμα; για (int i = 0; i θέση + LED_OFFSET) {θέση επιστροφής + LED_OFFSET; } θέση επιστροφής + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (angle); Serial.print (";"); Serial.print ("ll ="); Serial.print (lightLed); Serial.print (";"); Serial.print ("y ="); Serial.print (y); Serial.print (";"); Serial.print ("z ="); Serial.print (z); Serial.println (";"); lastPrintTime = millis (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Η σύνδεση MPU6050 είναι επιτυχής"): F ("Η σύνδεση MPU6050 απέτυχε")); Serial.println (F ("Αρχικοποίηση DMP …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP Initialization failed (code")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Enabling ανίχνευση διακοπών (εξωτερική διακοπή Arduino 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP ready! Αναμονή για την πρώτη διακοπή … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Ανεβάστε τον κωδικό:

Χρησιμοποιώντας τον προσαρμογέα FTDI, ανεβάστε τον κώδικα στο arduino.

Συνδέστε το τροφοδοτικό (μπαταρίες)

Βαθμονόμηση:

Το πιο σημαντικό πράγμα για βαθμονόμηση εδώ είναι η σταθερά "LED_OFFSET". Στο παράδειγμά μου είναι το 12. Πρέπει να το ρυθμίσετε από το 0 στο 23, ώστε μετά την τροφοδοσία της πλακέτας το led να ανάψει προς την κατεύθυνση που γέρνετε τον πίνακα.

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

Βήμα 4: Πώς λειτουργεί (προαιρετικό)

Πώς λειτουργεί (προαιρετικό)
Πώς λειτουργεί (προαιρετικό)

Πρώτα λίγες πληροφορίες για το γυροσκόπιο MPU6050. Πρόκειται για γυροσκόπιο MEMS (το MEMS σημαίνει Μικροηλεκτρομηχανικά συστήματα).

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

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

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

Τα Neopixel είναι RGB led που απευθύνονται ξεχωριστά και είναι αλυσοδεμένα σε λωρίδες και δαχτυλίδια. Λειτουργούν σε 5V και περιέχουν δικό τους κύκλωμα, οπότε χρειάζεται μόνο να τροφοδοτήσετε τα νεοπροστοιχεία και να επικοινωνήσετε μαζί τους χρησιμοποιώντας τη γραμμή δεδομένων. Η επικοινωνία γίνεται με μία μόνο γραμμή δεδομένων που περιέχει ρολόι και δεδομένα (περισσότερες λεπτομέρειες εδώ). Το Adafruit παρέχει μια καθαρή βιβλιοθήκη για αλληλεπίδραση με τους δακτυλίους neopixel.

Ο κώδικας

Μέσα στη συνάρτηση l oop () καλείται η βιβλιοθήκη MPU6050_6Axis_MotionApps20. Όταν η βιβλιοθήκη έχει νέα δεδομένα από το γυροσκόπιο καλεί redrawLeds (x, y, z) με 3 ορίσματα που αντιπροσωπεύουν το yaw, pitch και roll

Μέσα στο redrawLeds ():

- εστιάζουμε σε δύο άξονες: y, z

- περιορίζουμε και τους δύο άξονες από -MAX_ANGLE σε +MAX_ANGLE, ορίσαμε τη μέγιστη γωνία στο 45 και μπορεί να αλλάξει

- χωρίζουμε 360 βαθμούς σε 4 τεταρτημόρια και καλούμε συναρτήσεις lightLeds () για το καθένα ως εξής:

* y αρνητικό, z θετικό πρώτο τεταρτημόριο θα ελέγχει τα led από 0 έως 5, η γωνία θα είναι από 0 έως 89

* y αρνητικός, z αρνητικός έλεγχος δεύτερου τεταρτημορίου led από 6 έως 12, η γωνία θα είναι από 89 έως 0

* …και τα λοιπά

- μέσα στη λειτουργία lightLeds

* Υπολογίζω μια γωνία με βάση τους δύο άξονες χρησιμοποιώντας το αρχιτεκτονικό (ελέγξτε τη συνημμένη εικόνα)

* Υπολογίζω τι οδήγησε στην εμφάνιση χρησιμοποιώντας τη συνάρτηση arduino map

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

* Χρησιμοποιώ μια συνάρτηση που ονομάζεται normalizeLedPosition () για να λάβω υπόψη τη βαθμονόμηση του neopixel. Η βαθμονόμηση είναι χρήσιμη επειδή ο δακτύλιος neopixel μπορεί να περιστραφεί όπως επιθυμείτε και πρέπει να ευθυγραμμιστεί με το γυροσκόπιο

* Εκτυπώνω επίσης τον άξονα ρυμούλκησης, τι led έχει φως και γωνία

Τα μαθηματικά

Έχω επισυνάψει μια εικόνα με το δακτύλιο led και την τριγωνομετρική συνάρτηση που χρησιμοποιείται για τον προσδιορισμό της γωνίας.

Συνιστάται: