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
bytebuff[READING];
8
charstr[512];
9
10
intregAddress=0x32;//first axis-acceleration-data register on the ADXL345
11
intxa=0,ya=0,za=0;
12
intxb=0,yb=0,zb=0;
13
14
voidsetup(){
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
voidwriteTo(intdevice,byteaddress,byteval){
27
Wire.beginTransmission(device);//start transmission to device
//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.
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
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 :)
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.
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."
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