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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
// ==================================================================== // 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); } |