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?
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.
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.