Mit dem MPU6050 lässt sich sehr einfach ein Beschleunigungsmesser für diverse physikalischen Versuche (z.B. Zentripetalbeschleunigung messen) umsetzen. Man benötigt nur den Sensor, einen Arduino (nano) und ein I2C 16×2 display.
Angezeigt werden in der ersten Zeile die aktuellen Beschleunigungen in x-, y- und z-Richtung und in der zweiten Zeile die jeweiligen Maximalwerte. Mittels Taster können diese wieder auf Null gesetzt werden.




Arduino-Code:
// ====================================================================
// Programm zur Bestimmung von Beschleunigungen mittels MPU6050-Sensors
// ====================================================================
#include <math.h>
#include "Wire.h"
#include "I2Cdev.h" // I2Cdev and MPU6050 must be installed as libraries
#include "MPU6050.h" // class default I2C address is 0x68 = AD0 low
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!!
// Anschlüsse:
// GND - GND
// VCC - 5V
// SDA - ANALOG Pin 4
// SCL - ANALOG pin 5
MPU6050 accelgyro;
int Reset; // Variable für den Reset-Knopf
int16_t ax, ay, az; // Beschleunigungswerte in x-,y- und z-Richtung des MPU6050-Sensors
int16_t gx, gy, gz; // Winkelgeschwindigkeitswerte in x-,y- und z-Richtung des MPU6050-Sensors
float ax_max, ay_max, az_max; // maximale Beschleunigungswerte
// =========================================================
// ===================== SETUP ============================
// =========================================================
void setup()
{
#define Pin_Reset 3 // Pin-Anschluss für den Reset-Knopf
pinMode(Pin_Reset, INPUT); // Pin für den Reset-Knopf
// join I2C bus (I2Cdev library doesn't do this automatically)
Wire.begin();
// initialize serial communication
Serial.begin(9600);
// initialize device
accelgyro.initialize();
//Sensor output scaling (2g/4g/8g/16g)
accelgyro.setFullScaleAccelRange(MPU6050_ACCEL_FS_8); // Sensor konkret auf 8g eingestellt
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Accelerometer");
lcd.setCursor(0,1);
lcd.print("Version 1.0");
delay(4000);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Wagner vs Fruhwi");
lcd.setCursor(0,1);
lcd.print("1:0");
delay(4000);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
ax_max = 0.0;
ay_max = 0.0;
az_max = 0.0;
}
// =========================================================
// ================== HAUPTSCHLEIFE ========================
// =========================================================
void loop()
{
// ==========================================================================================
// read raw accel/gyro measurements from device
// Ausgabewerte-Acc: Auflösung 2g: 16384/g Auflösung 4g: 8192/g Auflösung 8g: 4096/g
// ==========================================================================================
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
if (abs(ax) >= ax_max)
{
ax_max = abs(ax);
}
if (abs(ay) >= ay_max)
{
ay_max = abs(ay);
}
if (abs(az) >= az_max)
{
az_max = abs(az);
}
/*
Serial.print(ax/4096.0,1); Serial.print("\t"); // Auflösung 8g: 4096/g
Serial.print(ay/4096.0,1); Serial.print("\t"); // Auflösung 8g: 4096/g
Serial.print(az/4096.0,1); Serial.print("\t"); // Auflösung 8g: 4096/g
Serial.println(" ");
*/
Reset = digitalRead(Pin_Reset); // Abfrage des Resetpins
if (Reset == HIGH) // Mittels Taster Reset ausgelöst
{
ax_max = 0.0; // Maximumwerte werden auf 0 gesetzt
ay_max = 0.0;
az_max = 0.0;
}
delay(10);
// LCD-Ausgabe der aktuellen Beschleunigungswerte
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(5,0);
lcd.print(" ");
lcd.setCursor(10,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(ax/4096.0,1);
lcd.setCursor(5,0);
lcd.print(ay/4096.0,1);
lcd.setCursor(10,0);
lcd.print(az/4096.0,1);
// LCD-Ausgabe der maximalen Beschleunigungswerte
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(5,1);
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(ax_max/4096.0,2);
lcd.setCursor(5,1);
lcd.print(ay_max/4096.0,2);
lcd.setCursor(10,1);
lcd.print(az_max/4096.0,2);
}
