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

MPU 6050 Gyro, Επιταχυνσιόμετρο Επικοινωνία με Arduino (Atmega328p): 5 Βήματα
MPU 6050 Gyro, Επιταχυνσιόμετρο Επικοινωνία με Arduino (Atmega328p): 5 Βήματα

Βίντεο: MPU 6050 Gyro, Επιταχυνσιόμετρο Επικοινωνία με Arduino (Atmega328p): 5 Βήματα

Βίντεο: MPU 6050 Gyro, Επιταχυνσιόμετρο Επικοινωνία με Arduino (Atmega328p): 5 Βήματα
Βίντεο: Mathing the MPU6050 6-axis motion sensor 2024, Ιούλιος
Anonim
MPU 6050 Gyro, Επιταχυνσιόμετρο Επικοινωνία με Arduino (Atmega328p)
MPU 6050 Gyro, Επιταχυνσιόμετρο Επικοινωνία με Arduino (Atmega328p)
MPU 6050 Gyro, Επιταχυνσιόμετρο Επικοινωνία με Arduino (Atmega328p)
MPU 6050 Gyro, Επιταχυνσιόμετρο Επικοινωνία με Arduino (Atmega328p)
MPU 6050 Gyro, Επιταχυνσιόμετρο Επικοινωνία με Arduino (Atmega328p)
MPU 6050 Gyro, Επιταχυνσιόμετρο Επικοινωνία με Arduino (Atmega328p)

Το MPU6050 IMU διαθέτει επιταχυνσιόμετρο 3 αξόνων και γυροσκόπιο 3 αξόνων ενσωματωμένα σε ένα μόνο τσιπ.

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

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

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

Γυροσκόπιο 3 αξόνων Το MPU-6050 αποτελείται από γυροσκόπιο 3 αξόνων που μπορεί να ανιχνεύσει ταχύτητα περιστροφής κατά μήκος του άξονα x, y, z με τεχνολογία μικροηλεκτρομηχανικού συστήματος (MEMS). Όταν ο αισθητήρας περιστρέφεται κατά μήκος οποιουδήποτε άξονα, δημιουργείται μια δόνηση λόγω του φαινομένου Coriolis που ανιχνεύεται από το MEMS. Το ADC 16-bit χρησιμοποιείται για την ψηφιοποίηση της τάσης για τη δειγματοληψία κάθε άξονα. +/- 250, +/- 500, +/- 1000, +/- 2000 είναι η πλήρης κλίμακα εξόδου. Η γωνιακή ταχύτητα μετράται κατά μήκος κάθε άξονα σε βαθμό ανά δευτερόλεπτο μονάδα.

Χρήσιμος σύνδεσμος: …………….

Arduino Board:. ……….

MPU6050 IMU ……………

Βήμα 1: Μονάδα MPU-6050

Μονάδα MPU-6050
Μονάδα MPU-6050

Η μονάδα MPU-6050 έχει 8 ακίδες,

INT: Διακόψτε την ψηφιακή ακίδα εξόδου.

AD0: I2C Slave Address LSB pin. Αυτό είναι το 0ο bit στη διεύθυνση slave της συσκευής 7-bit. Εάν είναι συνδεδεμένο στο VCC, τότε διαβάζεται ως λογικό ένα και αλλάζει η διεύθυνση σκλάβου.

XCL: Βοηθητικός σειριακός πείρος ρολογιού. Αυτός ο πείρος χρησιμοποιείται για τη σύνδεση ακίδων SCL άλλων αισθητήρων με δυνατότητα διεπαφής I2C στο MPU-6050.

XDA: Καρφίτσα βοηθητικών σειριακών δεδομένων. Αυτός ο πείρος χρησιμοποιείται για τη σύνδεση άλλων καρφιτσών SDA με αισθητήρα με δυνατότητα διεπαφής I2C στο MPU-6050.

SCL: Καρφίτσα σειριακού ρολογιού. Συνδέστε αυτόν τον πείρο με τον μικροελεγκτή SCL pin. SDA: Καρφίτσα σειριακών δεδομένων. Συνδέστε αυτόν τον πείρο σε καρφίτσα μικροελεγκτών SDA.

GND: Πείρος γείωσης. Συνδέστε αυτόν τον πείρο στη σύνδεση γείωσης.

VCC: Πείρος τροφοδοσίας. Συνδέστε αυτόν τον πείρο στην τροφοδοσία +5V DC. Η μονάδα MPU-6050 έχει διεύθυνση Slave (Όταν AD0 = 0, δηλ. Δεν είναι συνδεδεμένη με Vcc) όπως, Slave Γράψτε διεύθυνση (SLA+W): 0xD0

Διεύθυνση Slave Read (SLA+R): 0xD1

Βήμα 2: Υπολογισμοί

Υπολογισμοί
Υπολογισμοί

Τα δεδομένα αισθητήρα γυροσκοπίου και επιταχυνσιόμετρου της μονάδας MPU6050 αποτελούνται από ακατέργαστα δεδομένα 16-bit σε μορφή συμπληρώματος 2.

Τα δεδομένα αισθητήρα θερμοκρασίας της μονάδας MPU6050 αποτελούνται από δεδομένα 16 bit (όχι σε μορφή συμπληρώματος 2).

Τώρα ας υποθέσουμε ότι έχουμε επιλέξει,

  • - Πλήρης κλίμακα επιταχυνσιόμετρου +/- 2g με συντελεστή κλίμακας ευαισθησίας 16, 384 LSB (Count)/g.
  • Πλήρες εύρος γυροσκοπίου +/- 250 °/s με συντελεστή κλίμακας ευαισθησίας 131 LSB (Count)/°/s. τότε,

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

Τιμές επιταχυνσιόμετρου σε g (g δύναμη)

  • Επιτάχυνση κατά μήκος του άξονα Χ = (Επιταχυνσιόμετρο άξονας Χ ακατέργαστα δεδομένα/16384) g.
  • Επιτάχυνση κατά μήκος του άξονα Υ = (επιταχυνσιόμετρο άξονας Υ ακατέργαστα δεδομένα/16384) g.
  • Επιτάχυνση κατά μήκος του άξονα Ζ = (επιταχυνσιόμετρο άξονας Ζ ακατέργαστα δεδομένα/16384) g.

Τιμές γυροσκοπίου σε °/s (βαθμός ανά δευτερόλεπτο)

  • Γωνιακή ταχύτητα κατά μήκος του άξονα Χ = (Γυροσκόπιο άξονα Χ ακατέργαστα δεδομένα/131) °/s.
  • Γωνιακή ταχύτητα κατά μήκος του άξονα Υ = (Γυροσκόπιο άξονα Υ ακατέργαστα δεδομένα/131) °/s.
  • Γωνιακή ταχύτητα κατά μήκος του άξονα Ζ = (Γυροσκόπιο άξονας Ζ ακατέργαστα δεδομένα/131) °/s.

Τιμή θερμοκρασίας σε °/c (βαθμός ανά Κελσίου)

Θερμοκρασία σε βαθμούς C = ((δεδομένα αισθητήρα θερμοκρασίας)/340 + 36,53) °/c.

Για παράδειγμα, Ας υποθέσουμε ότι, μετά από συμπλήρωμα 2’, παίρνουμε επιταχυνσιόμετρο Χ άξονες ακατέργαστη τιμή = +15454

Στη συνέχεια Ax = +15454/16384 = 0,94 g.

Περισσότερο,

Γνωρίζουμε λοιπόν ότι τρέχουμε με ευαισθησία +/- 2G και +/- 250deg/s, αλλά πώς οι τιμές μας αντιστοιχούν σε αυτές τις επιταχύνσεις/γωνίες.

Αυτά είναι και τα δύο γραφήματα ευθείας γραμμής και μπορούμε να διαπιστώσουμε από αυτά ότι για 1G θα διαβάσουμε 16384 και για 1 βαθμό/δευτερόλεπτο θα διαβάσουμε 131.07 (αν και το.07 θα αγνοηθεί λόγω δυαδικού) αυτές οι τιμές μόλις επεξεργάστηκαν σχεδιάζοντας το ευθεία γραφή με 2G στα 32767 και -2G στα -32768 και 250/-250 στις ίδιες τιμές.

Οπότε τώρα γνωρίζουμε τις τιμές ευαισθησίας μας (16384 και 131.07) απλώς πρέπει να αφαιρέσουμε τις αντισταθμίσεις από τις τιμές μας και στη συνέχεια να τις χωρίσουμε από την ευαισθησία.

Αυτά θα λειτουργήσουν καλά για τις τιμές Χ και Υ, αλλά καθώς το Ζ καταγράφηκε στο 1G και όχι στο 0, θα χρειαστεί να μείον το 1G (16384) πριν διαιρεθούμε με την ευαισθησία μας.

Βήμα 3: Συνδέσεις MPU6050-Atmega328p

Συνδέσεις MPU6050-Atmega328p
Συνδέσεις MPU6050-Atmega328p
Συνδέσεις MPU6050-Atmega328p
Συνδέσεις MPU6050-Atmega328p
Συνδέσεις MPU6050-Atmega328p
Συνδέσεις MPU6050-Atmega328p

Απλώς συνδέστε τα πάντα όπως δίνονται στο διάγραμμα…

Οι συνδέσεις δίνονται ως εξής:-

MPU6050 Arduino Nano

VCC 5v έξω καρφίτσα

GND Καρφίτσα γείωσης

SDA A4 pin // σειριακά δεδομένα

SCL A5 pin // σειριακό ρολόι

Υπολογισμός βήματος και ρολού: Ο ρόλος είναι η περιστροφή γύρω από τον άξονα x και το βήμα είναι η περιστροφή κατά μήκος του άξονα y.

Το αποτέλεσμα είναι σε ακτίνια. (μετατροπή σε μοίρες πολλαπλασιάζοντας με 180 και διαιρώντας με pi)

Βήμα 4: Κώδικες και επεξηγήσεις

Κώδικες και επεξηγήσεις
Κώδικες και επεξηγήσεις

/*

Arduino and MPU6050 Accelerometer and Gyroscope Sensor Tutorial by Dejan, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C διεύθυνση float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; float roll, pitch, yaw? float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime? int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Αρχικοποιήστε την επικοινωνία Wire.beginTransmission (MPU); // Έναρξη επικοινωνίας με MPU6050 // MPU = 0x68 Wire.write (0x6B); // Μιλήστε με τον καταχωρητή 6B Wire.write (0x00). // Κάντε επαναφορά - τοποθετήστε ένα 0 στον καταχωρητή 6B Wire.endTransmission (true). // τερματισμός της μετάδοσης/* // Διαμόρφωση ευαισθησίας επιταχυνσιόμετρου - Εύρος πλήρους κλίμακας (προεπιλογή +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Μιλήστε με το μητρώο ACCEL_CONFIG (1C hex) Wire.write (0x10). // Ορίστε τα δυαδικά ψηφία καταχώρισης ως 00010000 (+/- 8g πλήρους εύρους κλίμακας) Wire.endTransmission (true); // Διαμόρφωση Gyro Sensitivity - Full Scale Range (προεπιλογή +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Μιλήστε με τον μητρώο GYRO_CONFIG (1B hex) Wire.write (0x10). // Ορίστε τα δυαδικά ψηφία καταχωρητή ως 00010000 (πλήρης κλίμακα 1000deg/s) Wire.endTransmission (true); καθυστέρηση (20)? */ // Καλέστε αυτήν τη συνάρτηση εάν πρέπει να λάβετε τις τιμές σφάλματος IMU για τη μονάδα σας calc_IMU_error (); καθυστέρηση (20)? } void loop () {// === Ανάγνωση δεδομένων επιταχυντή === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Ξεκινήστε με μητρώο 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true)? // Διαβάστε συνολικά 6 καταχωρητές, κάθε τιμή άξονα αποθηκεύεται σε 2 καταχωρητές // Για εύρος +-2g, πρέπει να διαιρέσουμε τις ακατέργαστες τιμές με 16384, σύμφωνα με το φύλλο δεδομένων AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Τιμή άξονα Χ AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Τιμή άξονα Υ AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Τιμή άξονα Ζ // Υπολογισμός ρολού και βήματος από τα δεδομένα του επιταχυνσιόμετρου accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX (0.58) Δείτε την προσαρμοσμένη συνάρτηση calc_IMU_error () για περισσότερες λεπτομέρειες accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~ (-1.58) // === Ανάγνωση δεδομένων γυροσκοπίου === // previousTime = currentTime; // Ο προηγούμενος χρόνος αποθηκεύεται πριν από την πραγματική ώρα ανάγνωσης currentTime = millis (); // Τρέχουσα ώρα πραγματικός χρόνος ανάγνωσης elapsedTime = (currentTime - previousTime) / 1000; // Διαιρέστε με το 1000 για να λάβετε δευτερόλεπτα Wire.beginTransmission (MPU). Wire.write (0x43); // Gyro data πρώτα καταχωρίστε τη διεύθυνση 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true)? // Διαβάστε συνολικά 4 καταχωρητές, κάθε τιμή άξονα αποθηκεύεται σε 2 καταχωρητές GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Για εύρος 250deg/ s πρέπει πρώτα να διαιρέσουμε την πρώτη τιμή κατά 131,0, σύμφωνα με το φύλλο δεδομένων GyroY = (Wire.read () << 8 | Wire.read ())/ 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Διορθώστε τις εξόδους με τις υπολογισμένες τιμές σφάλματος GyroX = GyroX + 0.56; // GyroErrorX (-0.56) GyroY = GyroY - 2; // GyroErrorY (2) GyroZ = GyroZ + 0,79; // GyroErrorZ (-0,8) // Επί του παρόντος οι ακατέργαστες τιμές είναι σε μοίρες ανά δευτερόλεπτο, βαθμοί/δευτερόλεπτα, οπότε πρέπει να πολλαπλασιάσουμε με δευτερόλεπτα για να λάβουμε τη γωνία σε μοίρες gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * elapsedTime; // Συμπληρωματικό φίλτρο - συνδυάστε επιταχυντήριες και γυροσκοπικές τιμές γωνίας = 0,96 * gyroAngleX + 0,04 * accAngleX; βήμα = 0,96 * gyroAngleY + 0,04 * accAngleY; // Εκτυπώστε τις τιμές στη σειριακή οθόνη Serial.print (roll); Serial.print ("/"); Serial.print (βήμα); Serial.print ("/"); Serial.println (yaw); } void calc_IMU_error () {// Μπορούμε να καλέσουμε αυτήν τη λειτουργία στην ενότητα εγκατάστασης για να υπολογίσουμε το σφάλμα επιταχυνσιόμετρου και γυροσκοπικών δεδομένων. Από εδώ θα λάβουμε τις τιμές σφάλματος που χρησιμοποιούνται στις παραπάνω εξισώσεις που εκτυπώνονται στο Serial Monitor. // Σημειώστε ότι πρέπει να τοποθετήσουμε το IMU επίπεδο για να λάβουμε τις σωστές τιμές, έτσι ώστε να μπορούμε να έχουμε τις σωστές τιμές // Διαβάστε τιμές επιταχυνσιόμετρου 200 φορές ενώ (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true)? AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Άθροισμα όλων των ενδείξεων AccErrorX = AccErrorX + ((atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * 180 / PI)); AccErrorY = AccErrorY + ((atan (-1 * (AccX) / sqrt (pow ((AccY), 2) + pow ((AccZ), 2))) * 180 / PI)); c ++; } // Διαιρέστε το άθροισμα με 200 για να λάβετε την τιμή σφάλματος AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // Διαβάστε τις τιμές γυροσκοπήσεων 200 φορές ενώ (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true)? GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Άθροισμα όλων των μετρήσεων GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Διαιρέστε το άθροισμα με 200 για να λάβετε την τιμή σφάλματος GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Εκτυπώστε τις τιμές σφάλματος στο Serial Monitor Serial.print ("AccErrorX:"); Serial.println (AccErrorX); Serial.print ("AccErrorY:"); Serial.println (AccErrorY); Serial.print ("GyroErrorX:"); Serial.println (GyroErrorX); Serial.print ("GyroErrorY:"); Serial.println (GyroErrorY); Serial.print ("GyroErrorZ:"); Serial.println (GyroErrorZ); } ----------------------------------------------------- -------------------------------------------------- Αποτελέσματα:-Χ = Υ = Ζ = ------------------------------------------------- ----------------------------------------------- Σημαντική σημείωση: -----------------

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

Για να τα διαβάσουμε όλα, ξεκινάμε με τον πρώτο καταχωρητή και χρησιμοποιώντας τη συνάρτηση requiestFrom () ζητάμε να διαβάσουμε και τους 6 καταχωρητές για τους άξονες Χ, Υ και Ζ. Στη συνέχεια διαβάζουμε τα δεδομένα από κάθε καταχωρητή και επειδή τα αποτελέσματα είναι δύο συμπληρωματικά, τα συνδυάζουμε κατάλληλα για να πάρουμε τις σωστές τιμές.

Βήμα 5: Κατανόηση της γωνίας κλίσης

Επιταχυνσιόμετρο

Η βαρύτητα της γης είναι μια σταθερή επιτάχυνση όπου η δύναμη στρέφεται πάντα προς τα κάτω στο κέντρο της Γης.

Όταν το επιταχυνσιόμετρο είναι παράλληλο με τη βαρύτητα, η μετρούμενη επιτάχυνση θα είναι 1G, όταν το επιταχυνσιόμετρο είναι κάθετο με τη βαρύτητα, θα μετρά 0G.

Η γωνία κλίσης μπορεί να υπολογιστεί από τη μετρούμενη επιτάχυνση χρησιμοποιώντας αυτήν την εξίσωση:

θ = sin-1 (μετρημένη επιτάχυνση / επιτάχυνση βαρύτητας)

Το GyroGyro (γνωστός και ως αισθητήρας ρυθμού) χρησιμοποιείται για τη μέτρηση της γωνιακής ταχύτητας (ω).

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

ω = dθ / dt, θ = ∫ ω dt

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

Σύνδεσμος για καλύτερη κατανόηση: Κάντε κλικ εδώ

Συνιστάται: