Χρήση του MPU6050 με το Raspberry Pi Pico (Επιταχυνσιόμετρο, γυροσκόπιο)

Σε αυτό το άρθρο θα χρησιμοποιούμε τη μονάδα MPU6050 MEMS με ένα Raspberry Pi Pico ως γυροσκόπιο για τη μέτρηση της επιτάχυνσης (και των τιμών θερμοκρασίας). Αρχικά θα μάθουμε για το MPU6050 (διάγραμμα, ακίδες). Μετά , θα δούμε τη βιβλιοθήκη MPU6050 της MicroPython στο το Raspberry Pi Pico χρησιμοποιώντας το Thonny IDE. Στο τέλος, θα δούμε πώς να πάρουμε μετρήσεις από τη μονάδα MPU6050 με το Raspberry Pi Pico.

MPU6050 Εισαγωγή μονάδας αισθητήρα

Η μονάδα αισθητήρα MPU6050 είναι μια μονάδα MEMS (Micro-Electro-Mechanical System) που περιέχει ένα ολοκληρωμένο κύκλωμα MPU6050. Αυτό το τσιπ περιέχει ένα γυροσκόπιο τριών αξόνων, ένα επιταχυνσιόμετρο τριών αξόνων και ένα ψηφιακό επεξεργαστή ελέγχου κίνησης μέσα σε ένα ενιαίο ολοκληρωμένο κύκλωμα. Επιπλέον, περιέχει έναν ενσωματωμένο αισθητήρα θερμοκρασίας. Όλοι αυτοί οι αισθητήρες κατασκευάζονται στην ίδια μήτρα MPU6050. Μπορούμε να χρησιμοποιήσουμε αυτήν το άρθρο για μέτρηση ταχύτητας, επιτάχυνσης, προσανατολισμού, μετατόπισης και άλλων παραμέτρων που σχετίζονται με την κίνηση. Σήμερα όλα τα σύγχρονα smartphone διαθέτουν ενσωματωμένο αισθητήρα αδρανειακής κίνησης. Το MPU6050 ανήκει επίσης σε μία από αυτές τις κατηγορίες αισθητήρων. Αυτός ο αισθητήρας παρέχει μια ολοκληρωμένη λύση για οποιοδήποτε σύστημα παρακολούθησης κίνησης έξι αξόνων.

Ένα από τα πιο σημαντικά χαρακτηριστικά των αισθητήρων MPU6050 MEMS είναι ότι περιέχει έναν ισχυρό και υψηλής ισχύος επεξεργασίας Ψηφιακό Επεξεργαστή Κίνησης (DMP). Το DMP εκτελεί όλους τους πολύπλοκους υπολογισμούς εσωτερικά πριν αφήσει τους χρήστες να διαβάσουν δεδομένα από τον αισθητήρα στη θύρα I2C. Αυτό σημαίνει ότι δεν χρειάζεται να εκτελούμε υπολογισμούς υψηλής ισχύος στον μικροελεγκτή μετά την ανάγνωση δεδομένων από το τσιπ MPU6050.

Διεπαφή εξόδου I2C

Όπως αναφέρθηκε προηγουμένως, το MPU6050 παρέχει δεδομένα εξόδου σε δίαυλο I2C. Επομένως, μπορούμε να χρησιμοποιήσουμε μια διεπαφή διαύλου I2C MPU6050 για να μεταφέρουμε τιμές επιταχυνσιόμετρου 3 αξόνων και γυροσκοπίου 3 αξόνων στο Raspberry Pi Pico. Υπάρχει μια συγκεκριμένη αποκλειστική διεύθυνση που έχει εκχωρηθεί σε κάθε τιμή παραμέτρου στη διεπαφή MPU6050 I2C. Μπορούμε να χρησιμοποιήσουμε αυτές τις διευθύνσεις για να λάβουμε συγκεκριμένες τιμές από έναν αισθητήρα όπως επιτάχυνση, γυροσκόπιο και θερμοκρασία. Ένα από τα πλεονεκτήματα της χρήσης της διεπαφής I2C αυτού του αισθητήρα είναι ότι μπορούμε να διασυνδέσουμε πολλαπλές μονάδες MPU5060 με έναν μόνο μικροελεγκτή.

MPU6050 Pinout 

Το ολοκληρωμένο κύκλωμα MPU6050 αποτελείται από 24 ακίδες. Αλλά μόνο 8 ακίδες εκτίθενται στις ακίδες της μονάδας. Αυτή η μονάδα αισθητήρα MEMS αποτελείται από 8 ακίδες και αυτές οι ακίδες χρησιμοποιούνται για διαφορετικές διαμορφώσεις και χρησιμοποιούνται για την ανάγνωση δεδομένων από τον αισθητήρα. Η παρακάτω εικόνα δείχνει το διάγραμμα ακίδων της μονάδας MEMS MPU6050:

Περιγραφή Ακίδων

  • Ο πρώτος είναι ο ακροδέκτης VCC που χρησιμοποιείται για την τροφοδοσία του αισθητήρα και εφαρμόζονται τάσεις συνεχούς ρεύματος 3 έως 5 βολτ για την ενεργοποίηση του αισθητήρα. Αλλά συνήθως, μια πηγή ενέργειας 5V παρέχεται απευθείας από έναν μικροελεγκτή.
  • Ο δεύτερος είναι ο ακροδέκτης GND που συνδέεται με τη γείωση.
  • Ο τρίτος είναι ο ακροδέκτης SCL (σειριακό ρολόι) ο οποίος συνδέεται με έναν ακροδέκτη SCL του μικροελεγκτή. Το SCL είναι ένας παλμός ρολογιού που χρησιμοποιείται στην επικοινωνία I2C.
  • Ο τέταρτος ακροδέκτης είναι ο ακροδέκτης SDA (σειριακά δεδομένα) που χρησιμοποιείται για τη μεταφορά δεδομένων από και προς τον μικροελεγκτή.
  • Ο πέμπτος είναι ο ακροδέκτης XDA (Auxiliary Serial Data) που χρησιμοποιείται για τη σύνδεση εξωτερικών μονάδων I2C με το MPU6050 όπως μαγνητόμετρο. Αλλά η χρήση αυτής της καρφίτσας είναι εντελώς προαιρετική.
  • Ο έκτος είναι ο ακροδέκτης XCL (βοηθητικό ρολόι) ο οποίος συνδέεται επίσης με έναν άλλο αισθητήρα διεπαφής 12C για να ενεργοποιήσει τον ακροδέκτη του από αυτήν τη μονάδα αισθητήρα.
  • Ο έβδομος είναι ο ακροδέκτης AD0 (επιλογή διεύθυνσης) που είναι για την επιλογή δευτερεύουσας διεύθυνσης 12C. Για παράδειγμα, εάν χρησιμοποιούμε περισσότερες από μία μονάδες MPU6050 με έναν μόνο μικροελεγκτή, αυτός ο ακροδέκτης χρησιμοποιείται για τη διαφοροποίηση της δευτερεύουσας διεύθυνσης για κάθε αισθητήρα MEMS. Με αυτόν τον τρόπο, κάθε αισθητήρας MEMS μπορεί εύκολα να διακριθεί σε ένα δίαυλο I2C με τη μοναδική του διεύθυνση.
  • Ο όγδοος είναι ο ακροδέκτης INT είναι ένα σήμα διακοπής και χρησιμοποιείται για να δώσει ένδειξη σε έναν μικροελεγκτή ότι τα δεδομένα είναι διαθέσιμα για ανάγνωση από μια μονάδα αισθητήρα MPU6050.

Διεπαφή MPU6050 με το Raspberry Pi Pico

Όπως βλέπετε, το MPU6050 έχει 8 τερματικά, αλλά για να συνδεθούμε με το Raspberry Pi Pico, θα χρειαστούμε μόνο τις πρώτες τέσσερις ακίδες. Αυτά είναι τα VCC, GND, SCL και SDA.

ΑκίδεςI2C στο Raspberry Pi Pico

Το Raspberry Pi Pico διαθέτει δύο ελεγκτές I2C. Και οι δύο ελεγκτές I2C είναι προσβάσιμοι μέσω ακίδων GPIO του Raspberry Pi Pico. Ο παρακάτω πίνακας δείχνει τη σύνδεση των ακίδων GPIO και με τους δύο ελεγκτές I2C. Κάθε σύνδεση του ελεγκτή μπορεί να διαμορφωθεί μέσω πολλαπλών ακίδων GPIO όπως φαίνεται στην εικόνα. Αλλά πριν χρησιμοποιήσετε έναν ελεγκτή I2C, θα πρέπει να διαμορφώσετε στο λογισμικό ποιες ακίδες GPIO θέλετε να χρησιμοποιήσετε με έναν συγκεκριμένο ελεγκτή I2C.

Ελεγκτής I2CΑκροδέκτες GPIO
I2C0 – SDAGP0 / GP4 / GP8 / GP12 / GP16 / GP20
I2C0 – SCLGP1 / GP5 / GP9 / GP13 / GP17 / GP21
I2C1 – SDAGP2 / GP6 / GP10 / GP14 / GP18 / GP26
I2C1 – SCLGP3 / GP7 / GP11 / GP15 / GP19 / GP27

Οι συνδέσεις μεταξύ των δύο συσκευών που χρησιμοποιούμε φαίνονται παρακάτω.

MPU6050Pi Pico
VCC3.3V
SDAGP0 (I2C0 SDA)
SCLGP1 (I2C0 SCL)
GNDGND

Ο ακροδέκτης VCC συνδέεται με τα 3,3V από το Raspberry Pi Pico για τροφοδοσία. Και οι δύο γειώσεις των δύο συσκευών συνδέονται από κοινού. Ο ακροδέκτης SCL του MPU6050 συνδέεται με τον ακροδέκτη I2C0 SCL του Pi Pico. Ομοίως, ο ακροδέκτης SDA συνδέεται με τον ακροδέκτη I2C0 SDA του Pi Pico.

MPU6050 Βιβλιοθήκες MicroPython

Για αυτό το έργο θα χρειαστούμε τις δύο βιβλιοθήκες: imu.py και vector3d.py. Αντιγράψτε και τις δύο αυτές βιβλιοθήκες και αποθηκεύστε τις στο Raspberry Pi Pico σας με τα αντίστοιχα ονόματα αρχείων. Ανοίξτε ένα νέο αρχείο στο Thonny. Κατεβάστε και αντιγράψτε τις βιβλιοθήκες που δίνονται παρακάτω. Αποθηκεύστε τα στο Raspberry Pi Pico με ονόματα imu.py και vector32.py μέσα στο φάκελο lib.

MicroPython με MPU6050: Λήψη τιμών επιταχυνσιόμετρου, γυροσκοπίου και θερμοκρασίας

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

MPU6050 Κώδικας MicroPython

Τώρα ας δούμε το σενάριο MicroPython για MPU6050 για να λάβετε μετρήσεις αισθητήρων. Αντιγράψτε τον ακόλουθο κώδικα στο αρχείο main.py και ανεβάστε το αρχείο main.py στο Raspberry Pi Pico. Αυτό το σενάριο MicroPython διαβάζει τιμές επιταχυνσιόμετρου, γυροσκοπίου και θερμοκρασίας από MPU-6050 πάνω από γραμμές I2C και τις εκτυπώνει στην κονσόλα της MicroPython.

from imu import MPU6050
from time import sleep
from machine import Pin, I2C

i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
imu = MPU6050(i2c)
while True:
 ax=round(imu.accel.x,2)
 ay=round(imu.accel.y,2)
 az=round(imu.accel.z,2)
 gx=round(imu.gyro.x)
 gy=round(imu.gyro.y)
 gz=round(imu.gyro.z)
 tem=round(imu.temperature,2)
print("ax",ax,"\t","ay",ay,"\t","az",az,"\t","gx",gx,"\t","gy",gy,"\t","gz",gz,"\t","Temperature",tem," ",end="\r")
 
 sleep(0.2)

Πώς λειτουργεί ο κώδικας;

Εισαγωγή βιβλιοθηκών

Πρώτον, θα εισάγουμε τις κλάσεις Pin και I2C από τη μονάδα machine για να καθορίσουμε τους ακροδέκτες επικοινωνίας I2C. Εισάγουμε επίσης τη μονάδα χρόνου ώστε να μπορούμε να προσθέσουμε μια καθυστέρηση μεταξύ των μετρήσεών μας. Επίσης, εισαγουμε το MPU6050 από τη βιβλιοθήκη imu.

from imu import MPU6050
from time import sleep
from machine import Pin, I2C

Ορισμός ακίδων Raspberry Pi I2C για MPU-6050

Στη συνέχεια, θα εγκαινιάσουμε τις ακίδες I2C GPIO για SCL και SDA αντίστοιχα. Έχουμε χρησιμοποιήσει τις ακίδες I2C0 SCL και I2C0 SDA.

Έχουμε δημιουργήσει μια μέθοδο I2C() η οποία λαμβάνει τέσσερις παραμέτρους. Η πρώτη παράμετρος είναι το κανάλι I2C που χρησιμοποιούμε. Η δεύτερη παράμετρος καθορίζει τον ακροδέκτη I2C GPIO της πλακέτας που συνδέεται με τη γραμμή SDA. Η τρίτη παράμετρος καθορίζει τον ακροδέκτη I2C GPIO της πλακέτας που συνδέεται με τη γραμμή SCL. Η τελευταία παράμετρος είναι η σύνδεση συχνότητας. Ρυθμίζουμε το SCL στον ακροδέκτη 1 και το SDA στον ακροδέκτη 0.

Δημιουργούμε ένα αντικείμενο MPU6050 που ονομάζεται imu και έχουμε πρόσβαση στις ενδείξεις του αισθητήρα μέσω αυτού.

i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
imu = MPU6050(i2c)

Στη συνέχεια, εκτελούμε συνεχώς ένα βρόχο μέσα στον οποίο έχουμε πρόσβαση στις ενδείξεις του αισθητήρα. Θα εκτυπώσουμε τις τιμές στο τερματικό δίνοντας την εντολή εκτύπωσης. Προσθέτουμε επίσης μια καθυστέρηση μετά την ενημέρωση κάθε συνόλου μετρήσεων σε νέες. Οι μετρήσεις περιλαμβάνουν επιτάχυνση (x, y και z), γυροσκόπιο (x, y και z) και θερμοκρασία.

while True:
    ax=round(imu.accel.x,2)
    ay=round(imu.accel.y,2)
    az=round(imu.accel.z,2)
    gx=round(imu.gyro.x)
    gy=round(imu.gyro.y)
    gz=round(imu.gyro.z)
    tem=round(imu.temperature,2)
    print("ax",ax,"\t","ay",ay,"\t","az",az,"\t","gx",gx,"\t","gy",gy,"\t","gz",gz,"\t","Temperature",tem,"        ",end="\r")
    sleep(0.2)

Επίδειξη

Για να δοκιμάσετε το σενάριο MicroPython για MPU-6050 με το Raspberry Pi Pico, τρέξτε το αρχείο σας.

Θα δείτε τις τιμές Accelerometer, Gyroscope και Temperature στην κονσόλα κελύφους να αλλάζουν συνεχώς καθώς μετακινείτε τον αισθητήρα σε διαφορετικούς προσανατολισμούς.