Bonjour,
J'expérimente avec le gyroscope LG34200. Les données (x, y, z) (en dps) sont transmises sur le port série et je les vois défiler dans le moniteur série. Avec Processing et la bibliothèque "arduino", je peux capter dans un fichier texte les données du port série.
Le problème est le "formatage" tant dans le moniteur série que dans le fichier texte. Voici un bref aperçu du résultat tiré du fichier texte.
St up L3G4200D
21,-62
,63
10,-47
,77
17,-61
,89
Starting u
p L3G4200D
22,-35
,59
29,-5
1
,83
Le résultat attendu serait celui-ci:
Starting up L3G4200D
22,-35,59
29,-51,83
Le code utilisé est le suivant:
// ***** Don Luc *****
// Software Version Information
// DonLuc1802Mk03 1.0
#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(500); // Configure L3G4200 - 250, 500 or 2000 deg/sec
delay(200); //wait for the sensor to be ready
}
void loop(){
getGyroValues(); // This will update x, y, and z with new values
// Produire une sortie au format CSV.
Serial.print(x);
Serial.print(",");
Serial.println(y);
Serial.print(",");
Serial.println(z);
delay(200); //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){
// 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;
}
Lorsque je capture les données du port série par l'intermédiaire de Processing et que je les envois dans le fichier texte, j'obtiens le même résultat. C'est-à-dire, des coupures dans le texte et visiblement aléatoires. Avez-vous une idée comment résoudre ce problème?
Cordialement,
Pierre