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

Arduino & MPU6050 Βασισμένο Digitalηφιακό Πνεύμα Επίπεδο: 3 Βήματα
Arduino & MPU6050 Βασισμένο Digitalηφιακό Πνεύμα Επίπεδο: 3 Βήματα

Βίντεο: Arduino & MPU6050 Βασισμένο Digitalηφιακό Πνεύμα Επίπεδο: 3 Βήματα

Βίντεο: Arduino & MPU6050 Βασισμένο Digitalηφιακό Πνεύμα Επίπεδο: 3 Βήματα
Βίντεο: Как использовать гироскоп, акселерометр, магнитометр MPU-9250 для Arduino 2024, Νοέμβριος
Anonim
Image
Image
Το Κύκλωμα
Το Κύκλωμα

Καλώς ήλθατε στο πρώτο μου πάντα διδακτικό! Ελπίζω να το βρείτε ενημερωτικό. Μη διστάσετε να αφήσετε σχόλια είτε θετικά είτε αρνητικά.

Αυτό το έργο θα δημιουργήσει ένα ψηφιακό αλφάδι βασισμένο σε arduino & MPU6050. Ενώ ο τελικός σχεδιασμός και ο κώδικας είναι δικός μου, η αρχική ιδέα και μεγάλο μέρος του κώδικα από τον οποίο έχω δουλέψει δεν είναι. Δεν ασχολούμαι με λογοκλοπή, γι 'αυτό είμαι περισσότερο από ευτυχής να αποδώσω τα εύσημα σε εκείνες τις ιδέες που έχω στηρίξει. Τα 2 κύρια άτομα στα οποία θέλω να φωνάξω είναι ο Paul McWhorter και ο DroneBot Workshop του YouTuber. Συμπεριλαμβάνω συνδέσμους προς αυτούς στο youtube χρήσιμους συνδέσμους μου PDF. Ευχαριστώ επίσης τον EEEnthusiast για το ενημερωτικό του βίντεο σχετικά με τη χρήση του MPU6050, συμπεριλαμβανομένης της ρύθμισης και της ανάγνωσης από τη μονάδα χωρίς εξωτερική βιβλιοθήκη (ο σύνδεσμός του βρίσκεται στο ίδιο PDF).

Το έργο που παρήγαγα, λειτουργεί «ως έχει» και είναι παραμυθένιο ακριβές, σίγουρα έως και 45% προς οποιαδήποτε κατεύθυνση. Μπορείτε να το χρησιμοποιήσετε ακριβώς όπως το έχω σχεδιάσει ή μπορείτε να το προσαρμόσετε στα δικά σας γούστα. Οι πιο έξυπνοι από εσάς θα παρατηρήσετε ότι το έργο μου μοιάζει σχεδόν ίδιο με αυτό που παράγεται από το εργαστήριο DroneBot, αλλά να είστε σίγουροι, υπάρχουν σημαντικές διαφορές, ειδικά όταν πρόκειται για τον κώδικα υπολογισμού γωνιών, καθώς και τη δυνατότητα αποθήκευσης τιμών βαθμονόμησης σε Eeprom!

Μερικές δυνατότητες για να ανοίξετε την όρεξή σας:

Γωνίες κλίσης και κύλισης διαθέσιμες εντός 0,1 βαθμού.

Αυτόματος εντοπισμός προσανατολισμού της γυροσκοπικής μονάδας (οριζόντια ή κάθετη)

Πλήρης βαθμονόμηση με αποτελέσματα που αποθηκεύονται αυτόματα στο eeprom

Ένδειξη LED από -2 έως +2 μοίρες (δυνατότητα αλλαγής στον κωδικό)

Πρόσθετη ηχητική ένδειξη στάθμης (μπορεί να ενεργοποιηθεί/απενεργοποιηθεί εν κινήσει)

Συμπαγής καμπύλη που απαιτεί ελάχιστα εξαρτήματα

Ας αρχίσουμε.

Προμήθειες

Αυτό το έργο (ως έχει) χρησιμοποιεί τα ακόλουθα στοιχεία:

1 x Arduino nano (το δικό μου είναι κλώνος)

1 x μονάδα γύρο/επιταχυνσιόμετρο MPU6050

1 x LCD - 16 x 2 + σύνδεση I2C

1 x Πιέστε για αλλαγή

1 x Piezo buzzer

1 x Πράσινο LED

2 x κίτρινα LED

2 x κόκκινα LED

5 x 220 ohm αντιστάσεις

Διάφορα καλώδια jumper

Breadboard

Τροφοδοσία (το δικό μου χρησιμοποίησε τροφοδοτικό USB 5v, όταν δεν ήταν συνδεδεμένο στον υπολογιστή μου, αλλά θα μπορούσατε να χρησιμοποιήσετε μια μπαταρία κατάλληλα συνδεδεμένη)

Βήμα 1: Το κύκλωμα

Το Κύκλωμα
Το Κύκλωμα
Το Κύκλωμα
Το Κύκλωμα

Υποθέτοντας ότι έχετε όλα τα συστατικά, θα χρειαστεί να φτιάξετε το ψωμί σας.

Εμφανίζω τη ρύθμισή μου ως οδηγό, αλλά οι συνδέσεις έχουν ως εξής:

Ο πείρος Arduino D2 συνδέεται με την 1 πλευρά του διακόπτη ώθησης. Η άλλη πλευρά του διακόπτη ώθησης συνδέεται με τη γείωση

Ο πείρος Arduino D3 συνδέεται σε 1 πλευρά με αντίσταση 220 ohm. Η άλλη πλευρά της αντίστασης συνδέεται με την κωδικοποίηση του κόκκινου LED. Το Cathode του Red LED πηγαίνει στο έδαφος.

Ο πείρος Arduino D4 συνδέεται σε 1 πλευρά με αντίσταση 220 ohm. Η άλλη πλευρά του αντιστάτη συνδέεται με τον κωδικό κίτρινου LED. Το Cathode του Yellow LED πηγαίνει στη γείωση.

Ο πείρος Arduino D5 συνδέεται σε 1 πλευρά με αντίσταση 220 ohm. Η άλλη πλευρά της αντίστασης συνδέεται με την κωδικοποίηση του πράσινου LED. Το Cathode του Green LED πηγαίνει στο έδαφος.

Ο πείρος Arduino D6 συνδέεται σε 1 πλευρά με αντίσταση 220 ohm. Η άλλη πλευρά του αντιστάτη συνδέεται με τον κωδικό κίτρινου LED. Το Cathode of Yellow LED πηγαίνει στη γείωση.

Ο πείρος Arduino D7 συνδέεται με 1 πλευρά αντίστασης 220 ohm. Η άλλη πλευρά της αντίστασης συνδέεται με την κωδικοποίηση του κόκκινου LED. Το Cathode του Red LED πηγαίνει στο έδαφος.

Ο πείρος Arduino D8 συνδέεται με τη μία πλευρά του βομβητή Piezo. Η άλλη πλευρά του βομβητή συνδέεται με τη γείωση.

Ο ακροδέκτης Arduino A4 συνδέεται με ακίδες SDA στο MPU6050 ΚΑΙ στην οθόνη LCD.

Ο πείρος Arduino A5 συνδέεται με τις ακίδες SCL στο MPU6050 ΚΑΙ στην οθόνη LCD

Ισχύς 5v και Gnd για MPU6050 και LCD προέρχονται από τις ακίδες Arduino Nano 5v και GND αντίστοιχα.

Μόλις ολοκληρωθεί, θα πρέπει να είναι παρόμοια με τη ρύθμιση που εμφανίζεται. Έβαλα το blu tak κάτω από το MPU6050 για να σταματήσει να κινείται και επίσης στην οθόνη LCD για να το κρατάω στην άκρη του breadboard.

Βήμα 2: Ο κώδικας

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

LiquidCrystal_I2C.h βιβλιοθήκη καθώς την εισήγαγα όταν ξεκίνησα να δουλεύω για πρώτη φορά με LCD. Δυστυχώς, υπάρχουν μερικές βιβλιοθήκες που χρησιμοποιούν την ίδια δήλωση #include, αλλά είναι ελαφρώς διαφορετικές. Εάν έχετε προβλήματα με το δικό σας, βρείτε έναν άλλο κωδικό LCD που σας ταιριάζει και αλλάξτε τον κώδικα ανάλογα. Είναι απλώς πιθανό να είναι η ρύθμιση που διαφέρει. Όλες οι εντολές "εκτύπωσης" πρέπει να λειτουργούν το ίδιο.

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

LiquidCrystal_I2C LCD (0x27, 16, 2);

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

{lcd.setCursor (0, 1); lcd.print ("Οριζόντια!"); προσανατολισμός = ΟΡΙΖΟΝΤΙΑ; // Διαβάστε τα ακατέργαστα δεδομένα acc και gyro από το MPU-6050 1000 φορές για (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Προσθέστε το gyro x offset στη μεταβλητή gyro_x_cal gyro_x_cal += gyro_x; // Προσθέστε τη μετατόπιση gyro y στη μεταβλητή gyro_y_cal gyro_y_cal += gyro_y; // Προσθέστε τη μετατόπιση gyro z στη μεταβλητή gyro_z_cal gyro_z_cal += gyro_z; // Προσθέστε το acc x offset στη μεταβλητή acc_x_cal acc_x_cal += acc_x; // Προσθέστε το off y offset στη μεταβλητή acc_y_cal acc_y_cal += acc_y; } // Χωρίστε όλα τα αποτελέσματα με 1000 για να λάβετε το μέσο όφσετ gyro_x_cal /= 1000.0; gyro_y_cal /= 1000.0; gyro_z_cal /= 1000.0; acc_x_cal /= 1000.0; acc_y_cal /= 1000.0; horizonalCalibration = 255; eeprom_address = 0; EEPROM.put (eeprom_address, horizonalCalibration); eeprom_address += sizeof (int); EEPROM.put (eeprom_address, gyro_x_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, gyro_y_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, gyro_z_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, acc_x_cal); eeprom_address += sizeof (float); EEPROM.put (eeprom_address, acc_y_cal); eeprom_address += sizeof (float); // Σημειώστε ότι δεν αποθηκεύουμε μια μετατόπιση για acc_z, λόγω βαρύτητας! καθυστέρηση (500)? }

Το παραπάνω μπλοκ κώδικα εκτελείται σε ρουτίνα βαθμονόμησης. Αυτός ο κωδικός είναι για την οριζόντια βαθμονόμηση. Υπάρχει σχεδόν πανομοιότυπος κωδικός για την κάθετη βαθμονόμηση (σημειώστε, ο κωδικός γνωρίζει αν το MPU6050 είναι τοποθετημένο οριζόντια ή κάθετα!). MPU6050, διαβάζεται 1000 φορές. οι σωστές τιμές προστίθενται αθροιστικά και στη συνέχεια διαιρούνται με 1000 για να δώσουν μια μέση τιμή "αντιστάθμισης". Αυτές οι τιμές στη συνέχεια αποθηκεύονται στο Nano eeprom. Όλες οι οριζόντιες τιμές βαθμονόμησης αποθηκεύονται ξεκινώντας από τη διεύθυνση eeprom 0. Όλες οι κάθετες τιμές αποθηκεύονται αρχικά στη διεύθυνση eeprom 24. Η βαθμονόμηση ΠΡΕΠΕΙ να γίνει σε εντελώς επίπεδη επιφάνεια, διαφορετικά δεν σημαίνουν τίποτα.

/ * * Οι επόμενες λίγες γραμμές επεξεργάζονται τα ακατέργαστα δεδομένα για να τα μετατρέψουν σε γωνίες που μπορούν να εξάγονται στην οθόνη LCD και LED. * Η τιμή 4096, με την οποία διαιρούνται τα δεδομένα επιτάχυνσης, λαμβάνεται από το φύλλο δεδομένων MPU6050 και βασίζεται στον ρυθμό δείγματος. * Η τιμή 9,8 είναι η βαρύτητα * Η συνάρτηση atan2 προέρχεται από την μαθηματική ενότητα και χρησιμοποιείται για τον υπολογισμό των γωνιών από τα δεδομένα δεδομένα */thetaM = -atan2 ((acc_x/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Ακατέργαστα δεδομένα phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Ακατέργαστα δεδομένα dt = (millis ()-millisOld)/1000.; millisOld = millis (); / * * Αυτή η ενότητα χρησιμοποιεί τα γυροσκοπικά δεδομένα για να κάνει το σύστημα πιο ανταποκρινόμενο * η τιμή 65,5, με την οποία διαιρούνται τα δεδομένα γυροσυστήματος, λαμβάνεται από το φύλλο δεδομένων MPU6050 και βασίζεται στον ρυθμό δείγματος */ theta = (theta+(gyro_y/ 65.5)*dt)*. 96 + thetaM*.04; // Φίλτρο χαμηλής διέλευσης phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; //Φίλτρο χαμηλής διέλευσης

Ο παραπάνω κώδικας είναι το υλικό που υπολογίζει τις γωνίες. Ας ελπίσουμε ότι τα σχόλια δίνουν μια μικρή εικόνα για το πώς λειτουργεί, αλλά για σε βάθος εξήγηση, δείτε το βίντεο του Paul McWhorters που συνδέεται στο συνημμένο PDF. Αυτό που θα πω όμως είναι ότι μπορείτε να αλλάξετε το ρυθμό δειγματοληψίας για το γυροσκόπιο και το Επιταχυνσιόμετρο (το οποίο γίνεται στο πρόγραμμα ρύθμισης MPU6050 στο κάτω μέρος του κώδικα μου). Εάν αλλάξετε το ρυθμό δειγματοληψίας, πρέπει επίσης να αλλάξετε το πόσο διαιρούνται τα ακατέργαστα δεδομένα. Για τα δεδομένα του επιταχυνσιόμετρου, η τρέχουσα τιμή είναι 4096. Για το γυροσκόπιο, η τρέχουσα τιμή είναι 65,5.

Ανατρέξτε στα συνημμένα φύλλα δεδομένων και το βίντεο του EEEntusiast (σύνδεσμος στο συνημμένο PDF) για πιο εμπεριστατωμένες πληροφορίες σχετικά με τον τρόπο εύρεσης των τιμών δειγματοληψίας και αντιστάθμισης.

Βήμα 3: Επόμενα βήματα

Μέχρι αυτό το σημείο ελπίζουμε ότι θα έχει γίνει αυτό το έργο, αλλά τι τώρα;

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

Perhapsσως παίξτε με τα ποσοστά δειγμάτων γυροσκόπιο και επιταχυνσιόμετρο για να δείτε αν λειτουργούν καλύτερα με τον ένα ρυθμό από τον άλλο.

Προσπαθήστε να βελτιώσετε περαιτέρω τον κώδικα. Για παράδειγμα, επί του παρόντος, πέρα από 45 μοίρες, η δηλωμένη γωνία είναι τουλάχιστον τραχιά. Υπάρχει τρόπος να το περιστρέψουμε;

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

Αν σας αρέσει αυτό το διδακτικό, κάντε ένα like, για να το ξέρω.

Αν το φτιάξετε αυτό, παρακαλώ δείξτε το (ειδικά αν είναι σε θήκη εργασίας).

ΣΑΣ ΕΥΧΑΡΙΣΤΩ

Συνιστάται: