Erzeuge ein minimales projekt mit dem Esp32 UnoBoard und dem
Ja. Beim ADXL345 brauchst du keinen externen ADC: Er ist ein digitaler I²C/SPI-Beschleunigungssensor. Mit dem ESP32 UnoBoard reicht I²C.
Die SparkFun-Library nutzt z. B. ADXL345 adxl = ADXL345(); für I²C, adxl.powerOn(), adxl.setRangeSetting(...) und adxl.readAccel(&x,&y,&z). ([GitHub][1])
| ADXL345 | ESP32 UnoBoard |
|---|---|
| VCC | 3.3 V |
| GND | GND |
| SDA | GPIO 21 |
| SCL | GPIO 22 |
| CS | 3.3 V |
| SDO | GND für Adresse 0x53 |
Falls dein Breakout schon Pullups/Levelshifter hat, ist das unkritisch. Den ADXL345 selbst bitte mit 3.3 V betreiben.
Arduino IDE → Library Manager → SparkFun ADXL345 Arduino Library
Oder per ZIP von GitHub:
SparkFun_ADXL345_Arduino_Library
#include <Wire.h>
#include <SparkFun_ADXL345.h>
ADXL345 adxl = ADXL345(); // I2C
const int SDA_PIN = 21;
const int SCL_PIN = 22;
// ADXL345 im Full-Resolution-Modus:
// Rohwert entspricht ca. 3.9 mg/LSB
const float LSB_TO_G = 0.0039;
void setup() {
Serial.begin(115200);
delay(500);
Wire.begin(SDA_PIN, SCL_PIN);
adxl.powerOn();
// Messbereich: 2, 4, 8 oder 16 g
// Für Neigungswinkel ist 2g am sinnvollsten.
adxl.setRangeSetting(2);
Serial.println("ESP32 UnoBoard + ADXL345 Winkelmessung gestartet");
}
void loop() {
int xRaw, yRaw, zRaw;
adxl.readAccel(&xRaw, &yRaw, &zRaw);
float ax = xRaw * LSB_TO_G;
float ay = yRaw * LSB_TO_G;
float az = zRaw * LSB_TO_G;
float angleX = atan2(ax, sqrt(ay * ay + az * az)) * 180.0 / PI;
float angleY = atan2(ay, sqrt(ax * ax + az * az)) * 180.0 / PI;
float angleZ = atan2(az, sqrt(ax * ax + ay * ay)) * 180.0 / PI;
Serial.print("ax=");
Serial.print(ax, 3);
Serial.print("g ay=");
Serial.print(ay, 3);
Serial.print("g az=");
Serial.print(az, 3);
Serial.print("g | X=");
Serial.print(angleX, 1);
Serial.print(" deg Y=");
Serial.print(angleY, 1);
Serial.print(" deg Z=");
Serial.print(angleZ, 1);
Serial.println(" deg");
delay(200);
}
angleX: Neigung um die X-Achse bezogen auf SchwerkraftvektorangleY: Neigung um die Y-AchseangleZ: Winkel der Z-Achse zum SchwerkraftvektorBei flachem Sensor solltest du ungefähr sehen:
ax ≈ 0g
ay ≈ 0g
az ≈ 1g
X ≈ 0 deg
Y ≈ 0 deg
Z ≈ 90 deg
Für eine klassische Anzeige von Roll und Pitch sind oft diese zwei Werte sinnvoller:
float roll = atan2(ay, az) * 180.0 / PI;
float pitch = atan2(-ax, sqrt(ay * ay + az * az)) * 180.0 / PI;
Der ADXL345 misst Neigung nur im Stillstand zuverlässig. Bei Bewegung misst er zusätzlich dynamische Beschleunigung; dann sind die Winkel verfälscht.
[1]: "SparkFun_ADXL345_Arduino_Library/examples/SparkFun_ADXL345 ... - GitHub"