Prog Shield Gyroskop MPU6050

Fra Holstebro HTX Wiki
Skift til: navigering, søgning
3-akset Gyroskop og Accelerometer med I2C interface

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:
MPU6050-layout.png

Referencer