Forum: Mikrocontroller und Digitale Elektronik I2C - Sensoren beeinflussen sich


von Hannes (Gast)


Lesenswert?

Hallo an alle,

Probiere mich zur Zeit mit Arduino aus und muss für ein Projekt 
Beschleunigungen messen. Dazu benutze ich 2 ADXL345 Breakout boards von 
Adafruit. Die Kommunikation läuft über I2C. Einen einzelen Sensor 
anzusteuern und auszulesen ist kein Problem, soweit habe ich das auch 
hinbekommen. nun Versuche den zweiten Sensor mit in das System zu 
integrieren. Dabei hat der eine Sensor die Adresse 0x53 und der Andere 
die Adresse 0x1D (hängt von der Belegung von SDO ab).

Zuerst habe ich dabei versucht die Umsetzung mit der von Adafruit 
mitgelieferten Bibliothek zu machen, jedoch verstehe ich dort das System 
mit dem ansprechen über die Adressen nicht. Daher hab ich zum Test 
einmal die Anleitung auf folgender Seite benutzt:

http://codeyoung.blogspot.de/2013/06/connecting-two-adxl345s-to-one-arduino.html
1
#include <Wire.h>
2
3
#define ACC_A (0x1D)
4
#define ACC_B (0x53)
5
#define READING (6)
6
7
byte buff[READING];
8
char str[512];
9
10
int regAddress = 0x32;      //first axis-acceleration-data register on the ADXL345
11
int xa = 0, ya = 0, za = 0;  
12
int xb = 0, yb = 0, zb = 0;
13
14
void setup() {
15
  // put your setup code here, to run once:
16
17
  Wire.begin();
18
  Serial.begin(9600);
19
20
  //Turn on devices
21
  writeTo(ACC_A, 0x2D, 24);
22
  writeTo(ACC_B, 0x2D, 24);
23
24
}
25
26
void writeTo(int device, byte address, byte val) {
27
   Wire.beginTransmission(device); //start transmission to device 
28
   Wire.write(address);        // send register address
29
   Wire.write(val);        // send value to write
30
   Wire.endTransmission(); //end transmission
31
}
32
33
void readFrom(int device, byte address, int num, byte buff[]) {
34
  Wire.beginTransmission(device); //start transmission to device 
35
  Wire.write(address);        //sends address to read from
36
  Wire.endTransmission(); //end transmission
37
  
38
  Wire.beginTransmission(device); //start transmission to device
39
  Wire.requestFrom(device, num);    // request 6 bytes from device
40
  
41
  int i = 0;
42
  while(Wire.available())    //device may send less than requested (abnormal)
43
  { 
44
    buff[i] = Wire.read(); // receive a byte
45
    i++;
46
  }
47
  Wire.endTransmission(); //end transmission
48
}
49
50
void loop()
51
{  
52
  readFrom(ACC_A, regAddress, READING, buff); //read the acceleration data from the ADXL345  
53
   //each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
54
   //thus we are converting both bytes in to one int
55
  xa = (((int)buff[1]) << 8) | buff[0];   
56
  ya = (((int)buff[3])<< 8) | buff[2];
57
  za = (((int)buff[5]) << 8) | buff[4];
58
  
59
  readFrom(ACC_B, regAddress, READING, buff); //read the acceleration data from the second ADXL345
60
  xb = (((int)buff[1]) << 8) | buff[0];   
61
  yb = (((int)buff[3])<< 8) | buff[2];
62
  zb = (((int)buff[5]) << 8) | buff[4];
63
  
64
  //we send the x y z values as a string to the serial port
65
  sprintf(str, "%d %d %d %d %d %d", xa, ya, za, xb, yb, zb); 
66
  Serial.print(str);
67
  Serial.write(15);
68
  
69
  //It appears that delay is needed in order not to clog the port
70
  delay(150);
71
}

habe den Code dabei 1:1 übernommen, Übertragung ansich funktioniert auch 
vom Sensor zum Arduino, die vom Arduino zum Computer auch plus Ausgabe 
im Format "xa, ya, za, xb, yb, zb" wobei die a- Werte für den einen und 
die b- Werte vom anderen Sensor sind. Soweit zum Stand.

Nun habe ich folgendes Problem:

Halte ich beide Sensoren gerade so sieht die Ausgabe ca. folgendermaßen 
aus von den Werten her:

Diese Werte nach oben genanntem Muster bekomme ich wenn ich beide 
Sensoren flach vor mich hin lege (Z- Achse zeigt nach oben, x und y 
Achse sind waagrecht)
"1 1 251 1 2 255"

So sieht das Bild aus wenn ich den Sensor mit der Adresse 0x53 um 90 
grad drehe (x Achse zeigt nach oben, y und z waagerecht)
"0 0 52 2 0 52"

So sieht das Bild aus wenn ich den Sensor mit der Adresse 0x1D um 90 
grad drehe (x Achse zeigt nach oben, y und z waagerecht)
"195 0 508 195 0 509"

Ich habe die Sensoren wie auf der verlinkten Seite nach dem "Super" 
Schaltplan angeschlossen. Jedoch scheint es so als ob die Sensoren sich 
bei der Datenübertragung beeinflussen. Was mir im Code auch auffält ist, 
dass bei der Funktion "readFrom" nur die Adresse des Registers für den 
das untere Byte des X- Wertes übertragen, wobei ich mich frage warum der 
Sensor/ die Sensoren trotzem alle Bytes, auch von den anderen Achsen 
überträgt. (Wobei das nur aus reiner Interesse ist. Die Daten werden ja 
übertragen also scheint es ja so ansich zu funktionieren.)

Hat vielleicht einer eine Idee was das Problem der Beeinflussung ist?

Mit freundlichen Grüßen

Hannes.

von Wolfgang (Gast)


Lesenswert?

Hannes schrieb:
> Was mir im Code auch auffält ist,
> dass bei der Funktion "readFrom" nur die Adresse des Registers für den
> das untere Byte des X- Wertes übertragen, wobei ich mich frage warum der
> Sensor/ die Sensoren trotzem alle Bytes, auch von den anderen Achsen
> überträgt.

Weil du 6 Bytes vom Device liest ;-)

Hannes schrieb:
> #define READING (6)
...
> readFrom(ACC_B, regAddress, READING, buff); //read the acceleration ...
>
> void readFrom(int device, byte address, int num, byte buff[]) {
> ...
>   Wire.requestFrom(device, num);    // request 6 bytes from device

von Hannes (Gast)


Lesenswert?

Achso,

Aber ich fordere doch die anderen Bytes garnicht an (nach Datenblatt 
wäre X0 im Register 0x32, X1 in 0x33, Y0 in 0X34 ... usw.) geht der dann 
also die Ausgaberegister trotzdem einzeln durch?

Danke aber schonmal für diese Frage :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hannes schrieb:
> geht der dann also die Ausgaberegister trotzdem einzeln durch?
Was steht denn dazu im Datenblatt?
Bei I2C Devices ist es üblich, dass eine Startadresse geschrieben wird, 
ab der die folgenden Lesezugriffe gelten. Dazwischen wird die Adresse im 
Device automatisch inkrementiert.

von Wolfgang (Gast)


Lesenswert?

Hannes schrieb:
> ... geht der dann also die Ausgaberegister trotzdem einzeln durch?

Multiple Byte Read holat alle Registerwerte nacheinander aus dem FIFO 
(Datenblatt S.18 und 21)
"Single- or multiple-byte reads/writes are supported, as shown in Figure 
41."

von Hannes (Gast)


Lesenswert?

Achso ok jetzt hab ich das auch danke.

Nun hab ich noch das Hauptproblem:

Warum hängen die Werte von einnander ab bzw. Warum beeinflussen sich die 
Sensoren? Kann mir da vielleicht einer nen Tipp geben? :)

LG

von Einer K. (Gast)


Lesenswert?

nur mal so, als Beispiel: ebay 381558532387
Gibt verschiedenste Lieferanten, Varianten...

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.