Tartalomjegyzék:
- 1. lépés: MPU-6050 modul
- 2. lépés: Számítások
- 3. lépés: MPU6050-Atmega328p kapcsolatok
- 4. lépés: Kódok és magyarázatok
- 5. lépés: A dőlésszög megértése
Videó: MPU 6050 giroszkóp, gyorsulásmérő kommunikáció az Arduino -val (Atmega328p): 5 lépés
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:39
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
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
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
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
/*
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:
Xbox 360 vezérlő gyorsulásmérő/giroszkóp Kormányzási mód: 7 lépés
Xbox 360 vezérlő gyorsulásmérő/giroszkóp Kormányzási mód: Az Assetto Corsát játszottam az Xbox 360 vezérlőmmel. Sajnos az analóg pálcával való kormányzás nagyon nehézkes, és nincs helyem a kerék beállításához. Próbáltam elgondolkodni azon, hogyan lehetne jobb kormányművet cipelni a
MPU6050-Gyorsulásmérő+giroszkóp érzékelő alapjai: 3 lépés
MPU6050-gyorsulásmérő+giroszkóp érzékelő alapjai: Az MPU6050 nagyon hasznos érzékelő. Az mpu 6050 egy IMU: Az inerciális mérőegység (IMU) egy elektronikus eszköz, amely méri és jelenti a test sajátos erejét, szögsebességét és néha az irányt a test kombinációjával
SmartPhone Game Simulator- Játsszon Windows játékokkal az IMU gesztusvezérlés, gyorsulásmérő, giroszkóp, magnetométer segítségével: 5 lépés
SmartPhone Game Simulator- Játsszon Windows játékokat gesztusvezérléssel IMU, gyorsulásmérő, giroszkóp, magnetométer: Támogassa ezt a projektet: https://www.paypal.me/vslcreations, adományozva nyílt forráskódoknak és & további fejlődés támogatása
Szögmérés giroszkóp, gyorsulásmérő és Arduino segítségével: 5 lépés
Szögmérés giroszkóp, gyorsulásmérő és Arduino segítségével: A készülék durva prototípusa annak, hogy végül mi lesz az önmérlegű robot, ez a lyuk második része (olvassa el a gyorsulásmérőt, és vezérelje a motort az egyensúlyhoz). Az első rész, amelyben csak a giroszkóp található, itt található. Ezen a ponton
Gyorsulásmérő és giroszkóp bemutató: 3 lépés
Gyorsulásmérő és giroszkóp bemutató: Bevezetés Ez az útmutató azoknak szól, akik érdeklődnek a gyorsulásmérők és giroszkópok, valamint a kombinált IMU -eszközök (inerciális mérőegység) használata elektronikai projektjeikben. Kitérünk: Mit mér a gyorsulásmérő?