Inhoudsopgave:

MPU 6050 Gyro, versnellingsmetercommunicatie met Arduino (Atmega328p) - Ajarnpa
MPU 6050 Gyro, versnellingsmetercommunicatie met Arduino (Atmega328p) - Ajarnpa

Video: MPU 6050 Gyro, versnellingsmetercommunicatie met Arduino (Atmega328p) - Ajarnpa

Video: MPU 6050 Gyro, versnellingsmetercommunicatie met Arduino (Atmega328p) - Ajarnpa
Video: How to use MPU-6050 Accelerometer and Gyroscope with Arduino code 2024, November
Anonim
MPU 6050 Gyro, versnellingsmetercommunicatie met Arduino (Atmega328p)
MPU 6050 Gyro, versnellingsmetercommunicatie met Arduino (Atmega328p)
MPU 6050 Gyro, versnellingsmetercommunicatie met Arduino (Atmega328p)
MPU 6050 Gyro, versnellingsmetercommunicatie met Arduino (Atmega328p)
MPU 6050 Gyro, versnellingsmetercommunicatie met Arduino (Atmega328p)
MPU 6050 Gyro, versnellingsmetercommunicatie met Arduino (Atmega328p)

De MPU6050 IMU heeft zowel een 3-assige versnellingsmeter als een 3-assige gyroscoop geïntegreerd op een enkele chip.

De gyroscoop meet de rotatiesnelheid of veranderingssnelheid van de hoekpositie in de tijd, langs de X-, Y- en Z-as.

De uitgangen van de gyroscoop zijn in graden per seconde, dus om de hoekpositie te krijgen, hoeven we alleen de hoeksnelheid te integreren.

Aan de andere kant meet de MPU6050-versnellingsmeter de versnelling door de zwaartekrachtversnelling langs de 3 assen te meten en met behulp van wat trigonometrische wiskunde kunnen we de hoek berekenen waaronder de sensor is geplaatst. Dus als we de versnellingsmeter- en gyroscoopgegevens fuseren of combineren, kunnen we zeer nauwkeurige informatie krijgen over de oriëntatie van de sensor.

3-assige gyroscoop De MPU-6050 bestaat uit een 3-assige gyroscoop die de rotatiesnelheid langs de x-, y- en z-as kan detecteren met micro-elektromechanische systeemtechnologie (MEMS). Wanneer de sensor langs een as wordt gedraaid, wordt er een trilling geproduceerd vanwege het Coriolis-effect dat wordt gedetecteerd door de MEMS.16-bits ADC wordt gebruikt om de spanning te digitaliseren om elke as te bemonsteren. +/- 250, +/- 500, +/- 1000, +/- 2000 zijn het volledige uitvoerbereik. De hoeksnelheid wordt langs elke as gemeten in graad per seconde.

Handige link:……………….

Arduino-bord:.………….

MPU6050 IMU ……………https://compoindia.com/product/mpu6050-3-axis-accelerometer-and-gyroscope-sensor/

Stap 1: MPU-6050-module

MPU-6050-module
MPU-6050-module

De MPU-6050-module heeft 8 pinnen,

INT: Digitale uitgangspin onderbreken.

AD0: I2C-slaveadres LSB-pin. Dit is het 0e bit in het 7-bits slave-adres van het apparaat. Indien aangesloten op VCC, wordt het gelezen als logisch en verandert het slave-adres.

XCL: extra seriële klokpen. Deze pin wordt gebruikt om andere I2C-interface-enabled sensoren SCL-pin aan te sluiten op de MPU-6050.

XDA: extra seriële gegevenspin. Deze pin wordt gebruikt om andere I2C-interface-enabled sensoren SDA-pin aan te sluiten op de MPU-6050.

SCL: Seriële klokpen. Verbind deze pin met de SCL-pin van de microcontroller. SDA: seriële gegevenspin. Verbind deze pin met de SDA-pin van de microcontroller.

GND: aardpen. Verbind deze pin met de massaverbinding.

VCC: Voedingspin. Sluit deze pin aan op +5V DC voeding. MPU-6050-module heeft een slave-adres (wanneer AD0 = 0, d.w.z. het is niet verbonden met Vcc) als, Slave Schrijfadres (SLA+W): 0xD0

Slave Lees adres (SLA+R): 0xD1

Stap 2: Berekeningen

Berekeningen
Berekeningen

De sensorgegevens van de gyroscoop en versnellingsmeter van de MPU6050-module bestaan uit 16-bits onbewerkte gegevens in de complementaire vorm van 2.

Temperatuursensorgegevens van de MPU6050-module bestaan uit 16-bits gegevens (niet in 2-complementvorm).

Stel nu dat we hebben gekozen,

  • - Accelerometer volledig schaalbereik van +/- 2g met gevoeligheidsschaalfactor van 16, 384 LSB(count)/g.
  • - Gyroscoop volledig schaalbereik van +/- 250 °/s met gevoeligheidsschaalfactor van 131 LSB (count)/°/s. dan,

Om onbewerkte sensorgegevens te krijgen, moeten we eerst 2's complement uitvoeren op sensorgegevens van versnellingsmeter en gyroscoop. Nadat we de onbewerkte sensorgegevens hebben ontvangen, kunnen we de versnelling en hoeksnelheid berekenen door de onbewerkte sensorgegevens als volgt te delen met hun gevoeligheidsschaalfactor:

Versnellingsmeterwaarden in g (g kracht)

  • Versnelling langs de X-as = (Accelerometer X-as onbewerkte gegevens/16384) g.
  • Versnelling langs de Y-as = (Accelerometer Y-as onbewerkte gegevens/16384) g.
  • Versnelling langs de Z-as = (Accelerometer Z-as onbewerkte gegevens/16384) g.

Gyroscoopwaarden in °/s (graden per seconde)

  • Hoeksnelheid langs de X-as = (Gyroscoop X-as onbewerkte gegevens/131) °/s.
  • Hoeksnelheid langs de Y-as = (Gyroscoop Y-as onbewerkte gegevens/131) °/s.
  • Hoeksnelheid langs de Z-as = (Gyroscoop Z-as onbewerkte gegevens/131) °/s.

Temperatuurwaarde in °/c (graden per Celsius)

Temperatuur in graden C = ((gegevens temperatuursensor)/340 + 36,53 °/c.

Bijvoorbeeld, Stel dat we na 2'-complement de ruwe waarde van versnellingsmeter X-assen = +15454. krijgen

Dan Ax = +15454/16384 = 0,94 g.

Meer,

We weten dus dat we werken met een gevoeligheid van +/- 2G en +/- 250deg/s, maar hoe komen onze waarden overeen met die versnellingen/hoeken.

Dit zijn beide rechte lijngrafieken en we kunnen daaruit afleiden dat we voor 1G 16384 zullen lezen en voor 1 graad/sec zullen we 131.07 lezen (hoewel de.07 genegeerd zal worden vanwege binair) deze waarden zijn zojuist uitgewerkt door het tekenen van de rechte lijngrafiek met 2G bij 32767 en -2G bij -32768 en 250/-250 bij dezelfde waarden.

Dus nu we onze gevoeligheidswaarden kennen (16384 en 131.07), hoeven we alleen de offsets van onze waarden te minen en vervolgens te delen door de gevoeligheid.

Deze werken prima voor de X- en Y-waarden, maar aangezien de Z werd geregistreerd op 1G en niet op 0, moeten we 1G (16384) min aftrekken voordat we delen door onze gevoeligheid.

Stap 3: MPU6050-Atmega328p-verbindingen

MPU6050-Atmega328p-aansluitingen
MPU6050-Atmega328p-aansluitingen
MPU6050-Atmega328p-aansluitingen
MPU6050-Atmega328p-aansluitingen
MPU6050-Atmega328p-aansluitingen
MPU6050-Atmega328p-aansluitingen

Sluit gewoon alles aan zoals aangegeven in het diagram…

De verbindingen worden als volgt gegeven: -

MPU6050 Arduino Nano

VCC 5v uit pin

GND Aardingspen

SDA A4-pin //seriële gegevens

SCL A5 pin // seriële klok

Pitch and Roll-berekening: Roll is de rotatie rond de x-as en pitch is de rotatie langs de y-as.

Het resultaat is in radialen. (omrekenen naar graden door te vermenigvuldigen met 180 en te delen door pi)

Stap 4: Codes en uitleg

Codes en uitleg
Codes en uitleg

/*

Arduino en MPU6050 Accelerometer en Gyroscoop Sensor Tutorial door Dejan, https://howtomechatronics.com */ #include const int MPU = 0x68; // MPU6050 I2C-adres float AccX, AccY, AccZ; vlotter GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; drijven rollen, stampen, gieren; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; intc = 0; void setup() { Serial.begin (19200); Draad.begin(); // Initialiseer communicatie Wire.beginTransmission (MPU); // Start communicatie met MPU6050 // MPU=0x68 Wire.write (0x6B); // Praat met het register 6B Wire.write (0x00); // Maak reset - plaats een 0 in het 6B-register Wire.endTransmission (true); //Beëindig de verzending /* // Configureer de gevoeligheid van de versnellingsmeter - Volledig schaalbereik (standaard +/- 2g) Wire.beginTransmission (MPU); Draad.schrijven (0x1C); // Praat met het ACCEL_CONFIG-register (1C hex) Wire.write (0x10); // Stel de registerbits in als 00010000 (+/- 8g volledig schaalbereik) Wire.endTransmission (true); // Gyrogevoeligheid configureren - Volledig schaalbereik (standaard +/- 250deg/s) Wire.beginTransmission (MPU); Draad.schrijven (0x1B); // Praat met het GYRO_CONFIG-register (1B hex) Wire.write (0x10); // Stel de registerbits in als 00010000 (1000deg/s volledige schaal) Wire.endTransmission (true); vertraging(20); */ // Roep deze functie aan als u de IMU-foutwaarden voor uw module wilt krijgen: berekenen_IMU_error(); vertraging(20); } void loop () {// === Lees versnellingsgegevens === // Wire.beginTransmission (MPU); Draad.schrijven (0x3B); // Begin met register 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, waar); // Lees in totaal 6 registers, elke aswaarde wordt opgeslagen in 2 registers // Voor een bereik van +-2g moeten we de onbewerkte waarden delen door 16384, volgens de datasheet AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-aswaarde AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-aswaarde AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-aswaarde // Berekening van rol en pitch uit de accelerometergegevens accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~(0.58) Zie de calculator_IMU_error()aangepaste functie voor meer details accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~(-1.58) // === Lees gyroscoopgegevens === // previousTime = currentTime; // Vorige tijd wordt opgeslagen vóór de werkelijke tijd lees currentTime = millis(); // Huidige tijd werkelijke tijd gelezen elapsedTime = (currentTime - previousTime) / 1000; // Deel door 1000 om seconden Wire.beginTransmission (MPU) te krijgen; Draad.schrijven (0x43); // Gyrogegevens eerste registeradres 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, waar); // Lees in totaal 4 registers, elke aswaarde wordt opgeslagen in 2 registers GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // Voor een bereik van 250 graden/s moeten we eerst de onbewerkte waarde delen door 131,0, volgens de datasheet GyroY = (Wire.read() << 8 | Wire.read()) / 131.0; GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0; // Corrigeer de uitgangen met de berekende foutwaarden GyroX = GyroX + 0,56; // GyroErrorX ~(-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0.8) // Momenteel zijn de ruwe waarden in graden per seconde, graden/s, dus we moeten vermenigvuldigen met sendonds (s) om de hoek in graden te krijgen gyroAngleX = gyroAngleX + GyroX * elapsedTime; // graden/s * s = graden gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * elapsedTime; // Aanvullend filter - combineer versnellings- en gyrohoekwaarden roll = 0,96 * gyroAngleX + 0,04 * accAngleX; pitch = 0,96 * gyroAngleY + 0,04 * accAngleY; // Druk de waarden af op de seriële monitor Serial.print(roll); Serieel.print("/"); Serial.print (pitch); Serieel.print("/"); Serial.println(yaw); } void calculator_IMU_error() { // We kunnen deze functie in de setup-sectie aanroepen om de accelerometer en gyro-gegevensfout te berekenen. Vanaf hier krijgen we de foutwaarden die worden gebruikt in de bovenstaande vergelijkingen die op de seriële monitor zijn afgedrukt. // Merk op dat we de IMU plat moeten plaatsen om de juiste waarden te krijgen, zodat we dan de juiste waarden kunnen krijgen // Accelerometerwaarden 200 keer lezen while (c < 200) { Wire.beginTransmission(MPU); Draad.schrijven (0x3B); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, waar); AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Som alle metingen op 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++; } // Deel de som door 200 om de foutwaarde te krijgen AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Lees gyro-waarden 200 keer terwijl (c <200) { Wire.beginTransmission (MPU); Draad.schrijven (0x43); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, waar); GyroX = Wire.read() << 8 | Draad.lezen(); GyroY = Wire.read() << 8 | Draad.lezen(); GyroZ = Wire.read() << 8 | Draad.lezen(); // Som alle metingen op GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131,0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c++; } // Deel de som door 200 om de foutwaarde te krijgen GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Druk de foutwaarden af op de seriële monitor Serial.print("AccErrorX: "); Seriële.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); } ------------------------------------------------- ---------------------------------------------- Resultaten:- X = Y = Z = --------------------------------------------- ----------------------------------------------- Belangrijke notitie: ----------------

In het lusgedeelte beginnen we met het lezen van de versnellingsmetergegevens. De gegevens voor elke as worden opgeslagen in 2 bytes of registers en we kunnen de adressen van deze registers zien in het gegevensblad van de sensor.

Om ze allemaal te lezen, beginnen we met het eerste register en met de functie requiestFrom() vragen we om alle 6 registers voor de X-, Y- en Z-assen te lezen. Vervolgens lezen we de gegevens van elk register en omdat de uitgangen twee complementair zijn, combineren we ze op de juiste manier om de juiste waarden te krijgen.

Stap 5: Kantelhoek begrijpen

Versnellingsmeter

De zwaartekracht van de aarde is een constante versnelling waarbij de kracht altijd naar het middelpunt van de aarde wijst.

Wanneer de versnellingsmeter parallel is met de zwaartekracht, zal de gemeten versnelling 1G zijn, wanneer de versnellingsmeter loodrecht op de zwaartekracht staat, zal deze 0G meten.

Kantelhoek kan worden berekend uit de gemeten versnelling met behulp van deze vergelijking:

θ = sin-1 (gemeten versnelling / zwaartekrachtversnelling)

GyroGyro (ook bekend als snelheidssensor) wordt gebruikt om de hoeksnelheid (ω) te meten.

Om de kantelhoek van een robot te krijgen, moeten we de gegevens van de gyro integreren, zoals weergegeven in de onderstaande vergelijking:

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

Gyro- en accelerometersensorfusieNa bestudering van de kenmerken van zowel de gyro als de accelerometer, weten we dat ze hun eigen sterke en zwakke punten hebben. De berekende hellingshoek van de versnellingsmetergegevens heeft een langzame responstijd, terwijl de geïntegreerde hellingshoek van de gyrogegevens gedurende een bepaalde periode onderhevig is aan drift. Met andere woorden, we kunnen zeggen dat de versnellingsmetergegevens nuttig zijn voor de lange termijn, terwijl de gyrogegevens nuttig zijn voor de korte termijn.

Link voor een beter begrip: Klik Hier

Aanbevolen: