Πίνακας περιεχομένων:
- Βήμα 1: Απαιτούνται πράγματα
- Βήμα 2: Συναρμολόγηση
- Βήμα 3: Ο κώδικας και η βαθμονόμηση
- Βήμα 4: Πώς λειτουργεί (προαιρετικό)
Βίντεο: Γυροσκόπιο Διασκέδαση με δαχτυλίδι neopixel: 4 βήματα (με εικόνες)
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:34
Σε αυτό το σεμινάριο θα χρησιμοποιήσουμε το γυροσκόπιο 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 και την τριγωνομετρική συνάρτηση που χρησιμοποιείται για τον προσδιορισμό της γωνίας.
Συνιστάται:
Bubble ξυπνητήρι κάνει το ξύπνημα διασκέδαση (πρώην): 7 βήματα (με εικόνες)
Bubble Ξυπνητήρι κάνει το ξύπνημα διασκεδαστικό (πρώην): Το να ξυπνάτε με ένα βρυχημένο ξυπνητήρι είναι χάλια. Είμαι από αυτούς που δεν τους αρέσει να ξυπνούν πριν βγει ο ήλιος (ή έχει βγει για πολλές ώρες). Τι καλύτερο λοιπόν για να κάνετε το ξύπνημα διασκεδαστικό από το να κάνετε ένα πάρτι με φούσκα στο κρεβάτι! Χρησιμοποιώντας ένα arduino και ένα
Διασκέδαση με οθόνη OLED και Arduino: 12 βήματα (με εικόνες)
Διασκέδαση με οθόνη OLED και Arduino: Είμαι σίγουρος ότι σίγουρα έχετε ακούσει για την τεχνολογία οθόνης OLED. Είναι σχετικά νέο και προσφέρει καλύτερη ποιότητα από την παλιά τεχνολογία LCD. Σε αυτό το σεμινάριο θέλουμε να αναθεωρήσουμε τα βήματα που απαιτούνται για την εμφάνιση δεδομένων σε ένα από τα πιο συνηθισμένα ενιαία
Έξι όψεις PCB LED ζάρια με WIFI & γυροσκόπιο - PIKOCUBE: 7 βήματα (με εικόνες)
Έξι όψεις PCB LED Ζάρια με WIFI & γυροσκόπιο - PIKOCUBE: Γεια σας κατασκευαστές, είναι κατασκευαστής moekoe! Σήμερα θέλω να σας δείξω πώς να φτιάξετε ένα πραγματικό ζάρι LED βασισμένο σε έξι PCB και 54 LED συνολικά. Δίπλα στον εσωτερικό γυροσκοπικό του αισθητήρα που μπορεί να ανιχνεύσει κίνηση και θέση ζαριών, ο κύβος διαθέτει ESP8285-01F που είναι
Αντιστατικό δαχτυλίδι: 5 βήματα (με εικόνες)
Αντιστατικός δακτύλιος: Αυτός ο δακτύλιος σας επιτρέπει να αποφορτίζεστε από τον στατικό ηλεκτρισμό χωρίς να αισθάνεστε ενοχλητικό ηλεκτροπληξία. Σύμφωνα με τη Wikipedia, μία από τις αιτίες των συμβάντων ESD είναι ο στατικός ηλεκτρισμός. Ο στατικός ηλεκτρισμός παράγεται συχνά μέσω τριπλής φόρτισης
Arduino Nano και Visuino: Μετατροπή επιτάχυνσης σε γωνία από επιταχυνσιόμετρο και γυροσκόπιο Αισθητήρας MPU6050 I2C: 8 βήματα (με εικόνες)
Arduino Nano και Visuino: Μετατρέψτε την επιτάχυνση σε γωνία από επιταχυνσιόμετρο και γυροσκόπιο Αισθητήρας MPU6050 I2C: Πριν από λίγο καιρό δημοσίευσα ένα σεμινάριο για το πώς μπορείτε να συνδέσετε το επιταχυνσιόμετρο MP, το γυροσκόπιο και τον πυξίδα στο Arduino Nano και να το προγραμματίσετε με Visuino για αποστολή πακέτων δεδομένων και οθόνη είναι σε πεδίο εφαρμογής και οπτικά όργανα. Το επιταχυνσιόμετρο στέλνει Χ, Υ