- Hva er en akselerometer og gyroskopisk sensor?
- MPU6050 akselerometer og gyroskopisk sensormodul
- Komponenter kreves
- Kretsdiagram
- Programmering Forklaring
Den MPU6050 er en IC tre-akset akselerometer og et tre-akset gyroskop kombinert i en enhet. Det huser også en temperatursensor og en DCM for å utføre en kompleks oppgave. MPU6050 brukes ofte til å bygge Drone og andre eksterne roboter som en selvbalanserende robot. I dette prosjektet vil vi bygge en digital vinkelmåler ved hjelp av MPU6050 og Arduino. Her brukes en servomotor for å vise vinkelen på et vinkelmålerbilde. Servomotorakselen er festet med en nål som vil rotere på vinkelmålerbildet for å indikere vinkelen som også vises på en 16xLCD-skjerm. Før vi går i detaljer, la oss lære om gyroskopsensor.
Hva er en akselerometer og gyroskopisk sensor?
Et akselerometer brukes til å måle akselerasjonen. Den registrerer faktisk både den statiske og dynamiske akselerasjonen. For eksempel bruker mobiltelefoner akselerometersensor for å føle at mobilen er i liggende eller stående modus. Vi brukte tidligere Accelerometer med Arduino til å bygge mange prosjekter som:
Et gyroskop brukes til å måle vinkelhastigheten som bruker jordens tyngdekraft til å bestemme orienteringen til objektet i bevegelse. Vinkelhastighet er hastigheten på endring av vinkelposisjonen til et roterende legeme.
For eksempel bruker dagens mobiltelefoner gyroskopiske sensorer til å spille mobilspill i henhold til retningen til mobiltelefonen. VR-hodesettet bruker også gyroskop-sensor for å ha visninger i 360-orientering
Så mens akselerometer kan måle lineær akselerasjon, kan gyroskop bidra til å finne rotasjonsakselerasjonen. Når begge sensorene brukes som separate moduler, blir det vanskelig å finne orientering, posisjon og hastighet. Men ved å kombinere de to sensorene fungerer det som en treghetsmåleenhet (IMU). Så i MPU6050-modulen er akselerometer og gyroskop tilstede på en enkelt PCB for å finne orientering, posisjon og hastighet.
Applikasjoner:
- Brukes i Drones for retningskontroll
- Selvbalanserende roboter
- Robotarmskontroll
- Vippesensor
- Brukes i mobiltelefoner, videospillkonsoller
- Humanoid-roboter
- Brukes i fly, biler etc.
MPU6050 akselerometer og gyroskopisk sensormodul
MPU6050 er et mikro-elektromekanisk system (MEMS) som består av et 3-akset akselerometer og 3-akset gyroskop inne i det. Den har også temperatursensor.
Det kan måle:
- Akselerasjon
- Hastighet
- Orientering
- Forskyvning
- Temperatur
Denne modulen har også en (DMP) digital bevegelsesprosessor inne i den som er kraftig nok til å utføre komplekse beregninger og dermed frigjøre arbeidet for Microcontroller.
Modulen har også to hjelpestifter som kan brukes til å grense eksterne IIC-moduler som et magnetometer. Siden IIC-adressen til modulen er konfigurerbar, kan mer enn én MPU6050-sensor kobles til en mikrokontroller ved hjelp av AD0-pinnen.
Funksjoner og spesifikasjoner:
- Strømforsyning: 3-5V
- Kommunikasjon: I2C-protokoll
- Innebygd 16-bit ADC gir høy nøyaktighet
- Innebygd DMP gir høy beregningskraft
- Kan brukes til å grensesnitt med andre IIC-enheter som magnetometer
- Konfigurerbar IIC-adresse
- Innebygd temperatursensor
Pinout av MPU6050:
PIN-kode | Pin-navn | Bruk |
1 | Vcc | Gir strøm til modulen, kan være + 3V til + 5V. Vanligvis brukes + 5V |
2 | Bakke | Koblet til bakken på systemet |
3 | Seriell klokke (SCL) | Brukes til å levere klokkepuls for I2C-kommunikasjon |
4 | Seriell data (SDA) | Brukes til å overføre data gjennom I2C-kommunikasjon |
5 | Hjelpeseriedata (XDA) | Kan brukes til å koble andre I2C-moduler til MPU6050. Det er valgfritt |
6 | Auxiliary Serial Clock (XCL) | Kan brukes til å koble andre I2C-moduler til MPU6050. Det er valgfritt |
7 | AD0 | Hvis mer enn én MPU6050 brukes en enkelt MCU, kan denne pinnen brukes til å variere adressen |
8 | Interrupt (INT) | Avbryt pin for å indikere at data er tilgjengelig for MCU å lese. |
Vi brukte tidligere MPU6050 med Arduino til å bygge Self Balancing Robot og Inclinometer.
Komponenter kreves
- Arduino UNO
- MPU6050 gyroskopmodul
- 16x2 LCD-skjerm
- Potensiometer 10k
- SG90-Servomotor
- Vinkelmålerbilde
Kretsdiagram
Kretsskjema for denne DIY Arduino Protractor er gitt nedenfor:
Kretsforbindelser mellom Arduino UNO og MPU6050:
MPU6050 |
Arduino UNO |
VCC |
+ 5V |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Kretsforbindelser mellom Arduino UNO og servomotor:
Servo motor |
Arduino UNO |
RØD (VCC) |
+ 5V |
ORANGE (PWM) |
9 |
BRUN (GND) |
GND |
Kretsforbindelser mellom Arduino UNO og 16x2 LCD:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Til Potentiometer Center PIN For å kontrollere kontrasten på LCD-skjermen |
RS |
2 |
RW |
GND |
E |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
EN |
+ 5V |
K |
GND |
Programmering Forklaring
Som vanlig blir hele programmet med en demonstrasjonsvideo gitt på slutten av denne opplæringen.
Her er servomotor koblet til Arduino, og skaftet projiseres på et vinkelmålerbilde som indikerer vinkelen til den skråstilte MPU6050. Programmering for denne opplæringen er enkel. La oss se det i detalj.
Først inkluderer du alle nødvendige biblioteker - Servo Motor-biblioteket for bruk av Servo, LCD-bibliotek for bruk av LCD og Wire-bibliotek for bruk av I2C-kommunikasjon.
MPU6050 bruker I2C-kommunikasjon, og den må derfor bare kobles til I2C-pinnene på Arduino. Så, Wire.h- biblioteket brukes til å etablere kommunikasjon mellom Arduino UNO og MPU6050. Vi har tidligere grensesnitt MPU6050 med Arduino og viste koordinatverdiene x, y, z på 16x2 LCD.
#inkludere
Neste definere LCD-skjermpinner RS, E, D4, D5, D6, D7 som er koblet til Arduino UNO.
LiquidCrystal lcd (2,3,4,5,6,7);
Deretter defineres I2C-adressen til MPU6050.
const int MPU_addr = 0x68;
Initialiser deretter myservo- objektet for bruk av Servo-klasse og tre variabler for å lagre X-, Y- og Z- akseverdier .
Servo myservo; int16_t akse_X, akse_Y, akse_Z;
Neste minimums- og maksimumsverdi er satt til 265 og 402 for målevinkel fra 0 til 360.
int minVal = 265; int maxVal = 402;
ugyldig oppsett ():
I ugyldig oppsettfunksjon startes først I2C-kommunikasjon og overføring har startet med MPU6050 med adresse 0x68.
Wire.begin (); Wire.beginTransmission (MPU_addr);
Sett MPU6050 i hvilemodus ved å skrive 0x6B og våkne den ved å skrive 0
Wire.write (0x6B); Wire.write (0);
Etter at MPU6050 er aktiv, avslutter du overføringen
Wire.endTransmission (true);
Her er PWM-pinnen til servomotoren koblet til Arduino UNO-pinne 9.
myservo.attach (9);
Så snart vi slår på kretsen, viser LCD-skjermen en velkomstmelding og sletter den etter 3 sekunder
lcd.begin (16,2); // Setter LCD i 16X2-modus lcd.print ("CIRCUIT DIGEST"); forsinkelse (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Arduino"); lcd.setCursor (0,1); lcd.print ("MPU6050"); forsinkelse (3000); lcd.clear ();
ugyldig sløyfe ():
Igjen begynner I2C-kommunikasjonen med MPU6050.
Wire.beginTransmission (MPU_addr);
Start så med register 0x3B (ACCEL_XOUT_H)
Wire.write (0x3B);
Nå starter prosessen på nytt ved å angi at sluttoverføringen er falsk, men forbindelsen er aktiv.
Wire.endTransmission (false);
Etter det ber du nå om data fra de 14 registrene.
Wire.requestFrom (MPU_addr, 14, sant);
Nå oppnås respekterte akseregisterverdier (x, y, z) og lagres i variablene akse_X, akse_Y, akse_Z.
axis_X = Wire.read () << 8-Wire.read (); axis_Y = Wire.read () << 8-Wire.read (); axis_Z = Wire.read () << 8-Wire.read ();
Kartlegg deretter verdiene fra 265 til 402 som -90 til 90. Dette gjøres for alle de tre aksene.
int xAng = kart (akse_X, minVal, maxVal, -90,90); int yAng = map (axis_Y, minVal, maxVal, -90,90); int zAng = kart (axis_Z, minVal, maxVal, -90,90);
Formelen for å beregne x-verdien i grad (0 til 360) er gitt nedenfor. Her konverterer vi bare x fordi servomotorens rotasjon er basert på x-verdi bevegelse.
x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI);
X-vinkelverdi, fra 0 til 360 grader, blir omgjort til 0 til 180.
int pos = kart (x, 0,180,0,180);
Skriv deretter vinkelverdien for å rotere servoen på vinkelmålerbilde og skriv ut disse verdiene på 16x2 LCD-skjermen.
myservo.write (pos); lcd.setCursor (0,0); lcd.print ("Vinkel"); lcd.setCursor (0,1); lcd.print (x); forsinkelse (500); lcd.clear ();
Så dette er hvordan MPU6050 med Arduino kan brukes til å måle vinkelen. Fullstendig kode og video for dette prosjektet er gitt nedenfor.