- Vad är en accelerometer och gyroskopisk sensor?
- MPU6050 Accelerometer och gyroskopisk sensormodul
- Komponenter krävs
- Kretsschema
- Programmeringsförklaring
Den MPU6050 är ett IC 3-axlig accelerometer och en tre-axlig gyroskop kombinerade till en enhet. Det innehåller också en temperatursensor och en DCM för att utföra en komplex uppgift. MPU6050 används ofta för att bygga Drone och andra fjärrrobotar som en självbalanserande robot. I det här projektet kommer vi att bygga en digital gradskiva med MPU6050 och Arduino. Här används en servomotor för att visa vinkeln på en gradskiva. Servomotoraxeln är fäst med en nål som kommer att rotera på gradskivans bild för att indikera den vinkel som också visas på en 16xLCD-skärm. Låt oss lära oss mer om gyroskopsensorn innan vi går in i detaljer.
Vad är en accelerometer och gyroskopisk sensor?
En accelerometer används för att mäta accelerationen. Det känner faktiskt både den statiska och dynamiska accelerationen. Till exempel använder mobiltelefoner accelerometersensor för att känna att mobilen är i liggande eller stående läge. Vi använde tidigare Accelerometer med Arduino för att bygga många projekt som:
Ett gyroskop används för att mäta vinkelhastigheten som använder jordens tyngdkraft för att bestämma orienteringen av objektet i rörelse. Vinkelhastighet är hastigheten för förändring av vinkelpositionen hos en roterande kropp.
Till exempel använder dagens mobiler gyroskopiska sensorer för att spela mobilspel beroende på mobiltelefonens riktning. VR-headset använder också gyroskopsensor för att ha vyer i 360-orientering
Så medan accelerometern kan mäta linjär acceleration kan gyroskop hjälpa till att hitta rotationsacceleration. När båda sensorerna används som separata moduler blir det svårt att hitta orientering, position och hastighet. Men genom att kombinera de två sensorerna fungerar det som en tröghetsmätningsenhet (IMU). Så i MPU6050-modulen finns accelerometer och gyroskop på ett enda kretskort för att hitta orientering, position och hastighet.
Tillämpningar:
- Används i Drones för riktningskontroll
- Självbalanserande robotar
- Robotarmkontroll
- Lutningssensor
- Används i mobiltelefoner, spelkonsoler
- Humanoid-robotar
- Används i flygplan, bilar etc.
MPU6050 Accelerometer och gyroskopisk sensormodul
MPU6050 är ett mikro-elektromekaniskt system (MEMS) som består av en 3-axlig accelerometer och 3-axlig gyroskop inuti den. Den har också temperatursensor.
Den kan mäta:
- Acceleration
- Hastighet
- Orientering
- Förflyttning
- Temperatur
Denna modul har också en (DMP) Digital Motion Processor inuti som är tillräckligt kraftfull för att utföra komplexa beräkningar och därmed frigöra arbetet för Microcontroller.
Modulen har också två hjälpstift som kan användas för att ansluta externa IIC-moduler som en magnetometer. Eftersom IIC-adressen för modulen är konfigurerbar kan mer än en MPU6050-sensor kopplas till en mikrokontroller med AD0-stiftet.
Funktioner och specifikationer:
- Strömförsörjning: 3-5V
- Kommunikation: I2C-protokoll
- Inbyggd 16-bitars ADC ger hög noggrannhet
- Inbyggd DMP ger hög beräkningskraft
- Kan användas för att gränssnitt med andra IIC-enheter som magnetometer
- Konfigurerbar IIC-adress
- Inbyggd temperatursensor
Pinout av MPU6050:
Pinkod | Pin-namn | Använda sig av |
1 | Vcc | Ger ström till modulen, kan vara + 3V till + 5V. Vanligtvis används + 5V |
2 | Jord | Ansluten till systemets jord |
3 | Seriell klocka (SCL) | Används för att tillhandahålla klockpuls för I2C-kommunikation |
4 | Seriell data (SDA) | Används för överföring av data via I2C-kommunikation |
5 | Extra seriell data (XDA) | Kan användas för att koppla ihop andra I2C-moduler med MPU6050. Det är valfritt |
6 | Extra seriell klocka (XCL) | Kan användas för att koppla ihop andra I2C-moduler med MPU6050. Det är valfritt |
7 | AD0 | Om mer än en MPU6050 används en enda MCU, kan denna stift användas för att variera adressen |
8 | Interrupt (INT) | Avbryt stift för att indikera att data är tillgängliga för MCU att läsa. |
Vi använde tidigare MPU6050 med Arduino för att bygga Self Balancing Robot och Inclinometer.
Komponenter krävs
- Arduino UNO
- MPU6050 gyroskopmodul
- 16x2 LCD-skärm
- Potentiometer 10k
- SG90-Servomotor
- Gradskiva bild
Kretsschema
Kretsschema för denna DIY Arduino Protractor ges nedan:
Kretsförbindelser mellan Arduino UNO och MPU6050:
MPU6050 |
Arduino UNO |
VCC |
+ 5V |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Kretsförbindelser mellan Arduino UNO och servomotor:
Servomotor |
Arduino UNO |
RÖD (VCC) |
+ 5V |
ORANGE (PWM) |
9 |
BRUN (GND) |
GND |
Kretsförbindelser mellan Arduino UNO och 16x2 LCD:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Till Potentiometer Center PIN För kontroll av LCD-skärmens kontrast |
RS |
2 |
RW |
GND |
E |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
A |
+ 5V |
K |
GND |
Programmeringsförklaring
Som vanligt ges hela programmet med en demonstrationsvideo i slutet av denna handledning.
Här är servomotor ansluten till Arduino och dess axel projiceras på en gradskiva som indikerar vinkeln på den lutande MPU6050. Programmering för denna handledning är enkel. Låt oss se det i detalj.
Inkludera först alla nödvändiga bibliotek - Servomotorbibliotek för användning av Servo, LCD-bibliotek för användning av LCD och Wire-bibliotek för användning av I2C-kommunikation.
MPU6050 använder I2C-kommunikation och måste därför endast anslutas till I2C-stiften på Arduino. Så, Wire.h- biblioteket används för att upprätta kommunikation mellan Arduino UNO och MPU6050. Vi gränssnitt tidigare MPU6050 med Arduino och visade x, y, z koordinatvärden på 16x2 LCD.
#omfatta
Därefter definierar du LCD-skärmstift RS, E, D4, D5, D6, D7 som är anslutna till Arduino UNO.
LiquidCrystal lcd (2,3,4,5,6,7);
Därefter definieras I2C-adressen för MPU6050.
const int MPU_addr = 0x68;
Sedan initiera myservo objekt för användning Servo klass och tre variabler för att lagra X, Y och Z axelvärden.
Servo myservo; int16_t axel_X, axel_Y, axel_Z;
Nästa minimi- och maximivärde ställs in som 265 och 402 för mätvinkel från 0 till 360.
int minVal = 265; int maxVal = 402;
ogiltig installation ():
I tomrumsfunktionen startas först I2C-kommunikation och överföring har börjat med MPU6050 med adressen 0x68.
Wire.begin (); Wire.beginTransmission (MPU_addr);
Sätt MPU6050 i viloläge genom att skriva 0x6B och vakna det genom att skriva 0
Wire.write (0x6B); Wire.write (0);
Efter att ha gjort MPU6050 aktiv avslutar du överföringen
Wire.endTransmission (sant);
Här är PWM-stiftet på servomotorn ansluten till Arduino UNO-stift 9.
myservo.attach (9);
Så snart vi slår på kretsen visar LCD-skärmen ett välkomstmeddelande och rensar det efter 3 sekunder
lcd.begin (16,2); // Ställer in LCD i 16X2-läge lcd.print ("CIRCUIT DIGEST"); fördröjning (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Arduino"); lcd.setCursor (0,1); lcd.print ("MPU6050"); fördröjning (3000); lcd.clear ();
ogiltig slinga ():
Återigen börjar I2C-kommunikationen med MPU6050.
Wire.beginTransmission (MPU_addr);
Börja sedan med register 0x3B (ACCEL_XOUT_H)
Wire.write (0x3B);
Nu startas processen igen genom att ställa in slutöverföring som falsk men anslutningen är aktiv.
Wire.endTransmission (falsk);
Därefter begär du nu data från de 14 registren.
Wire.requestFrom (MPU_addr, 14, sant);
Nu erhålls respekterade axelregistervärden (x, y, z) och lagras i variabler axel_X, axel_Y, axel_Z.
axis_X = Wire.read () << 8-Wire.read (); axis_Y = Wire.read () << 8-Wire.read (); axis_Z = Wire.read () << 8-Wire.read ();
Kartlägg sedan värdena från 265 till 402 som -90 till 90. Detta görs för alla de tre axlarna.
int xAng = karta (axel_X, minVal, maxVal, -90,90); int yAng = karta (axel_Y, minVal, maxVal, -90,90); int zAng = karta (axel_Z, minVal, maxVal, -90,90);
Formeln för att beräkna x-värdet i grad (0 till 360) ges nedan. Här konverterar vi bara x eftersom servomotorns rotation är baserad på x-värde rörelse.
x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI);
X-vinkelvärde, från 0 till 360 grader, omvandlas till 0 till 180.
int pos = karta (x, 0,180,0,180);
Skriv sedan vinkelvärdet för att rotera servon på gradskiva och skriv ut dessa värden på 16x2 LCD-skärmen.
myservo.write (pos); lcd.setCursor (0,0); lcd.print ("Vinkel"); lcd.setCursor (0,1); lcd.print (x); fördröjning (500); lcd.clear ();
Så detta är hur MPU6050 med Arduino kan användas för att mäta vinkeln. Komplett kod och video för detta projekt ges nedan.