Taula de continguts:

MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p): 5 passos
MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p): 5 passos

Vídeo: MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p): 5 passos

Vídeo: MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p): 5 passos
Vídeo: Unreal Arduino Aquaponic Rollup Working 2024, De novembre
Anonim
MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p)
MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p)
MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p)
MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p)
MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p)
MPU 6050 Gyro, comunicació acceleròmetre amb Arduino (Atmega328p)

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

Mòdul MPU-6050
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

Càlculs
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

Connexions MPU6050-Atmega328p
Connexions MPU6050-Atmega328p
Connexions MPU6050-Atmega328p
Connexions MPU6050-Atmega328p
Connexions MPU6050-Atmega328p
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

Codis i explicacions
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: