Datenblatt ADXL345 deutsch gesucht

Hallo zusammen,

ich bin auf der Suche nach einem deutschen Datenblatt für den ADXL345. Bisher finde ich nur englische Versionen. Hat eventuell schon jemand einen deutschen Auszug in der Hand gehabt und kann mir sagen wo ich den finde?

Da wirst Du wohl kaum Glück haben. Warum sollte jemand Datenblätter auf Deutsch herausbringen? Übersetze sie Dir doch einfach mit Deepl.

Gruß Tommy

Ja, das wäre dann die Alternative mit der Übersetzung. Dachte nur, das es Datenblätter dazu in mindestens 5 Sprachen gibt, da nicht jeder der englischen Sprache mächtig ist und die Übersetzung auch nicht immer eindeutig ist. Englisch, Chinesisch, Deutsch, Russisch, Französisch, usw.

Wenn Du eine gute Übersetzung willst, lasse Dir eine von einem Fachübersetzer anfertigen. Die deutsche Sprache spiel im internationalen Rahmen kaum eine Rolle.

Gruß Tommy

Nein.
Die gibt es fast nur in einer Sprache und das ist wenn Du Glück hast Englisch..
Einige Maker haben Russische oder Chinesische übersetzt, aber die Teile wirst Du wohl nie zu Gesicht bekommen (Nixie, VFD)
Einige wenige Datenblätter gibt es auf Deutsch und Englisch: Meist von Healbleitern der Firmen Siemens, Infineon und Bosch.
Ich bin schon froh wenn ich englische Datenblätter finde die halbwegs nichts im Dunkeln lassen.
Es gibt einige sehr schlechte Datenblätter die nicht komplett den Halbleiter beschreiben.
Ein anderer Alptraum sind chinesische Datenblätter. Da ist eine maschinelle Übersetzung zwar möglich aber das Risultat schwer verständlich.

Grüße Uwe

Neben den anderen Beiträgen wurde in dem anderen Thread " ADXL345 Beschleunigung Umrechnung" auf einen Artikel vom Wolles-Elektronikkiste verwiesen. Dort wird in zwei deutschsprachigen Beiträgen auf so ziemlich alle Aspekte des Sensors eingegangen.

Mir kommt es aufgrund Deiner Fragen so vor, dass Du schon die Informationen welche Du auf deutsch bekommst, nicht so recht verarbeiten kannst/willst. Bzw. Du Dir nicht die Zeit dazu nimmst.

Bei dem Thema durchzusteigen kann schon länger als 10 Minuten dauern. Wenn Du dir schon so nicht die Zeit nimmst, dann hilft dir ein Datenblatt auf deutsch auch nichts.

Schau mal in den anderen Thread... Da ist was ganz mysteriöses passiert, was nicht nur ich nicht erklären kann.
Da klemmt es nicht an der Zeit. :wink:

Datenblätter gibt es oft nur in einer Sprache. Da Datenblätter auch ab und zu Änderungen bekommen, wäre es ein größerer Aufwand, diese in allen Sprachen zu ändern.

Ich habe mir damals Absatz für Absatz einzeln übersetzt. Damit ich verstehe was dort steht, musste ich dennoch viel googeln. Denn nur weil es Deutsch ist, versteht man es nicht sofort. Es hat mehrere Wochen gedauert, um zu verstehen welches Register was bedeutet und wie es funktioniert.

Dies können Bibliotheken ganz gut übernehmen. Diese Bibliotheken können dir auch die Rohwerte liefern. Natürlich muss man den richtigen Werte abrufen. Auch diese Bibliotheken muss man natürlich erst einmal verstehen. Aber für viele Bibliotheken gibt es auch deutsche Tutorials. Auf jeden Fall ist das Ansprechen der Bibliothek einfacher als das direkte ansprechen des ADXL345b.

Zur Kommunikation mit dem ADXL345b über I²C brauchst du eigentlich nur eine Bibliothek, die von der Arduino IDE schon mitgeliefert wird. Dies wäre die Wire.h . Mit der kannst du Verbindungen zu I²C Geräten aufbauen, Daten abrufen, oder Daten senden.

Der ADXL345b hat 8Bit Register. Diese kannst du beschreiben oder lesen. Dazu kannst du zwei einfache Funktionen verwenden.

Zum Schreiben eines Registers

void writeTo(uint8_t address, uint8_t val){   // Schreibt ein Byte an die übergebene Adresse
 Wire.beginTransmission(ADXL345_ADDRESS);     // Beginnt eine Übertragung zum Geräte der übergebenen Adresse, hier die Adresse des ADXL345b  
 Wire.write(address);                         // Übergibt die Adresse des Registers, damit der ADXL345b weis was ankommt             
 Wire.write(val);                             // Übergibt den Wert an das Register des ADXL345b
 Wire.endTransmission();                      // Beendet die Übertragung zum Gerät         
}

Zum Lesen eines Registers

uint8_t read8(uint8_t address){               // Liest ein Byte von der übergebene Adresse             
  uint8_t regValue = 0;                       // Variable für den Rückgabewert
  Wire.beginTransmission(ADXL345_ADDRESS);    // Beginnt eine Übertragung zum Geräte der übergebenen Adresse, hier die Adresse des ADXL345b
  Wire.write(address);                        // Übergibt die Adresse des Registers, damit der ADXL345b weis was er liefern soll
  Wire.endTransmission();                     // Beendet die Übertragung zum Gerät
  Wire.requestFrom(ADXL345_ADDRESS, 1);       // Fordert ein Bytes vom Gerät             
  if(Wire.available()){                       // Wenn die Verbindung steht
    regValue = Wire.read();                   // Lese das Byte und übergebe es der Variable
  }
  return regValue;                            // Rückgabewert der Funktion
}

Für die Rohdaten der Achsen reichen keine 8Bit. Dadurch sind sie auf zwei Register verteilt, die aufeinander folgen.
Diese kannst du mit folgender Funktion auslesen.

uint16_t read16(uint8_t address){             // Liest zwei Byte von der übergebene Adresse und der folgenden
  uint8_t MSByte = 0, LSByte = 0;             // Variablen zum zwischenspeichern der zwei Ausgelesenen Bytes
  uint16_t regValue = 0;                      // Variable zum speichern der zwei zusammengefasten Bytes
  Wire.beginTransmission(ADXL345_ADDRESS);    // Beginnt eine Übertragung zum Geräte der übergebenen Adresse, hier die Adresse des ADXL345b
  Wire.write(address);                        // Übergibt die Adresse des ersten Registers, damit der ADXL345b weis was er liefern soll
  Wire.endTransmission();                     // Beendet die Übertragung zum Gerät
  Wire.requestFrom(ADXL345_ADDRESS, 2);       // Fordert zwei Bytes vom Gerät, dass vom übergebenen Register und dass folgende Register
  if(Wire.available()){                       // Wenn die Verbindung steht
    LSByte = Wire.read();                     // Lese das erste Byte und übergebe es der Variable
    MSByte = Wire.read();                     // Lese das zweite Byte und übergebe es der Variable
  }
  regValue = (MSByte<<8) + LSByte;            // Übergebe die zwei Variablen mit je ein Byte einer Variable mit 2 Byte
  return regValue;                            // Rückgabewert der Funktion
}

Ich habe dir mal aus meinem Würfel etwas zusammenkopiert. Kompiliert, habe aber gerade keinen ADXL345b zur Hand zum Testen.
Die Register und deren Adressen sind oben in den Defines hinterlegt.
Auch habe ich dir mal auskommentiert meine Grundeinstellungen beim Würfel im Setup hinterlegt, die einiges zum Setzen erklären. Nur Stichpunktartig, aber vielleicht hilft es beim Übersetzen bzw. Verstehen des Datenblattes.

#include <Wire.h>

#define ADXL345_ADDRESS          0x53

// Die Register des ADXL345b
/* registers */
#define ADXL345_DEVID            0x00
#define ADXL345_THRESH_TAP       0x1D 
#define ADXL345_OFSX             0x1E
#define ADXL345_OFSY             0x1F
#define ADXL345_OFSZ             0x20
#define ADXL345_DUR              0x21
#define ADXL345_LATENT           0x22 
#define ADXL345_WINDOW           0x23 
#define ADXL345_THRESH_ACT       0x24
#define ADXL345_THRESH_INACT     0x25 
#define ADXL345_TIME_INACT       0x26 
#define ADXL345_ACT_INACT_CTL    0x27
#define ADXL345_THRESH_FF        0x28
#define ADXL345_TIME_FF          0x29 
#define ADXL345_TAP_AXES         0x2A
#define ADXL345_ACT_TAP_STATUS   0x2B
#define ADXL345_BW_RATE          0x2C
#define ADXL345_POWER_CTL        0x2D
#define ADXL345_INT_ENABLE       0x2E
#define ADXL345_INT_MAP          0x2F
#define ADXL345_INT_SOURCE       0x30
#define ADXL345_DATA_FORMAT      0x31
#define ADXL345_DATAX0           0x32
#define ADXL345_DATAX1           0x33
#define ADXL345_DATAY0           0x34
#define ADXL345_DATAY1           0x35
#define ADXL345_DATAZ0           0x36
#define ADXL345_DATAZ1           0x37
#define ADXL345_FIFO_CTL         0x38
#define ADXL345_FIFO_STATUS      0x39
/* Register bits */
#define ADXL345_FULL_RES         0x03
#define ADXL345_SUPPRESS         0x03
#define ADXL345_LOW_POWER        0x04

void setup() {
  Serial.begin(9600);                         // beginnt eine Serielle Verbindung
  Wire.begin();                               // beginnt eine I²C Verbindung

  /*
  // Register setzen. Mehr information im Datenblatt
  writeTo(ADXL345_DATA_FORMAT,   B00001000);              // B3 == Volle Auflösung = 1, 10-Bit Auflösung = 0 | B1B0 == Sensibilität, siehe Datenblatt
  writeTo(ADXL345_BW_RATE,       B00001101);              // Setzt 800Hz Ausgangs Datenrate (nicht I²C), B4B3B2B1, siehe Datenblatt Tabelle 7 und 8, Seite 14
  writeTo(ADXL345_POWER_CTL,     0);                      // Always be sure to zero out register, don't asume it's zero
  writeTo(ADXL345_POWER_CTL,     B00001000);              // 0 | 0 | Verknüpfen von In-/Aktivität | Automatisch schlafen | Messen Aktiv | Sleep | Wake Up | Wake Up
  writeTo(ADXL345_INT_ENABLE,    B01111100);              // Interupts aktivieren DATA_READY | SINGLE_TAP | DOUBLE_TAP | Activity | Inactivity | FREE_FALL | Watermark | Overrun 
  writeTo(ADXL345_THRESH_TAP,    50);                     // Klopf Schwelle (guter Wert ist 200)
  writeTo(ADXL345_DUR,           0x30);                   // Klopf Dauer einstellen, 0 = Klopfen deaktiviert
  writeTo(ADXL345_LATENT,        0x30);                   // Latenz - Zeit bis zum erwarten des zweiten Klopfens, davor wird ignoriert, 0 = Doppelklopfen deaktiviert
  writeTo(ADXL345_WINDOW,        0xFF);                   // Zeit Spanne wo ein zweites Klopfen passieren muss, damit es ein Doppelklopfen wird, 0 = Doppelklopfen deaktiviert
  writeTo(ADXL345_TAP_AXES,      B00001111);              // Achsen zum (Klopfen) aktivieren: 0 | 0 | 0 | 0 | Unterdrückung bei Bewegung An/Aus | X-Achse Tap An/Aus | Y-Achse Tap An/Aus | Z-Achse Tap An/Aus 
  // Freier Fall wird erkannt wenn Z, X und Y gleichzeitig den Wert nahe 0 haben, dazu müssen X, Y und Z im ADXL ein Offset haben damit der Free Fall Detektor das korrekt an den Interupt gibt
  writeTo(ADXL345_THRESH_FF,     4);                      // Freier Fall Schwelle (0-255), 5-9 wird empfohlen laut Datenblatt
  writeTo(ADXL345_TIME_FF,       50);                     // Freier Fall Mindestzeit (0-255), 20 für 100mSec - 70 für 350mSec wird empfohlen laut Datenblatt
  writeTo(ADXL345_OFSX,          255);                    // internen Offset setzen, 0 Aus, 1-123 = +, 255-124 = - // im 2g Modus ~4Einheiten pro Bit
  writeTo(ADXL345_OFSY,          42);                     // internen Offset setzen, 0 Aus, 1-123 = +, 255-124 = - // im 2g Modus ~4Einheiten pro Bit
  writeTo(ADXL345_OFSZ,          187);                    // internen Offset setzen, 0 Aus, 1-123 = +, 255-124 = - // im 2g Modus ~4Einheiten pro Bit
  writeTo(ADXL345_THRESH_ACT,    30);                     // Schwellwert zum erkennen einer Aktivität
  writeTo(ADXL345_THRESH_INACT,  30);                     // Schwellwert zum erkennen einer Inaktivität
  writeTo(ADXL345_TIME_INACT,    255);                    // Zeit die der Schwellwert der Inaktivität überschritten werden muss 0-255 Sekunden
  writeTo(ADXL345_ACT_INACT_CTL, B11111111);              // Einstellungen ACT 0=DC 1=AC | ACT (erkennen) X 0=Aus 1=An | ACT Y | ACT Z | INACT 0=DC 1=AC | INACT (erkennen) X 0=Aus 1=An | INACT Y | INACT Z
  */
}

void loop() {
  int16_t x = read16(ADXL345_DATAX0);         // Liest 2 Byte (16Bit) des Registers (Adresse)
  Serial.print("Wert der Variable: ");        // Serielle Ausgabe
  Serial.println(x);                          // Serielle Ausgabe
  delay(1000);                                // blockierende Pause zum Bremsen der Seriellen Ausgabe
}

uint16_t read16(uint8_t address){             // Liest zwei Byte von der übergebene Adresse und der folgenden
  uint8_t MSByte = 0, LSByte = 0;             // Variablen zum zwischenspeichern der zwei Ausgelesenen Bytes
  uint16_t regValue = 0;                      // Variable zum speichern der zwei zusammengefasten Bytes
  Wire.beginTransmission(ADXL345_ADDRESS);    // Beginnt eine Übertragung zum Geräte der übergebenen Adresse, hier die Adresse des ADXL345b
  Wire.write(address);                        // Übergibt die Adresse des ersten Registers, damit der ADXL345b weis was er liefern soll
  Wire.endTransmission();                     // Beendet die Übertragung zum Gerät
  Wire.requestFrom(ADXL345_ADDRESS, 2);       // Fordert zwei Bytes vom Gerät, dass vom übergebenen Register und dass folgende Register
  if(Wire.available()){                       // Wenn die Verbindung steht
    LSByte = Wire.read();                     // Lese das erste Byte und übergebe es der Variable
    MSByte = Wire.read();                     // Lese das zweite Byte und übergebe es der Variable
  }
  regValue = (MSByte<<8) + LSByte;            // Übergebe die zwei Variablen mit je ein Byte einer Variable mit 2 Byte
  return regValue;                            // Rückgabewert der Funktion
}

uint8_t read8(uint8_t address){               // Liest ein Byte von der übergebene Adresse             
  uint8_t regValue = 0;                       // Variable für den Rückgabewert
  Wire.beginTransmission(ADXL345_ADDRESS);    // Beginnt eine Übertragung zum Geräte der übergebenen Adresse, hier die Adresse des ADXL345b
  Wire.write(address);                        // Übergibt die Adresse des Registers, damit der ADXL345b weis was er liefern soll
  Wire.endTransmission();                     // Beendet die Übertragung zum Gerät
  Wire.requestFrom(ADXL345_ADDRESS, 1);       // Fordert ein Bytes vom Gerät             
  if(Wire.available()){                       // Wenn die Verbindung steht
    regValue = Wire.read();                   // Lese das Byte und übergebe es der Variable
  }
  return regValue;                            // Rückgabewert der Funktion
}

void writeTo(uint8_t address, uint8_t val){   // Schreibt ein Byte an die übergebene Adresse
 Wire.beginTransmission(ADXL345_ADDRESS);     // Beginnt eine Übertragung zum Geräte der übergebenen Adresse, hier die Adresse des ADXL345b  
 Wire.write(address);                         // Übergibt die Adresse des Registers, damit der ADXL345b weis was ankommt             
 Wire.write(val);                             // Übergibt den Wert an das Register des ADXL345b
 Wire.endTransmission();                      // Beendet die Übertragung zum Gerät         
}

Dieser Sketch liest die Rohdaten der X-Achse aus. Und gibt sie dir auf dem SerialMonitor wieder. Das Delay von 1ner Sekunde ist nur dazu da, damit es Lesefreundlicher auf dem SerialMonitor ist.

Danke euch allen für die vielen Informationen und Hilfestellungen. Es ist natürlich richtig, wenn Datenblätter überhaupt existieren und in Englisch sind. Und danke auch für die Beispiele.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.