- Kas ir akselerometrs un žiroskopiskais sensors?
- MPU6050 akselerometra un žiroskopiskā sensora modulis
- Nepieciešamās sastāvdaļas
- Ķēdes shēma
- Programmēšanas skaidrojums
MPU6050 ir IC 3-ass akselerometru un 3-ass žiroskopa apvienotas vienā vienībā. Tajā ir arī temperatūras sensors un DCM, lai veiktu sarežģītu uzdevumu. MPU6050 parasti izmanto, veidojot Drone un citus tālvadības robotus, piemēram, pašbalansējošu robotu. Šajā projektā mēs izveidosim digitālo transportieri, izmantojot MPU6050 un Arduino. Šeit leņķa parādīšanai uz transportiera attēla tiek izmantots servomotors. Servomotora vārpsta ir piestiprināta ar adatu, kas rotē transportiera attēlu, lai norādītu leņķi, kas tiek parādīts arī 16xLCD displejā. Pirms iedziļināties sīkāk, uzzināsim par žiroskopa sensoru.
Kas ir akselerometrs un žiroskopiskais sensors?
Paātrinājuma mērīšanai izmanto akselerometru. Tas faktiski uztver gan statisko, gan dinamisko paātrinājumu. Piemēram, mobilie tālruņi izmanto akselerometra sensoru, lai saprastu, ka mobilais tālrunis ir ainavas vai portreta režīmā. Iepriekš mēs izmantojām akselerometru ar Arduino, lai izveidotu daudzus projektus, piemēram:
Žiroskopu izmanto leņķiskā ātruma mērīšanai, kas izmanto zemes gravitāciju, lai noteiktu kustībā esošā objekta orientāciju. Leņķiskais ātrums ir rotējoša ķermeņa leņķa stāvokļa maiņas ātrums.
Piemēram, mūsdienu mobilie tālruņi izmanto žiroskopiskos sensorus, lai spēlētu mobilās spēles atbilstoši mobilā tālruņa orientācijai. Arī VR austiņas izmanto žiroskopa sensoru, lai skatījumi būtu 360 orientācijā
Tātad, lai gan akselerometrs var izmērīt lineāro paātrinājumu, žiroskops var palīdzēt atrast rotācijas paātrinājumu. Izmantojot abus sensorus kā atsevišķus moduļus, kļūst grūti atrast orientāciju, pozīciju un ātrumu. Bet, apvienojot abus sensorus, tas darbojas kā inerciāla mērīšanas vienība (IMU). Tātad MPU6050 modulī akselerometrs un žiroskops atrodas vienā PCB, lai atrastu orientāciju, pozīciju un ātrumu.
Pielietojums:
- Izmanto Drones virziena kontrolei
- Pašbalansējoši roboti
- Robotu roku vadība
- Slīpuma sensors
- Izmanto mobilajos tālruņos, videospēļu konsolēs
- Humanoīdie roboti
- Izmanto lidmašīnās, automobiļos utt.
MPU6050 akselerometra un žiroskopiskā sensora modulis
MPU6050 ir mikroelektromehāniskās sistēmas (MEMS), kas sastāv no 3 asu akselerometra un 3 asu žiroskopa tā iekšpusē. Tam ir arī temperatūras sensors.
Tas var izmērīt:
- Paātrinājums
- Ātrums
- Orientēšanās
- Pārvietošana
- Temperatūra
Šī moduļa iekšpusē ir arī (DMP) digitālais kustības procesors, kas ir pietiekami jaudīgs, lai veiktu sarežģītus aprēķinus un tādējādi atbrīvotu darbu mikrokontrollerim.
Modulim ir arī divas papildu tapas, kuras var izmantot, lai savienotu ārējos IIC moduļus, piemēram, magnetometru. Tā kā moduļa IIC adrese ir konfigurējama, vairāk nekā vienu MPU6050 sensoru var savienot ar mikrokontrolleru, izmantojot AD0 kontaktu.
Funkcijas un specifikācijas:
- Barošanas avots: 3-5V
- Komunikācija: I2C protokols
- Iebūvētais 16 bitu ADC nodrošina augstu precizitāti
- Iebūvētais DMP nodrošina lielu skaitļošanas jaudu
- Var izmantot saskarnei ar citām IIC ierīcēm, piemēram, magnetometru
- Konfigurējama IIC adrese
- Iebūvēts temperatūras sensors
MPU6050 pinout:
PIN kods | Piespraudes nosaukums | Izmantot |
1 | Vcc | Nodrošina moduļa strāvu, var būt no + 3V līdz + 5V. Parasti tiek izmantots + 5V |
2 | Zeme | Savienots ar sistēmas zemējumu |
3 | Sērijveida pulkstenis (SCL) | Izmanto pulksteņa impulsa nodrošināšanai I2C sakariem |
4 | Sērijas dati (SDA) | Izmanto datu pārsūtīšanai, izmantojot I2C sakarus |
5 | Sērijas papilddati (XDA) | Var izmantot citu I2C moduļu saskarnei ar MPU6050. Tas nav obligāts |
6 | Sērijas papildpulkstenis (XCL) | Var izmantot citu I2C moduļu saskarnei ar MPU6050. Tas nav obligāts |
7 | AD0 | Ja vienā MCU tiek izmantots vairāk nekā viens MPU6050, šo tapu var izmantot, lai mainītu adresi |
8 | Pārtraukt (INT) | Pārtrauciet piespraudi, lai norādītu, ka dati ir pieejami MCU lasīšanai. |
Iepriekš mēs ar Arduino izmantojām MPU6050, lai izveidotu pašbalansējošu robotu un slīpuma mērītāju.
Nepieciešamās sastāvdaļas
- Arduino UNO
- MPU6050 žiroskopa modulis
- 16x2 LCD displejs
- Potenciometrs 10k
- SG90-servomotors
- Transportiera attēls
Ķēdes shēma
Šī DIY Arduino transportiera shēma ir dota zemāk:
Ķēdes savienojumi starp Arduino UNO un MPU6050:
MPU6050 |
Arduino UNO |
VCC |
+ 5V |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Ķēdes savienojumi starp Arduino UNO un servomotoru:
Servo motors |
Arduino UNO |
Sarkans (VCC) |
+ 5V |
APELSINS (PWM) |
9 |
BROWN (GND) |
GND |
Ķēdes savienojumi starp Arduino UNO un 16x2 LCD:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Uz potenciometra centra PIN LCD kontrasta kontrolei |
RS |
2 |
RW |
GND |
E |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
A |
+ 5V |
K |
GND |
Programmēšanas skaidrojums
Kā parasti, šīs apmācības beigās ir sniegta visa programma ar demonstrācijas video.
Šeit servomotors ir savienots ar Arduino, un tā vārpsta tiek projicēta uz transportiera attēla, kas norāda slīpā MPU6050 leņķi. Šīs apmācības programmēšana ir vienkārša. Apskatīsim to detalizēti.
Vispirms iekļaujiet visas nepieciešamās bibliotēkas - Servo Motor bibliotēku Servo lietošanai, LCD bibliotēku LCD lietošanai un Wire bibliotēku I2C sakaru izmantošanai.
MPU6050 izmanto I2C komunikāciju, tāpēc tam jābūt savienotam tikai ar Arduino I2C tapām. Tātad, Wire.h bibliotēka tiek izmantota, lai izveidotu saziņu starp Arduino UNO un MPU6050. Iepriekš mēs savienojām MPU6050 ar Arduino un parādījām x, y, z koordinātu vērtības uz 16x2 LCD.
# iekļaut
Pēc tam definējiet LCD displeja tapas RS, E, D4, D5, D6, D7, kas ir savienotas ar Arduino UNO.
LiquidCrystal lcd (2,3,4,5,6,7);
Pēc tam tiek definēta MPU6050 I2C adrese.
const int MPU_addr = 0x68;
Pēc tam inicializējiet myservo objektu Servo klases un trīs mainīgo izmantošanai X, Y un Z ass vērtību glabāšanai.
Servo myservo; int16_t ass_X, ass_Y, ass_Z;
Nākamā minimālā un maksimālā vērtība ir iestatīta kā 265 un 402 leņķa mērīšanai no 0 līdz 360.
int minVal = 265; int maxVal = 402;
void setup ():
Jo zaudējušu iestatīšanas funkcija pirmais I2C komunikācija ir uzsākta un pārsūtīšana ir sākusies ar MPU6050 ar adresi 0x68.
Wire.begin (); Wire.beginTransmission (MPU_addr);
Novietojiet MPU6050 miega režīmā, ierakstot 0x6B, un pēc tam pamodiniet to, ierakstot 0
Wire.write (0x6B); Wire.write (0);
Pēc MPU6050 aktivizēšanas pārtrauciet pārraidi
Wire.endTransmission (patiess);
Šeit Servo motora PWM tapa ir savienota ar Arduino UNO 9. kontaktu.
myservo.attach (9);
Tiklīdz mēs ieslēdzam ķēdi, LCD parāda sveiciena ziņojumu un pēc 3 sekundēm to notīra
lcd.begin (16,2); // LCD iestata 16X2 režīmā lcd.print ("CIRCUIT DIGEST"); kavēšanās (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Arduino"); lcd.setCursor (0,1); lcd.print ("MPU6050"); kavēšanās (3000); lcd.clear ();
void loop ():
Atkal I2C sakari tiek sākti ar MPU6050.
Wire.beginTransmission (MPU_addr);
Tad sāciet ar reģistru 0x3B (ACCEL_XOUT_H)
Wire.write (0x3B);
Tagad process tiek restartēts ar iestatīto beigu pārraidi kā nepatiesu, bet savienojums ir aktīvs.
Wire.endTransmission (nepatiesa);
Pēc tam tagad pieprasiet datus no 14 reģistriem.
Wire.requestFrom (MPU_addr, 14, taisnība);
Tagad tiek ievērotas asu reģistra vērtības (x, y, z) un saglabātas mainīgajos lielumos ass_X, ass_Y, ass_Z.
ass_X = Wire.read () << 8-Wire.read (); ass_Y = Wire.read () << 8-Wire.read (); ass_Z = Wire.read () << 8-Wire.read ();
Tad kartējiet šīs vērtības no 265 līdz 402 kā -90 līdz 90. Tas tiek darīts visām trim asīm.
int xAng = karte (ass_X, minVal, maxVal, -90,90); int yAng = karte (ass_Y, minVal, maxVal, -90,90); int zAng = karte (ass_Z, minVal, maxVal, -90,90);
Formula x vērtības aprēķināšanai grādos (0 līdz 360) ir sniegta zemāk. Šeit mēs konvertējam tikai x, jo servomotora rotācijas pamatā ir x vērtības kustība.
x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI);
X leņķa vērtība no 0 līdz 360 grādiem tiek pārveidota par 0 līdz 180.
int pos = karte (x, 0,180,0,180);
Pēc tam uzrakstiet leņķa vērtību, lai pagrieztu servo uz transportiera attēla, un izdrukājiet šīs vērtības 16x2 LCD displejā.
myservo.write (pos); lcd.setCursor (0,0); lcd.print ("Leņķis"); lcd.setCursor (0,1); lcd.print (x); kavēšanās (500); lcd.clear ();
Tātad šādi leņķa mērīšanai var izmantot MPU6050 ar Arduino. Pilns šī projekta kods un video ir norādīts zemāk.