Beschleunigungsmesser

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);
    
   
}