Obsah:

Gyroskop MPU 6050, akcelerometer, komunikácia s Arduino (Atmega328p): 5 krokov
Gyroskop MPU 6050, akcelerometer, komunikácia s Arduino (Atmega328p): 5 krokov

Video: Gyroskop MPU 6050, akcelerometer, komunikácia s Arduino (Atmega328p): 5 krokov

Video: Gyroskop MPU 6050, akcelerometer, komunikácia s Arduino (Atmega328p): 5 krokov
Video: MPU-6050 6dof IMU tutorial for auto-leveling quadcopters with Arduino source code 2024, November
Anonim
Gyroskop MPU 6050, akcelerometer, komunikácia s Arduino (Atmega328p)
Gyroskop MPU 6050, akcelerometer, komunikácia s Arduino (Atmega328p)
Gyroskop MPU 6050, akcelerometer, komunikácia s Arduino (Atmega328p)
Gyroskop MPU 6050, akcelerometer, komunikácia s Arduino (Atmega328p)
Gyroskop MPU 6050, akcelerometer, komunikácia s Arduino (Atmega328p)
Gyroskop MPU 6050, akcelerometer, komunikácia s Arduino (Atmega328p)

MPU6050 IMU má v jednom čipe integrovaný trojosový akcelerometer aj trojosový gyroskop.

Gyroskop meria rotačnú rýchlosť alebo rýchlosť zmeny uhlovej polohy v priebehu času pozdĺž osi X, Y a Z.

Výstupy gyroskopu sú v stupňoch za sekundu, takže na získanie uhlovej polohy stačí integrovať uhlovú rýchlosť.

Na druhej strane akcelerometer MPU6050 meria zrýchlenie meraním gravitačného zrýchlenia pozdĺž 3 osí a pomocou trigonometrickej matematiky môžeme vypočítať uhol, pod ktorým je snímač umiestnený. Ak teda spojíme alebo skombinujeme údaje akcelerometra a gyroskopu, môžeme získať veľmi presné informácie o orientácii senzora.

3-osový gyroskop MPU-6050 sa skladá z 3-osého gyroskopu, ktorý dokáže detekovať rýchlosť otáčania pozdĺž osi x, y, z pomocou technológie mikroelektronického systému (MEMS). Keď sa snímač otáča pozdĺž ľubovoľnej osi, vibrácie vznikajú v dôsledku Coriolisovho efektu, ktorý je detegovaný systémom MEMS. Na digitalizáciu napätia na vzorkovanie každej osi sa používa 16-bitový ADC. +/- 250, +/- 500, +/- 1 000, +/- 2 000 sú rozsah rozsahu výstupu v celom rozsahu. Uhlová rýchlosť sa meria pozdĺž každej osi v stupňoch za sekundu.

Užitočný odkaz: …………….

Doska Arduino: ………..

MPU6050 IMU ……………

Krok 1: Modul MPU-6050

Modul MPU-6050
Modul MPU-6050

Modul MPU-6050 má 8 pinov,

INT: Prerušenie digitálneho výstupného kolíka.

AD0: Kolík LSB slave adresy I2C. Toto je 0-ty bit v 7-bitovej slave adrese zariadenia. Ak je pripojený k VCC, potom sa číta ako logická jednotka a zmení sa adresa slave.

XCL: Kolík pomocných sériových hodín. Tento kolík sa používa na pripojenie ďalších snímačov SCL s povoleným rozhraním I2C k MPU-6050.

XDA: kolík pomocných sériových dát. Tento pin sa používa na pripojenie ďalších senzorov SDA s rozhraním I2C k MPU-6050.

SCL: Sériový hodinový kolík. Pripojte tento pin k pinu SCL mikrokontrolérov. SDA: pin sériových dát. Pripojte tento pin k pinu mikrokontrolérov SDA.

GND: Uzemňovací kolík. Pripojte tento kolík k uzemneniu.

VCC: Kolík napájacieho zdroja. Pripojte tento kolík k napájaniu +5 V DC. Modul MPU-6050 má adresu Slave (keď AD0 = 0, t.j. nie je pripojený k Vcc) ako, Adresa slave pre zápis (SLA+W): 0xD0

Slave Adresa na čítanie (SLA+R): 0xD1

Krok 2: Výpočty

Výpočty
Výpočty

Údaje senzora gyroskopu a akcelerometra z modulu MPU6050 pozostávajú zo 16-bitových nespracovaných údajov v doplnkovej forme 2.

Údaje teplotného senzora modulu MPU6050 pozostávajú zo 16-bitových údajov (nie vo forme doplnku 2).

Predpokladajme, že sme vybrali

  • - Rozsah akcelerometra +/- 2 g s faktorom stupnice citlivosti 16, 384 LSB (počet)/g.
  • - Rozsah gyroskopu v rozsahu +/- 250 °/s s faktorom stupnice citlivosti 131 LSB (počet)/°/s. potom,

Aby sme získali surové údaje senzora, musíme najskôr vykonať doplnok 2 na údajoch senzora akcelerometra a gyroskopu. Po získaní nespracovaných údajov zo senzorov môžeme vypočítať zrýchlenie a uhlovú rýchlosť rozdelením nespracovaných údajov zo senzora s ich faktorom stupnice citlivosti nasledovne-

Hodnoty akcelerometra v g (g sila)

  • Zrýchlenie pozdĺž osi X = (akcelerometer nespracované údaje osi X/16384) g.
  • Zrýchlenie pozdĺž osi Y = (akcelerometer hrubé údaje osi Y/16384) g.
  • Zrýchlenie pozdĺž osi Z = (Akcelerometer hrubé údaje osi Z/16384) g.

Hodnoty gyroskopu v °/s (stupeň za sekundu)

  • Uhlová rýchlosť pozdĺž osi X = (nespracované údaje osi X gyroskopu/131) °/s.
  • Uhlová rýchlosť pozdĺž osi Y = (nespracované údaje osi Y gyroskopu/131) °/s.
  • Uhlová rýchlosť pozdĺž osi Z = (nespracované údaje osi Z gyroskopu/131) °/s.

Hodnota teploty v °/c (stupne na stupne Celzia)

Teplota v stupňoch C = ((údaje snímača teploty)/340 + 36,53) °/c.

Napríklad, Predpokladajme, že po 2 ‘doplnku dostaneme surovú hodnotu osí akcelerometra X = +15454

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

Viac,

Vieme, že bežíme s citlivosťou +/- 2G a +/- 250 stupňov/s, ale ako naše hodnoty zodpovedajú týmto zrýchleniam/uhlom.

Sú to obidva lineárne grafy a môžeme z nich vyvodiť, že pre 1G budeme čítať 16384 a pre 1 stupeň/s budeme čítať 131,07 (Aj keď sa 0,07 bude ignorovať kvôli binárnej sústave) tieto hodnoty boli práve vypracované nakreslením lineárny graf s 2G pri 32767 a -2G pri -32768 a 250/-250 pri rovnakých hodnotách.

Teraz teda poznáme svoje hodnoty citlivosti (16384 a 131,07), stačí, aby sme mínus offsety od našich hodnôt a potom ich rozdelili podľa citlivosti.

Tieto hodnoty budú fungovať dobre pre hodnoty X a Y, ale keďže Z bol zaznamenaný pri 1G a nie 0, budeme musieť mínus 1G (16384) vypnúť a potom rozdeliť podľa svojej citlivosti.

Krok 3: Pripojenia MPU6050-Atmega328p

Pripojenia MPU6050-Atmega328p
Pripojenia MPU6050-Atmega328p
Pripojenia MPU6050-Atmega328p
Pripojenia MPU6050-Atmega328p
Pripojenia MPU6050-Atmega328p
Pripojenia MPU6050-Atmega328p

Stačí prepojiť všetko podľa schémy …

Pripojenia sú uvedené nasledovne:-

MPU6050 Arduino Nano

Výstupný kolík VCC 5v

Zemniaci kolík GND

SDA A4 pin // sériové údaje

Pin SCL A5 // sériové hodiny

Výpočet rozstupu a posúvania: Roll je rotácia okolo osi x a rozteč je rotácia pozdĺž osi y.

Výsledok je v radiánoch. (previesť na stupne vynásobením 180 a delením pi)

Krok 4: Kódy a vysvetlenia

Kódy a vysvetlenia
Kódy a vysvetlenia

/*

Výučba akcelerometra a gyroskopu pre Arduino a MPU6050 od Dejana, https://howtomechatronics.com */#include const int MPU = 0x68; // Adresa MPU6050 I2C float AccX, AccY, AccZ; plavák GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; plavák, smola, vybočenie; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Inicializácia komunikácie Wire.beginTransmission (MPU); // Začnite komunikáciu s MPU6050 // MPU = 0x68 Wire.write (0x6B); // Rozhovor s registrom 6B Wire.write (0x00); // Vykonajte reset - umiestnite 0 do registra 6B Wire.endTransmission (true); // ukončenie prenosu/* // Konfigurácia citlivosti akcelerometra - celý rozsah stupnice (predvolené +/- 2 g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Rozhovor s registrom ACCEL_CONFIG (1C hex) Wire.write (0x10); // Nastavte bity registra ako 00010000 (+/- 8 g plného rozsahu) Wire.endTransmission (true); // Konfigurácia citlivosti gyroskopu - celý rozsah stupnice (predvolené +/- 250 stupňov/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Rozhovor s registrom GYRO_CONFIG (1B hex) Wire.write (0x10); // Nastavte bity registra ako 00010000 (plná stupnica 1 000 stupňov/s) Wire.endTransmission (true); oneskorenie (20); */ // Zavolajte túto funkciu, ak potrebujete získať chybové hodnoty IMU pre váš modul count_IMU_error (); oneskorenie (20); } void loop () {// === Načítanie dát akcelerátora === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Začnite registrom 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true); // Prečítajte 6 registrov celkom, každá hodnota osi je uložená v 2 registroch // Pre rozsah +-2g potrebujeme rozdeliť nespracované hodnoty na 16384 podľa údajového listu AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // hodnota osi X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // hodnota osi Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // hodnota osi Z // Výpočet zvitku a rozstupu z údajov akcelerometra accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0,58) Podrobnejšie informácie nájdete vo vlastnej funkcii Calculate_IMU_error () accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-1,58) // === Načítať údaje gyroskopu === // previousTime = currentTime; // Predchádzajúci čas je uložený pred skutočným časom čítania currentTime = millis (); // Aktuálny čas aktuálny čas prečítaný elapsedTime = (currentTime - previousTime) / 1000; // Delenie 1 000 na získanie sekúnd Wire.beginTransmission (MPU); Wire.write (0x43); // Adresa prvého údaja gyroskopu 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true); // Prečítanie celkom 4 registrov, každá hodnota osi je uložená v 2 registroch GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Pre rozsah 250deg/ s musíme najskôr rozdeliť surovú hodnotu na 131,0 podľa údajového listu GyroY = (Wire.read () << 8 | Wire.read ())/ 131,0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131,0; // Výstupy opravte vypočítanými chybovými hodnotami GyroX = GyroX + 0,56; // GyroErrorX ~ (-0,56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0,8) // V súčasnej dobe sú surové hodnoty v stupňoch za sekundu, deg/s, preto musíme vynásobiť odoslaním (s), aby sme získali uhol v stupňoch gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; vybočiť = vybočiť + GyroZ * elapsedTime; // Doplnkový filter - skombinujte hodnoty akcelerometra a uhla gyroskopu roll = 0,96 * gyroAngleX + 0,04 * accAngleX; rozteč = 0,96 * gyroAngleY + 0,04 * accAngleY; // Vytlačte hodnoty na sériovom monitore Serial.print (roll); Serial.print ("/"); Serial.print (rozstup); Serial.print ("/"); Serial.println (vybočenie); } void count_IMU_error () {// Túto funkciu môžeme nazvať v sekcii nastavenia na výpočet chyby akcelerometra a gyroskopu. Odtiaľto dostaneme hodnoty chýb použité vo vyššie uvedených rovniciach vytlačené na sériovom monitore. // Všimnite si toho, že by sme mali umiestniť IMU flat, aby sme získali správne hodnoty, aby sme potom mohli správne hodnoty // Čítať hodnoty akcelerometra 200 krát while (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; // Sčítanie všetkých nameraných hodnôt 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 ++; } // Rozdelením súčtu o 200 získate chybovú hodnotu AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // 200 -násobné čítanie hodnôt gyroskopu while (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 (); // Sčítanie všetkých nameraných hodnôt GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131,0); GyroErrorZ = GyroErrorZ + (GyroZ / 131,0); c ++; } // Rozdelením súčtu o 200 získate chybovú hodnotu GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Vytlačte chybové hodnoty na 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); } ------------------------------------------------- ---------------------------------------------- Výsledky:-X = Y = Z = --------------------------------------------- ----------------------------------------------- Dôležitá poznámka: -----------------

V sekcii slučky začíname čítaním údajov akcelerometra. Údaje pre každú os sú uložené v 2 bajtoch alebo registroch a adresy týchto registrov vidíme z technického listu senzora.

Aby sme ich mohli všetky prečítať, začneme prvým registrom a pomocou funkcie requiestFrom () požiadame o prečítanie všetkých 6 registrov pre osi X, Y a Z. Potom prečítame údaje z každého registra a pretože výstupy sú dve komplementárne, vhodne ich skombinujeme, aby sme získali správne hodnoty.

Krok 5: Pochopenie uhla náklonu

Akcelerometer

Gravitácia Zeme je konštantné zrýchlenie, pri ktorom sila vždy smeruje nadol do stredu Zeme.

Keď je akcelerometer rovnobežný s gravitáciou, namerané zrýchlenie bude 1G, keď je akcelerometer kolmý na gravitáciu, bude merať 0G.

Uhol sklonu je možné vypočítať z nameraného zrýchlenia pomocou tejto rovnice:

θ = sin-1 (merané zrýchlenie / gravitačné zrýchlenie)

GyroGyro (snímač rýchlosti) sa používa na meranie uhlovej rýchlosti (ω).

Aby sme získali uhol sklonu robota, musíme integrovať údaje z gyroskopu, ako je uvedené v rovnici nižšie:

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

Fúzia senzora gyroskopu a akcelerometra Po štúdiu charakteristík gyroskopu a akcelerometra vieme, že majú svoje vlastné silné a slabé stránky. Vypočítaný uhol náklonu z údajov akcelerometra má pomalú dobu odozvy, zatiaľ čo integrovaný uhol náklonu z údajov gyroskopu sa po určitú dobu unáša. Inými slovami, môžeme povedať, že údaje z akcelerometra sú užitočné z dlhodobého hľadiska, zatiaľ čo údaje z gyroskopu sú užitočné z krátkodobého hľadiska.

Odkaz pre lepšie pochopenie: Kliknite sem

Odporúča: