Beschleunigungssensor MPU6050 Programmieren

Hallo Zusammen,

ich bin noch komplett neu in der Arduino Welt und würde mir gerne ein wenig Unterstützung holen für mein Projekt an der Uni.
Also ich muss für meinen Master in Technik eine Boxbirne bauen welche die Schlagkraft und die Geschwindigkeit misst. Also letztendlich sollte auf einem Display ein wert für Speed in km/h erscheinen und einer für Power in Newton oder Watt.

Jetzt habe ich dazu einen Beschleunigungssensor MPU6050 erhalten und bin etwas überfordert diesen dahingehend zu programmieren. Ich habe einige Ansätze versucht aber es kommen immer sehr seltsame werde heraus mit denen ich nicht so viel anfangen kann.

hat jemand schonmal etwas in diese Richtung programmiert? Über etwas Unterstützung würde ich mich sehr freuen und wäre sehr dankbar!

Ich habe versucht so zu programmieren:

#include "Wire.h"

const int MPU_ADDR = 0x68;

int16_t accelerometer_x_Speed, accelerometer_y_Speed, accelerometer_z_Speed, accelerometer_x_Power, accelerometer_y_Power, accelerometer_z_Power;

int t;

char tmp_str[7]; // temporary variable used in convert function

char* convert_int16_to_str(int16_t i) { // converts int16 to string. Moreover, resulting strings will have the same length in the debug monitor.
sprintf(tmp_str, "%6d", i);
return tmp_str;
}

void setup() {
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(MPU_ADDR); // Begins a transmission to the I2C slave (GY-521 board)
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
}
void loop() {
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) [MPU-6000 and MPU-6050 Register Map and Descriptions Revision 4.2, p.40]
Wire.endTransmission(false); // the parameter indicates that the Arduino will send a restart. As a result, the connection is kept active.
Wire.requestFrom(MPU_ADDR, 72, true); // request a total of 72=14 registers

// "Wire.read()<<8 | Wire.read();" means two registers are read and stored in the same variable
accelerometer_x_Speed= ((((Wire.read()<<8 | Wire.read() ) / 15120)*9.81)*3.6); // reading registers: 0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)
accelerometer_y_Speed= ((((Wire.read()<<8 | Wire.read() )/ 15120)*9.81)*3.6); // reading registers: 0x3D (ACCEL_YOUT_H) and 0x3E (ACCEL_YOUT_L)
accelerometer_z_Speed= ((((Wire.read()<<8 | Wire.read()) / 15120)*9.81)*3.6); // reading registers: 0x3F (ACCEL_ZOUT_H) and 0x40 (ACCEL_ZOUT_L)

accelerometer_x_Power= ((((((Wire.read()<<8 | Wire.read() ) / 15120)*9.81)/0.100)*1)); // reading registers: 0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)
accelerometer_y_Power= ((((((Wire.read()<<8 | Wire.read() )/ 15120)*9.81)/0.100)*1)); // reading registers: 0x3D (ACCEL_YOUT_H) and 0x3E (ACCEL_YOUT_L)
accelerometer_z_Power= ((((((Wire.read()<<8 | Wire.read()) / 15120)*9.81)/0.100)*1)); // reading registers: 0x3F (ACCEL_ZOUT_H) and 0x40 (ACCEL_ZOUT_L)

// print out data
Serial.print("aXspeed = "); Serial.print(convert_int16_to_str(accelerometer_x_Speed));
Serial.print(" | aYspeed = "); Serial.print(convert_int16_to_str(accelerometer_y_Speed));
Serial.print(" | aZspeed = "); Serial.print(convert_int16_to_str(accelerometer_z_Speed));

Serial.print("aXpower = "); Serial.print(convert_int16_to_str(accelerometer_x_Power));
Serial.print(" | aYpower = "); Serial.print(convert_int16_to_str(accelerometer_y_Power));
Serial.print(" | aZpower = "); Serial.print(convert_int16_to_str(accelerometer_z_Power));
// the following equation was taken from the documentation [MPU-6000/MPU-6050 Register Map and Description, p.30]
Serial.println();

// delay
delay(1000);
}

Angeblich stehen die counts - also die Zahl 15120, die der Serielle Monitor ausgibt für ein G (die Erdbeschleunigung) daher habe ich dieses geteilt.
Wie gesagt ich kenne mich mit all dem noch nicht so gut aus, daher kann ich auch totalen misst gebaut haben bei Programmieren - vllt hat jemand ja einen sinnvolleren Ansatz.

Vielen Dank im Voraus,

VG, Marco

Indem Du Diesen Text zusätzlich persönlich an die User schickst erreichst Du das Gegenteil von dem was Du beabsichtigst. Statt Aufmerksamkeit und Antworten bekommst Du einfach keine Antworten.
Uwe

Hallo,

Für das Teil gibst jede Menge Beispiele, auch in der Lib dazu, in denen auch ganz gut erklärt wird was das Ding misst und kann. Google einfach mal nach MPU6050

Beispiel

MPU6050 Playground

oder

Datasheet

da kannst Du Dich einlesen.

Der Rest ist Physik .

Da es hier um Deine Masterarbeit geht wirst Du verstehen das die Hilfe zu Deinem Thema begrenzt sein wird die du hier erwarten kannst. Allgemeine Tipps, Fragen zur Hardware und zur Programiereung beantworten wir jedoch gern.

Heinz