- Wat is een versnellingsmeter en gyroscopische sensor?
- MPU6050 Accelerometer en gyroscopische sensormodule
- Componenten vereist
- Schakelschema
- Uitleg over programmeren
De MPU6050 is een IC 3-assige accelerometer en een 3-assige gyroscoop gecombineerd in één eenheid. Het bevat ook een temperatuursensor en een DCM om een complexe taak uit te voeren. De MPU6050 wordt vaak gebruikt bij het bouwen van drones en andere robots op afstand, zoals een zelfbalancerende robot. In dit project zullen we een digitale gradenboog bouwen met MPU6050 en Arduino. Hier wordt een servomotor gebruikt om de hoek op een gradenboogbeeld weer te geven. De servomotoras is bevestigd met een naald die op de gradenboog zal draaien om de hoek aan te geven die ook wordt weergegeven op een 16xLCD-scherm. Laten we, voordat we in details treden, de gyroscoopsensor leren kennen.
Wat is een versnellingsmeter en gyroscopische sensor?
Een versnellingsmeter wordt gebruikt om de versnelling te meten. Het voelt zowel de statische als de dynamische versnelling. Mobiele telefoons gebruiken bijvoorbeeld een versnellingsmetersensor om te voelen dat de mobiele telefoon in de liggende of staande modus staat. We hebben eerder Accelerometer met Arduino gebruikt om veel projecten te bouwen, zoals:
Een gyroscoop wordt gebruikt om de hoeksnelheid te meten die de zwaartekracht van de aarde gebruikt om de oriëntatie van het bewegende object te bepalen. Hoeksnelheid is de snelheid waarmee de hoekpositie van een roterend lichaam verandert.
Mobiele telefoons van tegenwoordig gebruiken bijvoorbeeld gyroscopische sensoren om mobiele games te spelen volgens de oriëntatie van de mobiele telefoon. De VR-headset maakt ook gebruik van een gyroscoopsensor om 360 graden te kunnen bekijken
Dus hoewel de versnellingsmeter lineaire versnelling kan meten, kan de gyroscoop helpen bij het vinden van de rotatieversnelling. Bij gebruik van beide sensoren als afzonderlijke modules wordt het moeilijk om oriëntatie, positie en snelheid te vinden. Maar door de twee sensoren te combineren, werkt het als een inertial Measurement Unit (IMU). Dus in de MPU6050-module zijn accelerometer en gyroscoop aanwezig op een enkele PCB om de oriëntatie, positie en snelheid te vinden.
Toepassingen:
- Gebruikt in drones voor richtingscontrole
- Zelfbalancerende robots
- Robotarmbediening
- Kantel sensor
- Gebruikt in mobiele telefoons, videogameconsoles
- Humanoïde robots
- Gebruikt in vliegtuigen, automobiel enz.
MPU6050 Accelerometer en gyroscopische sensormodule
De MPU6050 is een micro-elektromechanisch systeem (MEMS) dat bestaat uit een 3-assige versnellingsmeter en een 3-assige gyroscoop erin. Het heeft ook een temperatuursensor.
Het kan meten:
- Versnelling
- Snelheid
- Oriëntatie
- Verplaatsing
- Temperatuur
Deze module bevat ook een (DMP) Digital Motion Processor die krachtig genoeg is om complexe berekeningen uit te voeren en zo het werk voor Microcontroller vrij te maken.
De module heeft ook twee hulppinnen die kunnen worden gebruikt om externe IIC-modules zoals een magnetometer te koppelen. Omdat het IIC-adres van de module configureerbaar is, kunnen meer dan één MPU6050-sensor worden aangesloten op een microcontroller met behulp van de AD0-pin.
Kenmerken en specificaties:
- Voeding: 3-5V
- Communicatie: I2C-protocol
- Ingebouwde 16-bits ADC zorgt voor een hoge nauwkeurigheid
- Ingebouwde DMP zorgt voor een hoge rekenkracht
- Kan worden gebruikt om te communiceren met andere IIC-apparaten zoals magnetometer
- Configureerbaar IIC-adres
- Ingebouwde temperatuursensor
Pinout van MPU6050:
Pincode | Pin Naam | Gebruik |
1 | Vcc | Levert stroom voor de module, kan + 3V tot + 5V zijn. Meestal wordt + 5V gebruikt |
2 | Grond | Verbonden met aarde van systeem |
3 | Seriële klok (SCL) | Wordt gebruikt voor het leveren van een klokpuls voor I2C-communicatie |
4 | Seriële gegevens (SDA) | Wordt gebruikt voor het overdragen van gegevens via I2C-communicatie |
5 | Extra seriële gegevens (XDA) | Kan worden gebruikt om andere I2C-modules te koppelen aan MPU6050. Het is optioneel |
6 | Extra seriële klok (XCL) | Kan worden gebruikt om andere I2C-modules te koppelen aan MPU6050. Het is optioneel |
7 | AD0 | Als er meer dan één MPU6050 wordt gebruikt in één MCU, kan deze pin worden gebruikt om het adres te variëren |
8 | Onderbreken (INT) | Onderbreek de pin om aan te geven dat de gegevens beschikbaar zijn voor MCU om te lezen. |
We gebruikten eerder MPU6050 met Arduino om zelfbalancerende robot en inclinometer te bouwen.
Componenten vereist
- Arduino UNO
- MPU6050 Gyroscoopmodule
- 16x2 LCD-scherm
- Potentiometer 10k
- SG90-servomotor
- Gradenboog Afbeelding
Schakelschema
Het schakelschema voor deze DIY Arduino-gradenboog wordt hieronder gegeven:
Circuitverbindingen tussen Arduino UNO en MPU6050:
MPU6050 |
Arduino UNO |
VCC |
+ 5V |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Circuitverbindingen tussen Arduino UNO en servomotor:
Servomotor |
Arduino UNO |
ROOD (VCC) |
+ 5V |
ORANJE (PWM) |
9 |
BRUIN (GND) |
GND |
Circuitverbindingen tussen Arduino UNO en 16x2 LCD:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Naar Potentiometer Center PIN Voor het regelen van het contrast van het LCD-scherm |
RS |
2 |
RW |
GND |
E. |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
EEN |
+ 5V |
K |
GND |
Uitleg over programmeren
Zoals gewoonlijk wordt aan het einde van deze tutorial het complete programma met een demonstratievideo gegeven.
Hier is de servomotor verbonden met Arduino en wordt de as ervan geprojecteerd op een gradenboogbeeld dat de hoek van de hellende MPU6050 aangeeft. Programmeren voor deze tutorial is eenvoudig. Laten we het in detail bekijken.
Neem eerst alle vereiste bibliotheken op - Servomotor-bibliotheek voor het gebruik van Servo, LCD-bibliotheek voor het gebruik van LCD en Wire-bibliotheek voor het gebruik van I2C-communicatie.
De MPU6050 maakt gebruik van I2C-communicatie en mag daarom alleen worden aangesloten op de I2C-pinnen van de Arduino. De Wire.h- bibliotheek wordt dus gebruikt om communicatie tot stand te brengen tussen Arduino UNO en MPU6050. We hebben eerder MPU6050 met Arduino gekoppeld en de x, y, z-coördinaatwaarden weergegeven op een 16x2 LCD.
# omvatten
Definieer vervolgens LCD-schermpinnen RS, E, D4, D5, D6, D7 die zijn verbonden met Arduino UNO.
LiquidCrystal lcd (2,3,4,5,6,7);
Vervolgens wordt het I2C-adres van de MPU6050 gedefinieerd.
const int MPU_addr = 0x68;
Initialiseer vervolgens myservo- object voor het gebruik van Servo-klasse en drie variabelen om X-, Y- en Z-aswaarden op te slaan.
Servo myservo; int16_t axis_X, axis_Y, axis_Z;
De volgende minimum- en maximumwaarde is ingesteld als 265 en 402 voor het meten van de hoek van 0 tot 360.
int minVal = 265; int maxVal = 402;
leegte setup ():
In de ongeldige setup- functie wordt eerst I2C-communicatie gestart en de verzending is begonnen met MPU6050 met adres 0x68.
Wire.begin (); Wire.beginTransmission (MPU_addr);
Zet de MPU6050 in de slaapstand door 0x6B te schrijven en maak hem vervolgens wakker door 0 te schrijven
Wire.write (0x6B); Wire.write (0);
Beëindig de verzending nadat u MPU6050 actief hebt gemaakt
Wire.endTransmission (true);
Hier is de PWM-pin van de servomotor verbonden met Arduino UNO-pin 9.
myservo.attach (9);
Zodra we het circuit inschakelen, geeft het LCD-scherm een welkomstbericht weer en wordt dit na 3 seconden gewist
lcd.begin (16,2); // Zet LCD in 16X2 Mode lcd.print ("CIRCUIT DIGEST"); vertraging (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Arduino"); lcd.setCursor (0,1); lcd.print ("MPU6050"); vertraging (3000); lcd.clear ();
leegte lus ():
Nogmaals, de I2C-communicatie wordt gestart met MPU6050.
Wire.beginTransmission (MPU_addr);
Begin dan met register 0x3B (ACCEL_XOUT_H)
Wire.write (0x3B);
Nu wordt het proces opnieuw gestart door de eindtransmissie in te stellen als onwaar, maar de verbinding is actief.
Wire.endTransmission (false);
Vraag daarna de gegevens op uit de 14 registers.
Wire.requestFrom (MPU_addr, 14, true);
Nu worden gerespecteerde as-registerwaarden (x, y, z) verkregen en opgeslagen in variabelen axis_X, axis_Y, axis_Z.
axis_X = Wire.read () << 8-Wire.read (); axis_Y = Wire.read () << 8-Wire.read (); axis_Z = Wire.read () << 8-Wire.read ();
Breng vervolgens die waarden van 265 tot 402 in kaart als -90 tot 90. Dit wordt gedaan voor alle drie de assen.
int xAng = kaart (axis_X, minVal, maxVal, -90,90); int yAng = kaart (axis_Y, minVal, maxVal, -90,90); int zAng = kaart (axis_Z, minVal, maxVal, -90,90);
De formule om de x-waarde in graden (0 tot 360) te berekenen, wordt hieronder gegeven. Hier converteren we alleen x omdat de rotatie van de servomotor is gebaseerd op x-waardebeweging.
x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI);
X-hoekwaarde, van 0 tot 360 graden, wordt omgezet in 0 tot 180.
int pos = kaart (x, 0,180,0,180);
Schrijf vervolgens de hoekwaarde om de servo op de gradenboog te draaien en druk deze waarden af op het 16x2 LCD-scherm.
myservo.write (pos); lcd.setCursor (0,0); lcd.print ("Hoek"); lcd.setCursor (0,1); lcd.print (x); vertraging (500); lcd.clear ();
Dit is dus hoe MPU6050 met Arduino kan worden gebruikt om de hoek te meten. De volledige code en video voor dit project wordt hieronder gegeven.