Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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.

ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken

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²).

ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken

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 Beschleunigungssensor mit Arduino: Orientierung tracken
ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken

ADXL345 mit Arduino auslesen

I²C → 2 Leitungen (SDA, SCL) + VCC/GND.

ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken

Benötigte Bauteile

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

ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken
ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken
ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken

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.

ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken

Lösung: 3 Offset-Register (0x1E X, 0x1F Y, 0x20 Z). Verfahren:

  1. Sensor flach hinlegen
  2. Rohwerte (ohne /256) ausgeben
  3. Abweichung vom Idealwert (X=0, Y=0, Z=256) notieren
  4. Abweichung / 4 = Wert für Offset-Register (8-bit, Two's Complement)
  5. In Setup schreiben
ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken
// 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

ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken

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.

ADXL345 Beschleunigungssensor mit Arduino: Orientierung tracken

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

  1. Arduino & MPU6050: Präzise Servomotor-Steuerung mit SG90 & MG996R
  2. u-blox LEA-6H 02 GPS-Modul: Arduino & Python Integrationsanleitung
  3. Temperatur & Luftfeuchte mit DHT11 auf Blynk auslesen – Arduino-Tutorial Schritt für Schritt
  4. Spracherkennung & Sprachsynthese auf Arduino Due meistern
  5. Musikalische Töne mit Arduino erzeugen: Schritt-für-Schritt-Anleitung
  6. Arduino an NMEA‑0183 anschließen: Schritt-für-Schritt-Anleitung
  7. Modbus auf Arduino meistern: Schritt-für-Schritt-Anleitung
  8. Arduino-gesteuerte smarte Kaffeemaschine mit Bluetooth & Temperaturüberwachung
  9. Animierter Smart-LED-Strip per Alexa steuern – Arduino-Projekt
  10. Sprachgesteuerte LEDs: Arduino Micro + BitVoicer Server für Spracherkennung