- Kas yra akselerometras ir giroskopinis jutiklis?
- MPU6050 akselerometras ir giroskopinis jutiklio modulis
- Būtini komponentai
- Grandinės schema
- Programavimo paaiškinimas
MPU6050 yra IC 3-ašis pagreičio ir 3-ašis giroskopo kartu į vieną vienetą. Jame taip pat yra temperatūros jutiklis ir DCM, kad būtų galima atlikti sudėtingą užduotį. MPU6050 paprastai naudojamas kuriant „Drone“ ir kitus nuotolinius robotus, pvz., Savaime balansuojančius robotus. Šiame projekte sukursime skaitmeninį matuoklį naudodami MPU6050 ir „Arduino“. Čia servo variklis naudojamas rodyti kampą ant matuoklio vaizdo. Servovariklio velenas pritvirtintas adata, kuri pasisuks ant transporterio atvaizdo ir nurodys kampą, kuris taip pat rodomas 16xLCD ekrane. Prieš pradėdami detaliau, sužinokime apie giroskopo jutiklį.
Kas yra akselerometras ir giroskopinis jutiklis?
Pagreičiui matuoti naudojamas akselerometras. Iš tikrųjų jis pajunta ir statinį, ir dinaminį pagreitį. Pvz., Mobilieji telefonai naudoja akselerometro jutiklį, kad suprastų, jog mobilusis yra horizontalaus arba portreto režimu. Anksčiau mes naudojome akselerometrą su „Arduino“ kurdami daugybę projektų, tokių kaip:
Giroskopas naudojamas matuoti kampinį greitį, kuris naudoja žemės gravitaciją judančio objekto orientacijai nustatyti. Kampinis greitis yra besisukančio kūno kampinės padėties kitimo greitis.
Pavyzdžiui, šiandienos mobilieji telefonai naudoja giroskopinius jutiklius, kad žaisdami mobiliuosius žaidimus pagal mobiliojo telefono orientaciją. Be to, VR laisvų rankų įranga naudoja giroskopo jutiklį, kad vaizdai būtų 360 laipsnių
Taigi, nors akselerometras gali išmatuoti tiesinį pagreitį, giroskopas gali padėti rasti sukimosi pagreitį. Naudojant abu jutiklius kaip atskirus modulius, sunku nustatyti orientaciją, padėtį ir greitį. Bet derinant du jutiklius jis veikia kaip inercinis matavimo vienetas (IMU). Taigi MPU6050 modulyje akselerometras ir giroskopas yra vienoje PCB, kad būtų galima nustatyti orientaciją, padėtį ir greitį.
Programos:
- Naudojamas dronuose krypties valdymui
- Savęs balansavimo robotai
- Robotas rankų valdymas
- Pakreipimo jutiklis
- Naudojamas mobiliuosiuose telefonuose, vaizdo žaidimų konsolėse
- Humanoidiniai robotai
- Naudojamas orlaiviuose, automobiliuose ir kt.
MPU6050 akselerometras ir giroskopinis jutiklio modulis
MPU6050 yra mikroelektromechaninės sistemos (MEMS), kurią sudaro 3 ašių akselerometras ir 3 ašių žiroskopas. Jame taip pat yra temperatūros jutiklis.
Tai gali išmatuoti:
- Pagreitis
- Greitis
- Orientacija
- Poslinkis
- Temperatūra
Šiame modulyje taip pat yra (DMP) skaitmeninis judesio procesorius, kuris yra pakankamai galingas atlikti sudėtingus skaičiavimus ir taip atlaisvinti darbą mikrovaldikliui.
Modulis taip pat turi du pagalbinius kaiščius, kurie gali būti naudojami sąsajai su išoriniais IIC moduliais, pavyzdžiui, su magnetometru. Kadangi IIC modulio adresas yra konfigūruojamas, daugiau nei vieną MPU6050 jutiklį galima susieti su mikrovaldikliu naudojant AD0 kaištį.
Savybės ir specifikacijos:
- Maitinimas: 3-5 V
- Ryšys: I2C protokolas
- Integruotas 16 bitų ADC užtikrina aukštą tikslumą
- Integruotas DMP suteikia didelę skaičiavimo galią
- Galima naudoti sąsajai su kitais IIC prietaisais, tokiais kaip magnetometras
- Konfigūruojamas IIC adresas
- Įmontuotas temperatūros jutiklis
MPU6050 kištukas:
PIN kodas | PIN vardas | Naudokite |
1 | Vcc | Suteikia modulio maitinimą, gali būti nuo + 3 V iki + 5 V. Paprastai naudojamas + 5V |
2 | Žemė | Prijungtas prie sistemos žemės |
3 | Serijinis laikrodis (SCL) | Naudojamas I2C ryšio laikrodžio impulsui teikti |
4 | Serijos duomenys (SDA) | Naudojamas duomenims perduoti per I2C ryšį |
5 | Pagalbiniai serijiniai duomenys (XDA) | Galima naudoti sąsajai su kitais I2C moduliais su MPU6050. Tai neprivaloma |
6 | Papildomas serijinis laikrodis (XCL) | Galima naudoti sąsajai su kitais I2C moduliais su MPU6050. Tai neprivaloma |
7 | AD0 | Jei vienas MCU naudojamas daugiau nei vienas MPU6050, šį kaištį galima naudoti norint pakeisti adresą |
8 | Nutraukti (INT) | Pertraukimo kaištis, nurodantis, kad yra duomenų, kuriuos MCU gali skaityti. |
Anksčiau „ MPU6050“ su „Arduino“ naudojome kurdami savaiminio balansavimo robotą ir nuolydžio matuoklį.
Būtini komponentai
- „Arduino UNO“
- MPU6050 žiroskopo modulis
- 16x2 LCD ekranas
- Potenciometras 10k
- SG90-servo variklis
- Skydelio vaizdas
Grandinės schema
Šio „ pasidaryk pats“ „Arduino“ matuoklio schema pateikta žemiau:
Grandinės jungtys tarp „Arduino UNO“ ir „MPU6050“:
MPU6050 |
„Arduino UNO“ |
VCC |
+ 5 V |
BND |
BND |
SCL |
A5 |
SDA |
A4 |
Grandinės jungtys tarp „Arduino UNO“ ir servovariklio:
Servo variklis |
„Arduino UNO“ |
RAUDONA (VCC) |
+ 5 V |
APELSINAS (PWM) |
9 |
RUDA (GND) |
BND |
Grandinės jungtys tarp „Arduino UNO“ ir 16x2 LCD:
LCD ekranas |
„Arduino Nano“ |
VSS |
BND |
VDD |
+ 5 V |
V0 |
Į potenciometro centro PIN kodą Skystųjų kristalų ekrano kontrasto valdymui |
RS |
2 |
RW |
BND |
E |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
A |
+ 5 V |
K. |
BND |
Programavimo paaiškinimas
Kaip įprasta, šios programos pabaigoje pateikiama visa programa su demonstraciniu vaizdo įrašu.
Čia servovariklis yra sujungtas su „Arduino“, o jo ašis projektuojama į transporterio vaizdą, nurodantį pasvirusio MPU6050 kampą. Šios pamokos programavimas yra paprastas. Pažiūrėkime tai išsamiai.
Pirmiausia įtraukite visas reikalingas bibliotekas - „Servo Motor“ biblioteką, skirtą naudoti „Servo“, LCD biblioteką, skirtą naudoti „LCD“, ir „Wire“ biblioteką, kad būtų naudojamas „I2C“ ryšys.
MPU6050 naudoja I2C ryšį, todėl jis turi būti prijungtas tik prie „Arduino“ I2C kaiščių. Taigi „ Wire.h“ biblioteka naudojama užmegzti ryšį tarp „Arduino UNO“ ir „MPU6050“. Anksčiau mes sąsajojome MPU6050 su „Arduino“ ir 16x2 LCD ekrane rodėme x, y, z koordinačių reikšmes.
# įtraukti
Tada nustatykite LCD ekrano kaiščius RS, E, D4, D5, D6, D7, kurie yra prijungti prie „Arduino UNO“.
„LiquidCrystal lcd“ (2,3,4,5,6,7);
Toliau apibrėžiamas MPU6050 I2C adresas.
const int MPU_addr = 0x68;
Tada inicializuokite „ myservo“ objektą, kad būtų galima naudoti „Servo“ klasę ir tris kintamuosius X, Y ir Z ašių reikšmėms saugoti.
Servo myservo; int16_t ašis_X, ašis_Y, ašis_Z;
Sekanti mažiausia ir didžiausia vertė yra 265 ir 402 matuojant kampą nuo 0 iki 360.
int minVal = 265; int maxVal = 402;
negaliojanti sąranka ():
Esant tuščios sąrankos funkcijai, pirmiausia pradedamas I2C ryšys ir pradėta perduoti naudojant MPU6050, kurio adresas yra 0x68.
Viela.prasideda (); „Wire.beginTransmission“ (MPU_addr);
Įjunkite MPU6050 miego režimą rašydami 0x6B, tada pažadinkite jį rašydami 0
Wire.write (0x6B); Wire.write (0);
Suaktyvinę MPU6050, nutraukite perdavimą
„Wire.endTransmission“ (tiesa);
Čia servovariklio PWM kaištis sujungtas su „Arduino UNO 9“ kaiščiu.
myservo.attach (9);
Kai tik įjungsime grandinę, skystųjų kristalų ekranas rodo pasveikinimo pranešimą ir po 3 sekundžių jį išvalo
lcd.prade (16,2); // Nustato LCD ekraną 16X2 režimu lcd.print („CIRCUIT DIGEST“); vėlavimas (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print („Arduino“); lcd.setCursor (0,1); lcd.print ("MPU6050"); vėlavimas (3000); lcd.clear ();
negaliojanti kilpa ():
Vėlgi, I2C ryšys pradedamas su MPU6050.
„Wire.beginTransmission“ (MPU_addr);
Tada pradėkite nuo registro 0x3B (ACCEL_XOUT_H)
Wire.write (0x3B);
Dabar procesas iš naujo pradedamas nustatytu galiniu perdavimu kaip klaidinga, bet ryšys aktyvus.
„Wire.endTransmission“ (klaidinga);
Dabar paprašykite duomenų iš 14 registrų.
„Wire.requestFrom“ (MPU_addr, 14, tiesa);
Dabar laikomasi ašių registro reikšmių (x, y, z) yra gaunamos ir saugomos kintamuosiuose ašis_X, ašis_Y, ašis_Z.
axis_X = Wire.read () << 8-Wire.read (); axis_Y = Wire.read () << 8-Wire.read (); axis_Z = Wire.read () << 8-Wire.read ();
Tada priskirkite tas vertes nuo 265 iki 402 kaip -90 iki 90. Tai daroma visoms trims ašims.
int xAng = žemėlapis (ašis_X, minVal, maxVal, -90,90); int yAng = žemėlapis (ašis_Y, minVal, maxVal, -90,90); int zAng = žemėlapis (ašis_Z, minVal, maxVal, -90,90);
Formulė, skirta apskaičiuoti x vertę laipsniais (nuo 0 iki 360), pateikiama žemiau. Čia mes konvertuojame tik x, nes servo variklio sukimasis pagrįstas x vertės judėjimu.
x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI);
X kampo vertė nuo 0 iki 360 laipsnių konvertuojama į 0–180.
int pos = žemėlapis (x, 0,180,0,180);
Tada užrašykite kampo vertę, kad pasuktumėte servo matuoklio vaizdą, ir atspausdinkite tas reikšmes 16x2 LCD ekrane.
myservo.write (pos); lcd.setCursor (0,0); lcd.print ("Kampas"); lcd.setCursor (0,1); lcd.print (x); vėlavimas (500); lcd.clear ();
Taigi tokiu būdu galima išmatuoti kampą naudojant „MPU6050“ su „Arduino“. Pilnas šio projekto kodas ir vaizdo įrašas pateikiami žemiau.