Prog Shield Gyroskop MPU6050

Det 3 aksede gyroskop kan måle rotationer af gyroskopet. Det kan desuden fungere som accelerometer og kan måle tyngdekraften i et XYZ-koordinatsystem og kan ud fra dette bestemme hvad der er op og ned, og hvordan gyroskopet ændrerer rotation.
Modulet kan købes ved aliexpress[1]
Software
Softwaren til at hente gyroskop data ligger i denne ZIP-fil. Biblioteket downloades og installeres som beskrevet under Arduinos biblioteker.
Biblioteket indeholder en del eksempler. Det eksempel der er gennemgået her er MPU6050_gyro_simple.
Anvendelsen af softwaren
Som alle andre biblioteker skal der sættes de grundlæggende ting op for at kontakte biblioteket og definere
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
Inde i setup() startes den serielle kommunikation, og så sker der en hel del mere, som vist her:
void setup() {
Serial.begin(9600);
// Initialize MPU6050
Serial.println("Initialize MPU6050");
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
{
Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
delay(500);
}
// If you want, you can set gyroscope offsets
// mpu.setGyroOffsetX(155);
// mpu.setGyroOffsetY(15);
// mpu.setGyroOffsetZ(15);
// Calibrate gyroscope. The calibration must be at rest.
// If you don't want calibrate, comment this line.
mpu.calibrateGyro();
// Set threshold sensivty. Default 3.
// If you don't want use threshold, comment this line or set 0.
mpu.setThreshold(3);
// Check settings
checkSettings();
}
I loop() hentes data fra gyroskopet, både rå data og normaliserede data.
Disse værdier printes
void loop() {
Vector rawGyro = mpu.readRawGyro();
Vector normGyro = mpu.readNormalizeGyro();
Serial.print("Xraw = ");
Serial.print(rawGyro.XAxis);
Serial.print("\tYraw = ");
Serial.print(rawGyro.YAxis);
Serial.print("\tZraw = ");
Serial.print(rawGyro.ZAxis);
Serial.print("\tXnorm = ");
Serial.print(normGyro.XAxis);
Serial.print("\tYnorm = ");
Serial.print(normGyro.YAxis);
Serial.print("\tZnorm = ");
Serial.println(normGyro.ZAxis);
delay(100);
}
Test af programmet
Ved at teste programmet får man følgende output når gyroskopet ligger stille:
Xraw = 216.00 Yraw = 50.00 Zraw = 35.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00 Xraw = 217.00 Yraw = 48.00 Zraw = 36.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00 Xraw = 217.00 Yraw = 52.00 Zraw = 36.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00 Xraw = 215.00 Yraw = 51.00 Zraw = 36.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00 Xraw = 216.00 Yraw = 52.00 Zraw = 36.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00
Tester man gyroskopet under bevægelse kan man få følgende output:
Xraw = 4841.00 Yraw = 730.00 Zraw = -109.00 Xnorm = 281.33 Ynorm = 44.79 Znorm = -8.92 Xraw = 1251.00 Yraw = 1186.00 Zraw = -737.00 Xnorm = 62.68 Ynorm = 64.79 Znorm = -47.28 Xraw = -210.00 Yraw = 218.00 Zraw = -256.00 Xnorm = -27.50 Ynorm = 9.18 Znorm = -17.95 Xraw = -225.00 Yraw = 361.00 Zraw = -222.00 Xnorm = -28.11 Ynorm = 19.12 Znorm = -15.75 Xraw = 7.00 Yraw = 271.00 Zraw = -1.00 Xnorm = -12.14 Ynorm = 14.12 Znorm = 0.00 Xraw = -131.00 Yraw = 214.00 Zraw = -147.00 Xnorm = -20.98 Ynorm = 13.21 Znorm = -11.30
Yderligere muligheder i softwaren
Der ligger yderligere muligheder i klassen man kan anvende, hvis man ønsker andre måder at anvende gyroskopet på, der er rigtigt meget at rode med:
bool begin(mpu6050_dps_t scale = MPU6050_SCALE_2000DPS, mpu6050_range_t range = MPU6050_RANGE_2G, int mpua = MPU6050_ADDRESS);
void setClockSource(mpu6050_clockSource_t source);
void setScale(mpu6050_dps_t scale);
void setRange(mpu6050_range_t range);
mpu6050_clockSource_t getClockSource(void);
mpu6050_dps_t getScale(void);
mpu6050_range_t getRange(void);
void setDHPFMode(mpu6050_dhpf_t dhpf);
void setDLPFMode(mpu6050_dlpf_t dlpf);
mpu6050_onDelay_t getAccelPowerOnDelay();
void setAccelPowerOnDelay(mpu6050_onDelay_t delay);
uint8_t getIntStatus(void);
bool getIntZeroMotionEnabled(void);
void setIntZeroMotionEnabled(bool state);
bool getIntMotionEnabled(void);
void setIntMotionEnabled(bool state);
bool getIntFreeFallEnabled(void);
void setIntFreeFallEnabled(bool state);
uint8_t getMotionDetectionThreshold(void);
void setMotionDetectionThreshold(uint8_t threshold);
uint8_t getMotionDetectionDuration(void);
void setMotionDetectionDuration(uint8_t duration);
uint8_t getZeroMotionDetectionThreshold(void);
void setZeroMotionDetectionThreshold(uint8_t threshold);
uint8_t getZeroMotionDetectionDuration(void);
void setZeroMotionDetectionDuration(uint8_t duration);
uint8_t getFreeFallDetectionThreshold(void);
void setFreeFallDetectionThreshold(uint8_t threshold);
uint8_t getFreeFallDetectionDuration(void);
void setFreeFallDetectionDuration(uint8_t duration);
bool getSleepEnabled(void);
void setSleepEnabled(bool state);
bool getI2CMasterModeEnabled(void);
void setI2CMasterModeEnabled(bool state);
bool getI2CBypassEnabled(void);
void setI2CBypassEnabled(bool state);
float readTemperature(void);
Activites readActivites(void);
int16_t getGyroOffsetX(void);
void setGyroOffsetX(int16_t offset);
int16_t getGyroOffsetY(void);
void setGyroOffsetY(int16_t offset);
int16_t getGyroOffsetZ(void);
void setGyroOffsetZ(int16_t offset);
int16_t getAccelOffsetX(void);
void setAccelOffsetX(int16_t offset);
int16_t getAccelOffsetY(void);
void setAccelOffsetY(int16_t offset);
int16_t getAccelOffsetZ(void);
void setAccelOffsetZ(int16_t offset);
void calibrateGyro(uint8_t samples = 50);
void setThreshold(uint8_t multiple = 1);
uint8_t getThreshold(void);
Vector readRawGyro(void);
Vector readNormalizeGyro(void);
Vector readRawAccel(void);
Vector readNormalizeAccel(void);
Vector readScaledAccel(void);
Hardware
Princippet i gyroskopet er beskrevet i databladet[2]
Modulet kommunikerer på adresse 0x68 som standard, men kan indstilles til at kommunikere på 0x69 ved at sætte benet ADD højt - dette understøttes dog ikke på programmerings-shieldet.
Layout
Gyroskopets placering på programmerings-shieldet kan ses her:
![]()