Tartalomjegyzék:

MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p): 5 lépés
MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p): 5 lépés

Videó: MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p): 5 lépés

Videó: MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p): 5 lépés
Videó: #35 - Labor Percek #5 - Saját Arduino építése 2024, November
Anonim
MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p)
MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p)
MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p)
MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p)
MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p)
MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p)

Az MPU6050 IMU 3 tengelyes gyorsulásmérőt és 3 tengelyes giroszkópot tartalmaz egyetlen chipen.

A giroszkóp az X, Y és Z tengely mentén méri a szöghelyzet forgási sebességét vagy változási sebességét.

A giroszkóp kimenetei másodpercenként vannak megadva, tehát a szöghelyzet eléréséhez csak be kell integrálnunk a szögsebességet.

Másrészt az MPU6050 gyorsulásmérő méri a gyorsulást a gravitációs gyorsulás mérésével a 3 tengely mentén, és néhány trigonometriai matematika segítségével kiszámíthatjuk az érzékelő elhelyezésének szögét. Tehát, ha összeolvasztjuk, vagy egyesítjük a gyorsulásmérő és a giroszkóp adatait, nagyon pontos információkat kaphatunk az érzékelő tájolásáról.

3 tengelyes giroszkóp Az MPU-6050 egy 3 tengelyes giroszkópból áll, amely képes érzékelni a forgási sebességet az x, y, z tengely mentén mikroelektromos mechanikai rendszer technológiával (MEMS). Amikor az érzékelőt bármely tengely mentén elforgatják, rezgés keletkezik a Coriolis-effektus hatására, amelyet a MEMS észlel. A 16 bites ADC-t a feszültség digitalizálására használják a mintavételhez. +/- 250, +/- 500, +/- 1000, +/- 2000 a kimenet teljes skálája. A szögsebességet minden tengely mentén mértük másodperc mértékegységben.

Hasznos link: …………….

Arduino tábla: …………….

MPU6050 IMU ……………

1. lépés: MPU-6050 modul

MPU-6050 modul
MPU-6050 modul

Az MPU-6050 modul 8 tűvel rendelkezik,

INT: Megszakítja a digitális kimeneti tűt.

AD0: I2C slave cím LSB pin. Ez a 0. bit az eszköz 7 bites slave címében. Ha csatlakozik a VCC -hez, akkor az logikai egyként olvasható, és a slave -cím megváltozik.

XCL: Kiegészítő soros óra csap. Ez a csap más I2C interfész-kompatibilis SCL érintkezők csatlakoztatására szolgál az MPU-6050-hez.

XDA: Segéd soros adat pin. Ez a csap más I2C interfész-kompatibilis SDA érintkezők csatlakoztatására szolgál az MPU-6050-hez.

SCL: Soros óra csap. Csatlakoztassa ezt a csapot a mikrokontroller SCL csapjához. SDA: Soros adat pin. Csatlakoztassa ezt a csapot a mikrokontroller SDA tűjéhez.

GND: Földelt csap. Csatlakoztassa ezt a csapot a földeléshez.

VCC: Tápegység tüske. Csatlakoztassa ezt a csapot +5V egyenáramú tápegységhez. Az MPU-6050 modul Slave címmel rendelkezik (ha AD0 = 0, azaz nincs csatlakoztatva Vcc-hez), Slave írási cím (SLA+W): 0xD0

Slave Olvasási cím (SLA+R): 0xD1

2. lépés: Számítások

Számítások
Számítások

Az MPU6050 modul giroszkóp és gyorsulásmérő érzékelőinek adatai 16 bites nyers adatokból állnak, 2-es komplement formában.

Az MPU6050 modul hőmérsékletérzékelő adatai 16 bites adatokból állnak (nem 2-es komplement formában).

Most tegyük fel, hogy kiválasztottuk,

  • - A gyorsulásmérő teljes skálatartománya +/- 2 g, érzékenységi skálafaktor 16, 384 LSB (Count)/g.
  • - A giroszkóp teljes skálatartománya +/- 250 °/s, 131 LSB (Count)/°/s érzékenységi skálafaktorral. azután,

Ahhoz, hogy nyers adatokat kapjunk az érzékelőről, először el kell végeznünk a 2 -es kiegészítést a gyorsulásmérő és a giroszkóp érzékelői adatain. Az érzékelő nyers adatainak megszerzése után kiszámíthatjuk a gyorsulást és a szögsebességet úgy, hogy elosztjuk az érzékelő nyers adatait az érzékenységi skála tényezőjével a következőképpen:

A gyorsulásmérő értékei g -ban (g erő)

  • Gyorsulás az X tengely mentén = (Gyorsulásmérő X tengelye nyers adatok/16384) g.
  • Gyorsulás az Y tengely mentén = (Gyorsulásmérő Y tengelye nyers adatok/16384) g.
  • Gyorsulás a Z tengely mentén = (Gyorsulásmérő Z tengelye nyers adatok/16384) g.

Giroszkóp értékek °/s -ban (fok/másodperc)

  • Szögsebesség az X tengely mentén = (Giroszkóp X tengely nyers adat/131) °/s.
  • Szögsebesség az Y tengely mentén = (giroszkóp Y tengely nyers adat/131) °/s.
  • Szögsebesség a Z tengely mentén = (Giroszkóp Z tengely nyers adat/131) °/s.

Hőmérséklet értéke °/c (Celsius fok)

Hőmérséklet C fokban (= (hőmérséklet -érzékelő adatai)/340 + 36,53) °/c.

Például, Tegyük fel, hogy 2’komplement után kapunk gyorsulásmérő X tengelyek nyers értékét = +15454

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

Több,

Tehát tudjuk, hogy +/- 2G és +/- 250deg/s érzékenységgel futunk, de hogyan felelnek meg értékeink ezeknek a gyorsulásoknak/szögeknek.

Ezek mind egyenes vonalú grafikonok, és ki lehet deríteni belőlük, hogy 1G esetén 16384, 1 °/sec esetén 131.07 értéket fogunk olvasni (bár a.07 figyelmen kívül marad a bináris miatt) ezeket az értékeket csak a egyenes grafikon: 2G 32767 -nél és -2G -32768 -nál és 250/-250 ugyanazon értékeken.

Tehát most már tudjuk az érzékenységi értékeinket (16384 és 131,07), csak le kell vonni az értékekből való eltolásokat, majd el kell térnünk az érzékenységtől.

Ezek jól fognak működni az X és Y értékeknél, de mivel a Z -t 1G -nál jegyeztük fel, és nem 0 -nál, az 1G -t (16384) mínuszba kell helyeznünk, mielőtt az érzékenységünkkel osztanánk.

3. lépés: MPU6050-Atmega328p kapcsolatok

MPU6050-Atmega328p csatlakozók
MPU6050-Atmega328p csatlakozók
MPU6050-Atmega328p csatlakozók
MPU6050-Atmega328p csatlakozók
MPU6050-Atmega328p csatlakozók
MPU6050-Atmega328p csatlakozók

Csatlakoztasson mindent a diagramon látható módon…

A csatlakozásokat a következőképpen adjuk meg:-

MPU6050 Arduino Nano

VCC 5v kimeneti csap

GND Földelőcsap

SDA A4 tű // soros adatok

SCL A5 érintkező // soros óra

Pitch and Roll számítás: Roll az x tengely körüli forgás, a pitch pedig az y tengely mentén történő forgás.

Az eredmény radiánban értendő. (konvertáljuk fokra 180 -szor szorozva és pi -vel osztva)

4. lépés: Kódok és magyarázatok

Kódok és magyarázatok
Kódok és magyarázatok

/*

Arduino és MPU6050 gyorsulásmérő és giroszkóp érzékelő bemutatója, Dejan, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C cím float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; úszótekercs, szurok, billegés; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Inicializálja a kommunikációt Wire.beginTransmission (MPU); // Kommunikáció indítása az MPU6050 segítségével // MPU = 0x68 Wire.write (0x6B); // Beszéljen a regiszterrel 6B Wire.write (0x00); // Visszaállítás - helyezzen 0 -t a 6B regiszterbe Wire.endTransmission (true); // az átvitel befejezése/* // Gyorsulásmérő érzékenységének beállítása - teljes skála tartomány (alapértelmezett +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Beszéljen az ACCEL_CONFIG regiszterrel (1C hexa) Wire.write (0x10); // Állítsa be a regiszter biteket 00010000 értékre (+/- 8g teljes skálatartomány) Wire.endTransmission (true); // Giroszkóp érzékenységének beállítása - teljes skála tartomány (alapértelmezett +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Beszéljen a GYRO_CONFIG regiszterrel (1B hexa) Wire.write (0x10); // Állítsa be a regiszter biteket 00010000 -ra (1000deg/s teljes skálán) Wire.endTransmission (true); késleltetés (20); */ // Hívja meg ezt a függvényt, ha meg kell kapnia a modul IMU hibaértékeit calc_IMU_error (); késleltetés (20); } void loop () {// === Acceleromter adatok olvasása === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Kezdje a 0x3B regiszterrel (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, igaz); // Összesen 6 regiszter olvasása, minden tengely értéke 2 regiszterben tárolva | Drót.olvasás ()) / 16384.0; // X tengely értéke AccY = (Huzal.olvasás () << 8 | Vezeték.olvasás ()) / 16384.0; // Y-tengely értéke AccZ = (Huzal.olvasás () << 8 | Huzal.olvasat ()) / 16384.0; // Z -tengely értéke // Roll és Pitch kiszámítása a gyorsulásmérő adataiból accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) További részletekért lásd a calc_IMU_error () egyéni függvényt accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-1,58) // === A giroszkóp adatainak olvasása === // previousTime = currentTime; // Az előző időt a tényleges olvasási idő előtt tárolja currentTime = millis (); // Aktuális idő tényleges olvasási idő elteltTime = (currentTime - previousTime) / 1000; // Oszd meg 1000 -el, hogy másodpercet kapj Wire.beginTransmission (MPU); Wire.write (0x43); // Giroszkóp első regisztrációs címe 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, igaz); // Összesen 4 regiszter olvasása, minden tengelyérték 2 regiszterben tárolódik GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // 250deg/ s tartománynál először el kell osztanunk a nyers értéket 131,0 -val, az adatlap szerint GyroY = (Wire.read () << 8 | Wire.read ())/ 131.0; GyroZ = (Huzal.olvasás () << 8 | Huzal.olvasat ()) / 131,0; // Javítsa ki a kimeneteket a számított hibaértékekkel GyroX = GyroX + 0,56; // GyroErrorX ~ (-0,56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0,8) // Jelenleg a nyers értékek másodpercben, fok/s-ban vannak megadva, ezért szignálokkal kell szorozni, hogy a szöget fokokban lássuk gyroAngleX = gyroAngleX + GyroX * eltelt idő; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * eltelt idő; yaw = yaw + GyroZ * eltelt idő; // Kiegészítő szűrő - gyorsulásmérő és giroszkóp szög értékeinek kombinálása roll = 0,96 * gyroAngleX + 0,04 * accAngleX; hangmagasság = 0,96 * gyroAngleY + 0,04 * accAngleY; // Az értékek nyomtatása a soros monitoron Serial.print (roll); Soros.nyomtatás ("/"); Soros.nyomat (hangmagasság); Soros.nyomtatás ("/"); Serial.println (yaw); } void calc_IMU_error () {// Ezt a funkciót a beállítási szakaszban hívhatjuk a gyorsulásmérő és a giroszkóp adathibájának kiszámításához. Innen kapjuk a soros monitoron nyomtatott fenti egyenletekben használt hibaértékeket. // Vegye figyelembe, hogy az IMU -t laposra kell helyezni a megfelelő értékek elérése érdekében, hogy aztán a helyes értékeket kaphassuk // Olvassa el a gyorsulásmérő értékeit 200 -szor, miközben (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, igaz); AccX = (Huzal.olvasás () << 8 | Vezeték.olvasás ()) / 16384.0; AccY = (Huzal.olvasás () << 8 | Vezetékolvasás ()) / 16384.0; AccZ = (Huzal.olvasás () << 8 | Huzal.olvasás ()) / 16384.0; // Összes összesített érték összegezése 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 ++; } // Ossza el az összeget 200 -mal, hogy megkapja a hibaértéket AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // 200 -szor olvassa el a giroszkóp értékeket, miközben (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, igaz); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Drót.olvasás () << 8 | Wire.read (); GyroZ = Drót.olvasás () << 8 | Wire.read (); // Összes összesített érték GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Ossza el az összeget 200 -mal, hogy megkapja a hibaértéket GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Nyomtassa ki a hibaértékeket 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); } ------------------------------------------------- ---------------------------------------------- Eredmények:-X = Y = Z = --------------------------------------------- ----------------------------------------------- Fontos jegyzet: -----------------

A hurok szakaszban a gyorsulásmérő adatainak kiolvasásával kezdjük. Az egyes tengelyekre vonatkozó adatokat 2 bájtban vagy regiszterben tároljuk, és ezeknek a regisztereknek a címét láthatjuk az érzékelő adatlapjáról.

Annak érdekében, hogy mindet elolvashassuk, az első regiszterrel kezdjük, és a requiestFrom () függvény használatával kérjük, hogy olvassuk el mind a 6 regisztert az X, Y és Z tengelyekhez. Ezután kiolvassuk az egyes regiszterek adatait, és mivel a kimenetek kettesével kiegészülnek, megfelelően kombináljuk őket, hogy megkapjuk a helyes értékeket.

5. lépés: A dőlésszög megértése

Gyorsulásmérő

A Föld gravitációja állandó gyorsulás, ahol az erő mindig lefelé mutat a Föld középpontjához.

Ha a gyorsulásmérő párhuzamos a gravitációval, akkor a mért gyorsulás 1G lesz, ha a gyorsulásmérő merőleges a gravitációra, akkor 0G lesz.

A dőlésszög a mért gyorsulásból kiszámítható az alábbi egyenlettel:

θ = sin-1 (mért gyorsulás / gravitációs gyorsulás)

A GyroGyro (más néven sebességérzékelő) a szögsebesség (ω) mérésére szolgál.

Annak érdekében, hogy megkapjuk a robot dőlésszögét, integrálnunk kell a giroszkópból származó adatokat az alábbi egyenlet szerint:

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

A giroszkóp és a gyorsulásmérő érzékelőjének fúziója Miután tanulmányoztuk a giroszkóp és a gyorsulásmérő tulajdonságait, tudjuk, hogy saját erősségeik és gyengeségeik vannak. A gyorsulásmérő adataiból kiszámított dőlésszög lassú, míg a giroszkópból származó integrált dőlésszög eltolódásnak van kitéve egy bizonyos idő alatt. Más szóval azt mondhatjuk, hogy a gyorsulásmérő adatai hosszú távon hasznosak, míg a giroszkóp adatok rövid távon hasznosak.

Link a jobb megértéshez: Kattintson ide

Ajánlott: