Taula de continguts:
- Pas 1: mòdul MPU-6050
- Pas 2: càlculs
- Pas 3: connexions MPU6050-Atmega328p
- Pas 4: codis i explicacions
- Pas 5: entendre l'angle d'inclinació
Vídeo: MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p): 5 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:11
L'IMU MPU6050 té acceleròmetre de 3 eixos i giroscopi de 3 eixos integrats en un sol xip.
El giroscopi mesura la velocitat de rotació o la velocitat de canvi de la posició angular al llarg del temps, al llarg dels eixos X, Y i Z.
Les sortides del giroscopi estan en graus per segon, de manera que per obtenir la posició angular només cal integrar la velocitat angular.
D’altra banda, l’acceleròmetre MPU6050 mesura l’acceleració mesurant l’acceleració gravitatòria al llarg dels 3 eixos i utilitzant algunes matemàtiques de trigonometria podem calcular l’angle en què es troba el sensor. Per tant, si fusionem o combinem les dades de l’acceleròmetre i el giroscopi, podem obtenir informació molt precisa sobre l’orientació del sensor.
Giroscopi de 3 eixos El MPU-6050 consisteix en un giroscopi de 3 eixos que pot detectar la velocitat de rotació al llarg de l’eix x, y, z amb tecnologia de sistemes microelectromecànics (MEMS). Quan el sensor es gira al llarg de qualsevol eix, es produeix una vibració a causa de l’efecte Coriolis que és detectat pel MEMS. L’ADC de 16 bits s’utilitza per digitalitzar la tensió per mostrar cada eix. +/- 250, +/- 500, +/- 1000, +/- 2000 són la gamma completa de la producció. La velocitat angular es mesura al llarg de cada eix en unitats de grau per segon.
Enllaç útil: …………….
Tauler Arduino:. ……….
MPU6050 IMU ……………
Pas 1: mòdul MPU-6050
El mòdul MPU-6050 té 8 pins,
INT: Interrompre el pin de sortida digital.
AD0: Pin LSB d'adreça esclau I2C. Es tracta del 0è bit en l'adreça esclava de 7 bits del dispositiu. Si es connecta a VCC, es llegeix com a lògica i canvia l'adreça de l'esclau.
XCL: passador de rellotge sèrie auxiliar. Aquest pin s'utilitza per connectar altres pins SCL de sensors habilitats per a la interfície I2C a MPU-6050.
XDA: pin de dades sèrie auxiliar. Aquest pin s’utilitza per connectar altres pins SDA de sensors habilitats per a la interfície I2C a MPU-6050.
SCL: pin de rellotge en sèrie. Connecteu aquest pin al pin SCL dels microcontroladors. SDA: PIN de dades de sèrie. Connecteu aquest pin al pin SDA dels microcontroladors.
GND: passador de terra. Connecteu aquest pin a la connexió de terra.
VCC: pin d'alimentació. Connecteu aquest pin al subministrament de + 5V CC. El mòdul MPU-6050 té adreça esclava (quan AD0 = 0, és a dir, no està connectat a Vcc) com, Adreça d'escriptura esclava (SLA + W): 0xD0
Adreça de lectura esclava (SLA + R): 0xD1
Pas 2: càlculs
Les dades del sensor de giroscopi i acceleròmetre del mòdul MPU6050 consten de dades brutes de 16 bits en forma de complement de 2.
Les dades del sensor de temperatura del mòdul MPU6050 consten de dades de 16 bits (no en forma de complement de 2).
Ara suposem que hem seleccionat,
- Gamma d’acceleròmetres a escala completa de +/- 2g amb factor d’escala de sensibilitat de 16, 384 LSB (recompte) / g.
- Gamma a escala completa de giroscopi de +/- 250 ° / s amb factor d’escala de sensibilitat de 131 LSB (recompte) / ° / s. llavors,
Per obtenir dades en brut del sensor, primer hem de realitzar el complement de 2 en les dades del sensor de l’acceleròmetre i el giroscopi. Després d’obtenir dades brutes del sensor, podem calcular l’acceleració i la velocitat angular dividint les dades brutes del sensor amb el seu factor d’escala de sensibilitat de la manera següent:
Valors de l’acceleròmetre en g (força g)
- Acceleració al llarg de l’eix X = (Acceleròmetre eix X dades brutes / 16384) g.
- Acceleració al llarg de l'eix Y = (dades brutes de l'eix Y de l'acceleròmetre / 16384) g.
- Acceleració al llarg de l’eix Z = (dades brutes de l’eix Z de l’acceleròmetre / 16384) g.
Valors del giroscopi en ° / s (grau per segon)
- Velocitat angular al llarg de l'eix X = (gir de l'eix X dades brutes / 131) ° / s.
- Velocitat angular al llarg de l’eix Y = (dades brutes del giroscopi de l’eix Y / 131) ° / s.
- Velocitat angular al llarg de l'eix Z = (gir de l'eix Z dades brutes / 131) ° / s.
Valor de la temperatura en ° / c (grau per centígrad)
Temperatura en graus C = ((dades del sensor de temperatura) / 340 + 36,53) ° / c.
Per exemple, Suposem que, després del complement de 2’, obtenim l’acceleròmetre X eixos valor brut = +15454
Llavors Ax = +15454/16384 = 0,94 g.
Més,
Sabem, doncs, que funcionem a una sensibilitat de +/- 2G i +/- 250deg / s, però com corresponen els nostres valors a aquestes acceleracions / angles.
Tots dos són gràfics en línia recta i podem deduir-los que per 1G llegirem 16384 i per 1 grau / seg llegirem 131.07 (tot i que el.07 s’ignorarà a causa del binari) aquests valors s’acaben de dibuixar gràfic de línies rectes amb 2G a 32767 i -2G a -32768 i 250 / -250 als mateixos valors.
Per tant, ara sabem els nostres valors de sensibilitat (16384 i 131,07), només hem de restar els desplaçaments dels nostres valors i després dividir-los per la sensibilitat.
Aquests funcionaran bé per als valors X i Y, però com que la Z es va registrar a 1G i no a 0, haurem de menys 1G (16384) abans de dividir per la nostra sensibilitat.
Pas 3: connexions MPU6050-Atmega328p
Només cal que connecteu tot el que es mostra al diagrama …
Les connexions es donen de la següent manera: -
MPU6050 Arduino Nano
Pin de sortida de 5 VCC
GND Pin de terra
Pin SDA A4 // dades de sèrie
Pin SCL A5 // rellotge en sèrie
Càlcul de pitch and roll: el roll és la rotació al voltant de l’eix x i el pitch és la rotació al llarg de l’eix y.
El resultat és en radians. (convertir a graus multiplicant per 180 i dividint per pi)
Pas 4: codis i explicacions
/*
Tutorial sobre accelerador i sensor de giroscopi Arduino i MPU6050 de Dejan, https://howtomechatronics.com * / #include const int MPU = 0x68; // Adreça MPU6050 I2C flotant AccX, AccY, AccZ; flotació GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; rotlle de flotador, pitch, yaw; flotant AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; configuració nul·la () {Serial.begin (19200); Wire.begin (); // Inicialitzar la comunicació Wire.beginTransmission (MPU); // Inicieu la comunicació amb MPU6050 // MPU = 0x68 Wire.write (0x6B); // Parleu amb el registre 6B Wire.write (0x00); // Feu un restabliment: col·loqueu un 0 al registre 6B Wire.endTransmission (true); // finalitzar la transmissió / * // Configurar la sensibilitat de l’acceleròmetre: rang d’escala completa (per defecte +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Parleu amb el registre ACCEL_CONFIG (hexagonal 1C) Wire.write (0x10); // Estableix els bits de registre com a 00010000 (+/- 8g a escala completa) Wire.endTransmission (true); // Configurar la sensibilitat del giroscopi: rang d’escala completa (per defecte +/- 250deg / s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Parleu amb el registre GYRO_CONFIG (hexagonal 1B) Wire.write (0x10); // Estableix els bits de registre com a 00010000 (1000deg / s a escala completa) Wire.endTransmission (true); retard (20); * / // Truqueu a aquesta funció si necessiteu obtenir els valors d'error IMU per al vostre mòdul calculate_IMU_error (); retard (20); } void loop () {// === Llegir dades de l’accelerador === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Comenceu amb el registre 0x3B (ACCEL_XOUT_H) Wire.endTransmission (fals); Wire.requestFrom (MPU, 6, true); // Llegiu 6 registres en total, cada valor d'eix s'emmagatzema en 2 registres // Per a un rang de + -2g, hem de dividir els valors en brut per 16384, segons el full de dades AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Valor de l'eix X AccY = (Fil de lectura () << 8 | Fil de lectura ()) / 16384.0; // Valor de l'eix Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Valor de l'eix Z // Càlcul del roll i el pitch a partir de les dades de l'acceleròmetre accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) Consulteu la funció personalitzada calculate_IMU_error () per obtenir més detalls accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-1,58) // === Llegir dades del giroscopi === // Temps anterior = Temps actual; // L'hora anterior s'emmagatzema abans de l'hora real de lectura currentTime = millis (); // Temps actual temps real llegit elapsedTime = (CurrentTime - previousTime) / 1000; // Divideix per 1000 per obtenir segons Wire.beginTransmission (MPU); Wire.write (0x43); // Primera adreça de registre de dades giroscòpiques 0x43 Wire.endTransmission (fals); Wire.requestFrom (MPU, 6, true); // Llegiu 4 registres en total, cada valor d'eix s'emmagatzema en 2 registres GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Per a un rang de 250deg / s hem de dividir primer el valor en brut per 131,0, segons el full de dades GyroY = (Wire.read () << 8 | Wire.read ()) / 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Corregiu les sortides amb els valors d'error calculats GyroX = GyroX + 0,56; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0,8) // Actualment els valors en brut són en graus per segon, deg / s, de manera que hem de multiplicar per sendonds (s) per obtenir l'angle en graus gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg / s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * elapsedTime; // Filtre complementari: combina els valors de l’accelerador i l’angle de giroscopi = 0,96 * gyroAngleX + 0,04 * accAngleX; pitch = 0,96 * gyroAngleY + 0,04 * accAngleY; // Imprimiu els valors al monitor sèrie Serial.print (roll); Serial.print ("/"); Serial.print (pitch); Serial.print ("/"); Serial.println (yaw); } void calculate_IMU_error () {// Podem anomenar aquesta funció a la secció de configuració per calcular l’acceleròmetre i l’error de dades giroscòpiques. A partir d’aquí obtindrem els valors d’error utilitzats en les equacions anteriors impreses al monitor sèrie. // Tingueu en compte que hauríem de col·locar la IMU plana per obtenir els valors adequats, de manera que puguem obtenir els valors correctes // Llegiu els valors de l’acceleròmetre 200 vegades mentre (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (fals); 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; // Suma totes les lectures 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 ++; } // Divideix la suma per 200 per obtenir el valor d'error AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Llegiu els valors giroscòpics 200 vegades mentre (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (fals); Wire.requestFrom (MPU, 6, true); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Suma totes les lectures GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Divideix la suma per 200 per obtenir el valor d'error GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Imprimiu els valors d'error a 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); } ------------------------------------------------- ---------------------------------------------- Resultats: - X = Y = Z = -------------------------------------------- ----------------------------------------------- Nota important: - ----------------
A la secció del bucle, comencem llegint les dades de l’acceleròmetre. Les dades de cada eix s’emmagatzemen en 2 bytes o registres i podem veure les adreces d’aquests registres a la fitxa tècnica del sensor.
Per llegir-los tots, comencem pel primer registre i, mitjançant la funció requiestFrom (), demanem llegir els 6 registres dels eixos X, Y i Z. A continuació, llegim les dades de cada registre i, com que les sortides són complementàries, les combinem adequadament per obtenir els valors correctes.
Pas 5: entendre l'angle d'inclinació
Acceleròmetre
La gravetat terrestre és una acceleració constant on la força sempre apunta cap al centre de la Terra.
Quan l’acceleròmetre és paral·lel a la gravetat, l’acceleració mesurada serà 1G, quan l’acceleròmetre és perpendicular a la gravetat, mesurarà 0G.
L'angle d'inclinació es pot calcular a partir de l'acceleració mesurada mitjançant aquesta equació:
θ = sin-1 (Acceleració mesurada / acceleració de la gravetat)
El giroscopi (també conegut com a sensor de velocitat) s’utilitza per mesurar la velocitat angular (ω).
Per obtenir l’angle d’inclinació d’un robot, hem d’integrar les dades del giroscopi tal com es mostra a l’equació següent:
ω = dθ / dt, θ = ∫ ω dt
Fusió del sensor giroscopi i acceleròmetre Després d’estudiar les característiques del giroscopi i l’acceleròmetre, sabem que tenen els seus propis punts forts i febles. L’angle d’inclinació calculat a partir de les dades de l’acceleròmetre té un temps de resposta lent, mentre que l’angle d’inclinació integrat a partir de les dades giroscòpiques es veu sotmès a la deriva durant un període de temps. Dit d’una altra manera, podem dir que les dades de l’acceleròmetre són útils a llarg termini, mentre que les dades giroscòpiques són útils a curt termini.
Enllaç per a una millor comprensió: feu clic aquí
Recomanat:
Llarg abast, 1,8 km, comunicació sense fils Arduino a Arduino amb l'HC-12 .: 6 passos (amb imatges)
Llarg abast, 1,8 km, comunicació sense fils Arduino a Arduino amb l'HC-12: en aquest instructiu aprendreu com comunicar-vos entre Arduinos a una distància llarga de fins a 1,8 km a l'aire lliure. L'HC-12 és un port sèrie sense fils mòdul de comunicació molt útil, extremadament potent i fàcil d'utilitzar. Primer sortireu
Catifa amb sensors / Comunicació RF amb Arduino Micro: 4 passos (amb imatges)
Catifa amb sensors / Comunicació RF amb Arduino Micro: recentment he acabat la instal·lació Igualment diversa, que consisteix en una sèrie de làmpades que reaccionen als sensors col·locats en una catifa a sota de les làmpades. Així és com vaig fabricar la catifa amb sensors de pressió. Espero que us sigui útil
Com mesurar l'angle amb MPU-6050 (GY-521): 3 passos
Com es mesura l'angle amb MPU-6050 (GY-521): en aquest manual, mesurarem l'angle amb un Arduino. Necessitem uns cables, un Arduino UNO i GY-521 (MPU-6050) per mesurar l’angle
Registre de dades MPU-6050 / A0 en temps real amb Arduino i Android: 7 passos (amb imatges)
Registre de dades MPU-6050 / A0 en temps real amb Arduino i Android: m'ha interessat utilitzar l'Arduino per a l'aprenentatge automàtic. Com a primer pas, vull crear una pantalla i registre de dades en temps real (o bastant a prop) amb un dispositiu Android. Vull capturar dades de l’acceleròmetre de la MPU-6050, així que dissenyo
Maverick: cotxe de comunicació bidireccional amb control remot: 17 passos (amb imatges)
Maverick: cotxe de comunicació bidireccional amb control remot: Ei, tothom, sóc Razvan i us donem la benvinguda al meu „ Maverick ” project Sempre m’han agradat les coses controlades a distància, però mai he tingut un cotxe RC. Així que vaig decidir construir-ne un que pugui fer una mica més que moure’s. Per a aquest projecte farem