Forum: Mikrocontroller und Digitale Elektronik Arduino ADXL345 und MCP3021 funktionieren nicht zusammen


von Fabian S. (fabian_s624)


Angehängte Dateien:

Lesenswert?

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: https://github.com/pilotak/MCP3X21
ADXL345: https://github.com/wollewald/ADXL345_WE

Boards:
ADXL345: 
https://paradisetronic.com/de/sensoren/adxl-345-modul-3-achsen-accelerometer

MCP3021: Hierfür habe ich mir selbst ein Board gemacht, hab mich da am
         „Typical Test Configuration" im Datenblatt orientiert.


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 ?
1
#include <Wire.h>
2
#include "MCP3X21.h"
3
#include <ADXL345_WE.h>
4
#define ADXL345_I2CADDR 0x53
5
6
7
const uint8_t address = 0x4D;
8
const uint16_t ref_voltage = 3300;
9
const int int2Pin = 2;
10
int resultnew = 0;
11
float potiwert = 0;
12
bool interruptON = false;
13
byte intSource;
14
volatile bool in_activity = false;
15
16
ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);
17
MCP3021 mcp3021(address);
18
19
20
void setup()   {
21
  Wire.begin();
22
  Serial.begin(115200);
23
  pinMode(int2Pin, INPUT);
24
  Serial.println("ADXL345_Sketch - Activity and Inactivity Interrupts");
25
  Serial.println();
26
  delay(200);
27
  if (!myAcc.init())  {
28
    Serial.println("ADXL345 not connected");
29
    Serial.print("ADXL345 connected!");
30
  }
31
32
  myAcc.setDataRate(ADXL345_DATA_RATE_50);
33
  Serial.print("Data rate: ");
34
  Serial.print(myAcc.getDataRateAsString());
35
  delay(100);
36
37
  myAcc.setRange(ADXL345_RANGE_8G);
38
  delay(25);
39
  Serial.print(" grange: ");
40
  Serial.print(myAcc.getRangeAsString());
41
  Serial.println();
42
43
44
  attachInterrupt(digitalPinToInterrupt(int2Pin), in_activityISR, RISING);
45
46
  myAcc.setInactivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 1, 2.0);
47
48
  myAcc.setInterrupt(ADXL345_ACTIVITY, INT_PIN_2);
49
50
  uint16_t result1 = mcp3021.read();
51
  Serial.print("result: ");
52
  Serial.println(result1);
53
  result1 = map(result1, 0, 1023, 300, 1600);
54
  if (result1 != resultnew) {
55
    potiwert = result1 / 100.00;
56
    myAcc.setActivityParameters(ADXL345_DC_MODE, ADXL345_XYZ, potiwert);
57
    delay(50);
58
    myAcc.setInactivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 1, 1);
59
    Serial.print("Mein Sensor ist jetzt auf: ");
60
    Serial.println(potiwert);
61
    Serial.print(" g eingestellt");
62
    Serial.print("Der Wert des ADC beträgt: ");
63
    Serial.println(result1);
64
    delay(25);
65
    resultnew = result1;
66
  }
67
}
68
69
void loop()  {
70
  if (in_activity == true)  {
71
    String axes = myAcc.getActTapStatusAsString();
72
    intSource = myAcc.readAndClearInterrupts();
73
    if (myAcc.checkInterrupt(intSource, ADXL345_ACTIVITY))  {
74
      delay(50);
75
      if (digitalRead(2) == true)  {
76
        interruptON = true;
77
      }
78
      Serial.print("interrupt Merker: ");
79
      Serial.println(interruptON);
80
      Serial.print("Activity at: ");
81
      Serial.println(axes);
82
    }
83
    Serial.print("Status I2: ");
84
    Serial.println(digitalRead(2));
85
86
    myAcc.readAndClearInterrupts();
87
    in_activity = false;
88
89
  }
90
  if (myAcc.checkInterrupt(intSource, ADXL345_INACTIVITY))  {
91
    Serial.println("Inactivity!");
92
  }
93
  interruptON = false;
94
95
96
}
97
98
void in_activityISR()  {
99
  in_activity = true;
100
}

von Thomas W. (Gast)


Lesenswert?

Fabian S. schrieb:
> Hi,
>
> Die Bibliotheken die ich verwende:
> MCP3021: https://github.com/pilotak/MCP3X21
> ADXL345: https://github.com/wollewald/ADXL345_WE
>
> Kann es sein das die zwei Bibliotheken sich irgendwie beißen ?

Das ist genau Deine Aufgabe herauszufinden. Du hast die Quellen, 
analysiere sie und passe sie an. Das Forum ist kein Cola-Automat der 
eine Loesung ausspuckt, wenn Du auf den Send-Button klickst.

Anyway: Use the Source, Fabian

Th.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.