ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken
Übersicht
In diesem Tutorial lernen Sie, Winkel zu messen und Orientierung zu tracken mit Arduino und dem ADXL345 3-Achsen-Beschleunigungssensor. 3D-Visualisierung mit Processing inklusive.
Wie der ADXL345 funktioniert
3-Achsen-Beschleunigungsmesser: misst statische (Schwerkraft) & dynamische (Erschütterung, Bewegung) Kräfte. Einheit: m/s², oft in "g" (1 g = 9,81 m/s²).
Sensor flach, Z nach oben: Z = +1 g, X = 0, Y = 0. Umgedreht: Z = -1 g. Ausgaben: -1 g bis +1 g. Mit Trigonometrie → Neigungswinkel (Roll, Pitch).
ADXL345 mit Arduino auslesen
I²C → 2 Leitungen (SDA, SCL) + VCC/GND.
Benötigte Bauteile
- ADXL345 Beschleunigungssensor
- Arduino Board
- Steckbrett & Jumper-Kabel
Arduino Code – Rohdaten lesen
/* Arduino & ADXL345 Tutorial
* by Dejan, https://howtomechatronics.com
*/
#include <Wire.h>
int ADXL345 = 0x53; // I2C Adresse
float X_out, Y_out, Z_out;
void setup() {
Serial.begin(9600);
Wire.begin();
// Messmodus aktivieren: POWER_CTL (0x2D), Bit D3 = 1
Wire.beginTransmission(ADXL345);
Wire.write(0x2D);
Wire.write(8); // 0b00001000
Wire.endTransmission();
delay(10);
}
void loop() {
Wire.beginTransmission(ADXL345);
Wire.write(0x32); // ACCEL_XOUT_H
Wire.endTransmission(false);
Wire.requestFrom(ADXL345, 6, true); // 6 Register
X_out = (Wire.read() | Wire.read() << 8) / 256.0; // ±2g → 256 LSB/g
Y_out = (Wire.read() | Wire.read() << 8) / 256.0;
Z_out = (Wire.read() | Wire.read() << 8) / 256.0;
Serial.print("Xa= "); Serial.print(X_out);
Serial.print(" Ya= "); Serial.print(Y_out);
Serial.print(" Za= "); Serial.println(Z_out);
}
Code-Erklärung
WireLibrary für I²C- Adresse 0x53 (Datasheet)
- Register 0x2D (POWER_CTL), Bit D3 HIGH → Messmodus
- Datenregister 0x32–0x37 (je Achse 2 Bytes, Two's Complement)
- Default ±2g → Division durch 256 für g-Werte
Andere Bereiche (±4g, ±8g, ±16g) über DATA_FORMAT Register (Bits D1,D0) wählbar.
ADXL345 Kalibrierung (Offset-Korrektur)
Sensoren haben Fertigungstoleranzen. Beispiel: Z-Achse zeigte 0,1 g Offset.
Lösung: 3 Offset-Register (0x1E X, 0x1F Y, 0x20 Z). Verfahren:
- Sensor flach hinlegen
- Rohwerte (ohne /256) ausgeben
- Abweichung vom Idealwert (X=0, Y=0, Z=256) notieren
- Abweichung / 4 = Wert für Offset-Register (8-bit, Two's Complement)
- In Setup schreiben
// Im SETUP nach Messmodus-Aktivierung:
Wire.beginTransmission(ADXL345);
Wire.write(0x1E); Wire.write(1); // X-Offset
Wire.endTransmission(); delay(10);
Wire.beginTransmission(ADXL345);
Wire.write(0x1F); Wire.write(-2); // Y-Offset
Wire.endTransmission(); delay(10);
Wire.beginTransmission(ADXL345);
Wire.write(0x20); Wire.write(-7); // Z-Offset (Beispiel: 283→256, Diff 27, /4≈7)
Wire.endTransmission(); delay(10);
Hinweis: Offset nicht dauerhaft gespeichert → bei jedem Start neu setzen.
Roll & Pitch berechnen
Nach Kalibrierung (Werte in g):
roll = atan(Y_out / sqrt(pow(X_out, 2) + pow(Z_out, 2))) * 180 / PI;
pitch = atan(-1 * X_out / sqrt(pow(Y_out, 2) + pow(Z_out, 2))) * 180 / PI;
Details: Freescale Semiconductor Application Note.
3D-Visualisierung mit Processing
Arduino Code (sendet Roll/Pitch)
/* Arduino & ADXL345 - 3D Visualisierung
* by Dejan, https://howtomechatronics.com
*/
#include <Wire.h>
int ADXL345 = 0x53;
float X_out, Y_out, Z_out;
float roll, pitch, rollF, pitchF = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(ADXL345);
Wire.write(0x2D); Wire.write(8); Wire.endTransmission(); delay(10);
// Offset-Kalibrierung (Beispielwerte)
Wire.beginTransmission(ADXL345); Wire.write(0x1E); Wire.write(1); Wire.endTransmission(); delay(10);
Wire.beginTransmission(ADXL345); Wire.write(0x1F); Wire.write(-2); Wire.endTransmission(); delay(10);
Wire.beginTransmission(ADXL345); Wire.write(0x20); Wire.write(-9); Wire.endTransmission(); delay(10);
}
void loop() {
Wire.beginTransmission(ADXL345);
Wire.write(0x32); Wire.endTransmission(false);
Wire.requestFrom(ADXL345, 6, true);
X_out = (Wire.read() | Wire.read() << 8) / 256.0;
Y_out = (Wire.read() | Wire.read() << 8) / 256.0;
Z_out = (Wire.read() | Wire.read() << 8) / 256.0;
roll = atan(Y_out / sqrt(pow(X_out, 2) + pow(Z_out, 2))) * 180 / PI;
pitch = atan(-1 * X_out / sqrt(pow(Y_out, 2) + pow(Z_out, 2))) * 180 / PI;
// Tiefpassfilter für glattere Anzeige
rollF = 0.94 * rollF + 0.06 * roll;
pitchF = 0.94 * pitchF + 0.06 * pitch;
Serial.print(rollF); Serial.print("/"); Serial.println(pitchF);
}
Processing Code (empfängt & visualisiert)
/* ADXL345 3D Visualisierung - Processing
* by Dejan, https://howtomechatronics.com
*/
import processing.serial.*;
Serial myPort;
String data = "";
float roll, pitch;
void setup() {
size(960, 640, P3D);
myPort = new Serial(this, "COM8", 9600); // Port & Baud anpassen!
myPort.bufferUntil('\n');
}
void draw() {
translate(width/2, height/2, 0);
background(33);
textSize(22);
text("Roll: " + int(roll) + " Pitch: " + int(pitch), -100, 265);
rotateX(radians(roll));
rotateZ(radians(-pitch));
textSize(30); fill(0, 76, 153);
box(386, 40, 200);
textSize(25); fill(255);
text("www.HowToMechatronics.com", -183, 10, 101);
}
void serialEvent(Serial myPort) {
data = myPort.readStringUntil('\n');
if (data != null) {
data = trim(data);
String[] items = split(data, '/');
if (items.length > 1) {
roll = float(items[0]);
pitch = float(items[1]);
}
}
}
Ohne Filter: zittert (Handbewegungen). Mit Tiefpassfilter (94% alt + 6% neu): glatter, aber träger. Yaw (Gierwinkel) mit nur Beschleunigungsmesser nicht messbar.
Ausblick: MPU6050 (IMU mit Gyro)
Für Yaw & bessere Performance: Gyroskop hinzufügen → Sensorfusion. Entweder ADXL345 + separates Gyro, oder MPU6050 (6 DOF IMU auf einem Chip). Siehe nächstes Tutorial.
Viel Spaß! Fragen in den Kommentaren. Meine Arduino-Projektsammlung.
Herstellungsprozess
- Arduino & MPU6050: Präzise Servomotor-Steuerung mit SG90 & MG996R
- u-blox LEA-6H 02 GPS-Modul: Arduino & Python Integrationsanleitung
- Temperatur & Luftfeuchte mit DHT11 auf Blynk auslesen – Arduino-Tutorial Schritt für Schritt
- Spracherkennung & Sprachsynthese auf Arduino Due meistern
- Musikalische Töne mit Arduino erzeugen: Schritt-für-Schritt-Anleitung
- Arduino an NMEA‑0183 anschließen: Schritt-für-Schritt-Anleitung
- Modbus auf Arduino meistern: Schritt-für-Schritt-Anleitung
- Arduino-gesteuerte smarte Kaffeemaschine mit Bluetooth & Temperaturüberwachung
- Animierter Smart-LED-Strip per Alexa steuern – Arduino-Projekt
- Sprachgesteuerte LEDs: Arduino Micro + BitVoicer Server für Spracherkennung