DanielSan
06.03.2017, 18:30
Hallo,
ich versuche aktuell mit mittelmäßigem Erfolg den Kreiselsensor GY-50 (L3G4200) an dem Arduino Due in betrieb zu nehmen. Mit dem I2C Scanner konnte ich erfolgreich die korrekte Adresse 0x69 auslesen. An meinem Nano funktioniert der Sensor tadellos und gibt mit folgendem Sketch...
#include <Wire.h>
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23
#define CTRL_REG5 0x24
int L3G4200D_Address = 105; //I2C address of the L3G4200D
int x;
int y;
int z;
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("starting up L3G4200D");
setupL3G4200D(2000); // Configure L3G4200- 250, 500 or 2000 deg/sec
delay(1500); //wait for the sensor to be ready
}
void loop() {
getGyroValues();// This will update x, y, and z with new values
Serial.print("X:");
Serial.print(x);
Serial.print(" Y:");
Serial.print(y);
Serial.print(" Z:");
Serial.println(z);
delay(100); //Just here to slow down the serial to make it more readable
}
void getGyroValues() {
byte xMSB = readRegister(L3G4200D_Address, 0x29);
byte xLSB = readRegister(L3G4200D_Address, 0x28);
x = ((xMSB << 8) | xLSB);
byte yMSB = readRegister(L3G4200D_Address, 0x2B);
byte yLSB = readRegister(L3G4200D_Address, 0x2A);
y = ((yMSB << 8) | yLSB);
byte zMSB = readRegister(L3G4200D_Address, 0x2D);
byte zLSB = readRegister(L3G4200D_Address, 0x2C);
z = ((zMSB << 8) | zLSB);
}
int setupL3G4200D(int scale) {
//FromJim Lindblom of Sparkfun's code
// Enable x, y, z and turn off power down:
writeRegister(L3G4200D_Address, CTRL_REG1, 0b00001111);
// If you'd like to adjust/use the HPF, you can edit the line below to configure CTRL_REG2:
writeRegister(L3G4200D_Address, CTRL_REG2, 0b00000000);
// Configure CTRL_REG3 to generate data ready interrupt on INT2
// No interrupts used on INT1, if you'd like to configure INT1
// or INT2 otherwise, consult the datasheet:
writeRegister(L3G4200D_Address, CTRL_REG3, 0b00001000);
// CTRL_REG4 controls the full-scale range, among other things:
if (scale == 250) {
writeRegister(L3G4200D_Address, CTRL_REG4, 0b00000000);
} else if (scale == 500) {
writeRegister(L3G4200D_Address, CTRL_REG4, 0b00010000);
} else {
writeRegister(L3G4200D_Address, CTRL_REG4, 0b00110000);
}
// CTRL_REG5 controls high-pass filtering of outputs, use it
// if you'd like:
writeRegister(L3G4200D_Address, CTRL_REG5, 0b00000000);
}
void writeRegister(int deviceAddress, byte address, byte val) {
Wire.beginTransmission(deviceAddress); // start transmission to device
Wire.write(address);// send register address
Wire.write(val);// send value to write
Wire.endTransmission();// end transmission
}
int readRegister(int deviceAddress, byte address) {
int v;
Wire.beginTransmission(deviceAddress);
Wire.write(address); // register to read
Wire.endTransmission();
Wire.requestFrom(deviceAddress, 1); // read a byte
while (!Wire.available()) {
// waiting
}
v = Wire.read();
return v;
}
die erwarteten Zeilen auf der Seriellen Schnittstelle aus. Bei Bewegung des Sensors reagiert dieser wie erwartet. Die Werte ändern sich entsprechend, bis der Sensor keine weitere Beschleunigung erfährt.
starting up L3G4200D
X:0 Y:1 Z:0
X:0 Y:1 Z:0
X:0 Y:1 Z:0
X:0 Y:1 Z:0
X:0 Y:1 Z:0
Lade ich das gleiche Sketch in den Due bekomme ich folgende Ausgabe auf der Seriellen Schnittstelle. Die Werte reagieren auch auf Beschleunigungen aber ich erkenne keinen sinnvollen Zusammenhang.
starting up L3G4200D
X:65532 Y:65529 Z:65534
X:65535 Y:65526 Z:65533
X:1 Y:65529 Z:65533
X:1 Y:65526 Z:65535
X:65533 Y:65527 Z:65533
X:0 Y:65526 Z:65531
Ich habe jetzt drei Vermutungen entweder passt die I2C Geschwindigkeit beim Due nicht. Er Taktet ja höher und steht evtl. standardmäßig auf 400khz oder mehr? So das der Sensor damit nicht klar kommt. Oder irgendwas passt mit meinen Variablen nicht weil die Werte verdächtig nah am "überlauf" -> 2^16 sind. Oder es gibt Probleme mit der Versorgungsspannung 3,3V <-> 5V. Der Nano läuft mit 5V und der Sensor wird mit 5V versorgt. Der Due läuft mit 3,3V und der Sensor wird entsprechend mit 3,3V versorgt. Am Due habe ich SDA an Pin 20 und SCL an Pin 21 angeschlossen.
Könnt ihr mir helfen?
Vielen Dank.
Gruß Daniel
ich versuche aktuell mit mittelmäßigem Erfolg den Kreiselsensor GY-50 (L3G4200) an dem Arduino Due in betrieb zu nehmen. Mit dem I2C Scanner konnte ich erfolgreich die korrekte Adresse 0x69 auslesen. An meinem Nano funktioniert der Sensor tadellos und gibt mit folgendem Sketch...
#include <Wire.h>
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23
#define CTRL_REG5 0x24
int L3G4200D_Address = 105; //I2C address of the L3G4200D
int x;
int y;
int z;
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("starting up L3G4200D");
setupL3G4200D(2000); // Configure L3G4200- 250, 500 or 2000 deg/sec
delay(1500); //wait for the sensor to be ready
}
void loop() {
getGyroValues();// This will update x, y, and z with new values
Serial.print("X:");
Serial.print(x);
Serial.print(" Y:");
Serial.print(y);
Serial.print(" Z:");
Serial.println(z);
delay(100); //Just here to slow down the serial to make it more readable
}
void getGyroValues() {
byte xMSB = readRegister(L3G4200D_Address, 0x29);
byte xLSB = readRegister(L3G4200D_Address, 0x28);
x = ((xMSB << 8) | xLSB);
byte yMSB = readRegister(L3G4200D_Address, 0x2B);
byte yLSB = readRegister(L3G4200D_Address, 0x2A);
y = ((yMSB << 8) | yLSB);
byte zMSB = readRegister(L3G4200D_Address, 0x2D);
byte zLSB = readRegister(L3G4200D_Address, 0x2C);
z = ((zMSB << 8) | zLSB);
}
int setupL3G4200D(int scale) {
//FromJim Lindblom of Sparkfun's code
// Enable x, y, z and turn off power down:
writeRegister(L3G4200D_Address, CTRL_REG1, 0b00001111);
// If you'd like to adjust/use the HPF, you can edit the line below to configure CTRL_REG2:
writeRegister(L3G4200D_Address, CTRL_REG2, 0b00000000);
// Configure CTRL_REG3 to generate data ready interrupt on INT2
// No interrupts used on INT1, if you'd like to configure INT1
// or INT2 otherwise, consult the datasheet:
writeRegister(L3G4200D_Address, CTRL_REG3, 0b00001000);
// CTRL_REG4 controls the full-scale range, among other things:
if (scale == 250) {
writeRegister(L3G4200D_Address, CTRL_REG4, 0b00000000);
} else if (scale == 500) {
writeRegister(L3G4200D_Address, CTRL_REG4, 0b00010000);
} else {
writeRegister(L3G4200D_Address, CTRL_REG4, 0b00110000);
}
// CTRL_REG5 controls high-pass filtering of outputs, use it
// if you'd like:
writeRegister(L3G4200D_Address, CTRL_REG5, 0b00000000);
}
void writeRegister(int deviceAddress, byte address, byte val) {
Wire.beginTransmission(deviceAddress); // start transmission to device
Wire.write(address);// send register address
Wire.write(val);// send value to write
Wire.endTransmission();// end transmission
}
int readRegister(int deviceAddress, byte address) {
int v;
Wire.beginTransmission(deviceAddress);
Wire.write(address); // register to read
Wire.endTransmission();
Wire.requestFrom(deviceAddress, 1); // read a byte
while (!Wire.available()) {
// waiting
}
v = Wire.read();
return v;
}
die erwarteten Zeilen auf der Seriellen Schnittstelle aus. Bei Bewegung des Sensors reagiert dieser wie erwartet. Die Werte ändern sich entsprechend, bis der Sensor keine weitere Beschleunigung erfährt.
starting up L3G4200D
X:0 Y:1 Z:0
X:0 Y:1 Z:0
X:0 Y:1 Z:0
X:0 Y:1 Z:0
X:0 Y:1 Z:0
Lade ich das gleiche Sketch in den Due bekomme ich folgende Ausgabe auf der Seriellen Schnittstelle. Die Werte reagieren auch auf Beschleunigungen aber ich erkenne keinen sinnvollen Zusammenhang.
starting up L3G4200D
X:65532 Y:65529 Z:65534
X:65535 Y:65526 Z:65533
X:1 Y:65529 Z:65533
X:1 Y:65526 Z:65535
X:65533 Y:65527 Z:65533
X:0 Y:65526 Z:65531
Ich habe jetzt drei Vermutungen entweder passt die I2C Geschwindigkeit beim Due nicht. Er Taktet ja höher und steht evtl. standardmäßig auf 400khz oder mehr? So das der Sensor damit nicht klar kommt. Oder irgendwas passt mit meinen Variablen nicht weil die Werte verdächtig nah am "überlauf" -> 2^16 sind. Oder es gibt Probleme mit der Versorgungsspannung 3,3V <-> 5V. Der Nano läuft mit 5V und der Sensor wird mit 5V versorgt. Der Due läuft mit 3,3V und der Sensor wird entsprechend mit 3,3V versorgt. Am Due habe ich SDA an Pin 20 und SCL an Pin 21 angeschlossen.
Könnt ihr mir helfen?
Vielen Dank.
Gruß Daniel