Beschleunigungssensor ADXL 345 Einbindung

Begonnen von Alex1328, 20 November 2019, 12:15:36

Vorheriges Thema - Nächstes Thema

Alex1328

Hallo,

ich würden diesen Sensor für die automatische Abstützung von einem Wohnmobil verwenden. Da ich eh schon die Visualisierung und Steuerung der Geräte über Fhem realisiere.

Datenblatt: https://www.sparkfun.com/datasheets/Sensors/Accelerometer/ADXL345.pdf

Kann ich den Sensor per RPII2C auslesen oder kann jemand ein Modul für diesen Sensor programmieren?

Gruß Alex.

Alex1328

Oder ist eine Anbindung über Firmata der einfachere Weg?

Arduino Uno hab ich rumliegen.

Nur mit Define:

define <name> FRM_I2C <i2c-address> <register> <bytes-to-read>
Specifies the FRM_I2C device.
i2c-address is the (device-specific) address of the ic on the i2c-bus
register is the (device-internal) address to start reading bytes from.
bytes-to-read is the number of bytes read from the ic

Verstehe ich nicht.

define ADXL345 FRM_I2C 53 32? 10?

Adresse 53 OK, Register=Startregister 0x32? und Bytes to read=Sensorauflösung?

Habe ich richtig geraten oder geht dies nicht so einfach?

Danke, Gruß Alex.

Beta-User

Firmata reicht afaik nur die Schnittstelle durch, dia Auswertung müßte dann wieder ein Modul machen.

Wenn du Code für die Arduino-Programmierung hast, ist vermutlich der einfachste Weg, diesen auf dem Arduino laufen zu lassen und dann das Ergebnis an FHEM weiterzugeben.

Als Schnittstellenprotokoll bietet sich dann keyValueProtocol (afaik nur unidiretional Arduino => FHEM) oder MySensors an (da ist bidirektional, man könnte also auch eine Messung aktiv anfordern).

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Alex1328

Hallo,

kann mir bitte jemand mit dem Modul helfen. Der ADXL345 hängt direkt am Raspberry I2C Bus. Die Kommunikation per get/set I2c... funktioniert.
Was soll im Modul stehen damit ich schon mal die Daten bekomme?

use constant {
ADXL345_I2C_ADDRESS => '0x53',  #Adresse des ADXL345


Jetzt komme ich nicht mehr weiter. Als nächstes die Messung starten, dazu in Register 0x2D 8(dezimal) setzen.
Nun könnten die Werte, Register 32-37 gelesen werden.

Kann mir jemand das Modul so weit vorbereiten?
Den Rest verstehe ich dann hoffentlich.

Im Anhang ist ein Auszug vom Datenblatt.

Einen funktionierenden Arduino Sketch habe ich:

/*
    Arduino and ADXL345 Accelerometer - 3D Visualization Example
     by Dejan, https://howtomechatronics.com
*/
#include <Wire.h>  // Wire library - used for I2C communication

int ADXL345 = 0x53; // The ADXL345 sensor I2C address

float X_out, Y_out, Z_out;  // Outputs
float roll,pitch,rollF,pitchF=0;

void setup() {
  Serial.begin(9600); // Initiate serial communication for printing the results on the Serial monitor

  Wire.begin(); // Initiate the Wire library
  // Set ADXL345 in measuring mode
  Wire.beginTransmission(ADXL345); // Start communicating with the device
  Wire.write(0x2D); // Access/ talk to POWER_CTL Register - 0x2D
  // Enable measurement
  Wire.write(8); // Bit D3 High for measuring enable (8dec -> 0000 1000 binary)
  Wire.endTransmission();
  delay(10);

  //Off-set Calibration
  //X-axis
  Wire.beginTransmission(ADXL345);
  Wire.write(0x1E);
  Wire.write(2);
  Wire.endTransmission();
  delay(10);
  //Y-axis
  Wire.beginTransmission(ADXL345);
  Wire.write(0x1F);
  Wire.write(1);
  Wire.endTransmission();
  delay(10);

  //Z-axis
  Wire.beginTransmission(ADXL345);
  Wire.write(0x20);
  Wire.write(4);
  Wire.endTransmission();
  delay(10);
}

void loop() {
  // === Read acceleromter data === //
  Wire.beginTransmission(ADXL345);
  Wire.write(0x32); // Start with register 0x32 (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(ADXL345, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
  X_out = ( Wire.read() | Wire.read() << 8); // X-axis value
  X_out = X_out / 256; //For a range of +-2g, we need to divide the raw values by 256, according to the datasheet
  Y_out = ( Wire.read() | Wire.read() << 8); // Y-axis value
  Y_out = Y_out / 256;
  Z_out = ( Wire.read() | Wire.read() << 8); // Z-axis value
  Z_out = Z_out / 256;

  // Calculate Roll and Pitch (rotation around X-axis, rotation around Y-axis)
  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;

  // Low-pass filter
  rollF = 0.94 * rollF + 0.06 * roll;
  pitchF = 0.94 * pitchF + 0.06 * pitch;

  Serial.print(rollF);
  Serial.print("/");
  Serial.println(pitchF);
}