ADXL345 und MCP3021 zusammen verwenden

Hi,
ich möchte mit einem ADXL345 Erschütterung erkennen. Die Empfindlichkeit des ADXL soll mittels Potentiometer eingestellt werden können.
Da ich einen ESP8266 verwenden will und der Analoge Eingang schon für etwas anderes benutzt wird muss ich auf einen A/D Wandler zurückgreifen, wo ich mich für den MCP3021 entschieden habe. Die Bibliotheken die ich verwende:
MCP3021: GitHub - pilotak/MCP3X21: Arduino library for MCP3021 I2C ADC
ADXL345: GitHub - wollewald/ADXL345_WE: Arduino Library for the ADXL345 accelerometer. I2C and SPI are implemented.

Da es für den MCP3021 kein fertiges Modul gibt hab ich mich an der „Typical Test Configuration" im Datenblatt orientiert und mir selbst eins gemacht.

Wenn ich jetzt A/D Wandler und ADXL345 einzeln mit den Beispielsketches ausprobiere funktionieren beide ohne Probleme. Sobald ich aber mein „zusammengestelltes" Programm ausprobiere beträgt „result" des MCPs 65535, was ja 16 Bit entsprechen würde. Der MCP3021 hat ja aber nur eine Auflösung von 10 Bit. Der Wert ändert sich dann auch nicht mehr wenn ich am Poti drehe. In dem angehängten Bild musste ich andere Bauteile verwenden da ich in Fritzing den ADXL und den MCP nicht gefunden habe. Ging mir aber nur darum euch zu zeigen wie ich sie an den I2C Bus angeschlossen habe. Der Widerstand von VCC zu SDA und SCL ist durch das Parallel schalten nicht zu gering geworden, liegt noch bei ca. 3,3kΩ. Kann es sein das die zwei Bibliotheken sich irgendwie beißen ?

#include<Wire.h>
#include "MCP3X21.h"
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53 // 0x1D if SDO = HIGH

const uint8_t address = 0x4D;
const uint16_t ref_voltage = 3300;
const int int2Pin = 2;
int resultnew = 0;
float potiwert = 0;
bool interruptON = false;
byte intSource;
volatile bool in_activity = false;

ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);
MCP3021 mcp3021(address);

void setup() {
  Wire.begin();
  Serial.begin(9600);
  pinMode(int2Pin, INPUT);
  Serial.println("ADXL345_Sketch - Activity and Inactivity Interrupts");
  Serial.println();
  if (!myAcc.init()) {
    Serial.println("ADXL345 not connected!");
  }

  myAcc.setDataRate(ADXL345_DATA_RATE_50);
  Serial.print("Data rate: ");
  Serial.print(myAcc.getDataRateAsString());
  delay(25);


  myAcc.setRange(ADXL345_RANGE_16G);
  Serial.print("  /  g-Range: ");
  Serial.println(myAcc.getRangeAsString());
  Serial.println();


  attachInterrupt(digitalPinToInterrupt(int2Pin), in_activityISR, RISING);

  myAcc.setInactivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 1, 2.0);

  myAcc.setInterrupt(ADXL345_ACTIVITY, INT_PIN_2);


  uint16_t result = mcp3021.read();
  result = map(result, 0, 1023, 300, 1600);
  if (result != resultnew) {

    //result = map(result, 0, 32767, 300, 1600);
    potiwert = (result / 100.00);
    myAcc.setActivityParameters(ADXL345_AC_MODE, ADXL345_XYZ, potiwert);
    delay(25);
    myAcc.setInactivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 1, 1);
    Serial.print("Mein Sensor ist jetzt auf: ");
    Serial.println(potiwert);
    Serial.println("g eingestellt");
    Serial.print("Der Wert des ADC beträgt: ");
    Serial.println(result);
    delay(25);
    resultnew = result;
  }
}


void loop() {

  if (in_activity == true) {
    //byte actTapSource = myAcc.getActTapStatus();
    //Serial.println(actTapSource, BIN);
    String axes = myAcc.getActTapStatusAsString();
    intSource = myAcc.readAndClearInterrupts();
    if (myAcc.checkInterrupt(intSource, ADXL345_ACTIVITY)) {
      delay(100);
      if (digitalRead(2) == true) {
        interruptON = true;
      }
      Serial.print("interrupt Merker:");
      Serial.println(interruptON);
      Serial.print("Activity at: ");
      Serial.println(axes);
    }

    Serial.print("Status I2: ");
    Serial.println(digitalRead(2));

    myAcc.readAndClearInterrupts();
    in_activity = false;



    if (myAcc.checkInterrupt(intSource, ADXL345_INACTIVITY)) {
      Serial.println("Inactivity!");
    }
    interruptON = false;
  }

}

void in_activityISR()  {
  in_activity = true;
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Du hättest wenigstens die Bauteile richtig beschriften können, auch ein Poti sehe ich nicht in der Schaltung. Leider ist das so schlecht nachzuvollziehen.

Hab das mal verbessert:

Nicht irritieren lassen: Hab hier einen Arduino reingezogen weil ich den schneller gefunden habe:)

read() liefert üblicherweise -1, wenn nichts zu lesen da ist, was dann bei einem uint16_t ein 65535 ergibt. Und durch dein map( ) zu einem noch blöderen Unsinnswert gewandelt wird.

Aber das passiert ja nur einmal in setup(), ist das Absicht?
Der Sketch für den mcp3021 allein, der deiner Meinung nach funktioniert, sieht sicher anders aus.

Warum nimmst Du nicht statt des Potentiometers einen Encoder?
Drehen zum verändern und dann abspeichern.
Grüße Uwe

Normal nicht.

Ok die SCL und SDA Widerstände sind?
Wen 2K dann ist der ist der Widerstand am Bus 1,4K = IO
Die Widerstände am ADC sind 2 x 4,7K oder?

Ein Oszilloskop wurde Dir ganze Wahrheit sagen :wink:

Aber das passiert ja nur einmal in setup(), ist das Absicht?

Ja ist Absicht. Die Empfindlichkeit des ADXL soll immer nur beim Neustart neu gesetzt werden.

Der Sketch für den mcp3021 allein, der deiner Meinung nach funktioniert, sieht sicher anders aus.

Nicht wirklich. Der Beispielsketch der Bibliothek macht im Grunde nichts anders. Der einzige Unterschied ist mein map(). Das brauche ich aber um einen brauchbaren Wert für den ADXL zu bekommen. Er soll von 3.00G bis 16.00G eingestellt werden können.

Hier ist der Beispielsktech des MCP3021:

[code]
#include <Wire.h>
#include "MCP3X21.h"  // https://github.com/pilotak/MCP3X21

const uint8_t address = 0x4D;
const uint16_t ref_voltage = 3300;  // in mV

MCP3021 mcp3021(address);

void setup() {
    Serial.begin(115200);

#if defined(ESP8266)
    Wire.begin(SDA, SCL);
    mcp3021.init(&Wire);
#else
    mcp3021.init();
#endif
}

void loop() {
    uint16_t result = mcp3021.read();

    Serial.print(F("ADC: "));
    Serial.print(result);
    Serial.print(F(", mV: "));
    Serial.println(mcp3021.toVoltage(result, ref_voltage));

    delay(1000);
}
[/code]

map macht in deinem Fall nur zusätzlich Unsinn, wenn der Eingangswert nicht im Eingangsbereich (0...1023) liegt.

Alles klar, ich hab mcp3021.init(&Wire) vergessen in meinen Sketch zu schreiben. Daher kamen auch die komischen Werte.

Problem gelöst, Vielen Dank:)

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