Affichage dans le moniteur série

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

Bonjour

essayer

Serial.print(y);

pour éviter le saut de ligne après l'affichage de la valeur de y

Bonsoir, P_Lepage

#include <Wire.h>

Est-ce interdit d'avoir le contenu de :
Wire.h ?

Cordialement,
bidouilleeelec

Le fichier Wire.h est dans le sous-répertoire .../arduino-1.8.7/hardware/arduino/avr/libraries/Wire/src/. J'ai installé localement la version 1.8.7 (la préférant à celle proposée dans les dépôts de Kubuntu). J'ai joint le fichier d'entête.

Cordialement,

Pierre

Wire.h (2.62 KB)

al1fch:
Bonjour

essayer

Serial.print(y);

pour éviter le saut de ligne après l'affichage de la valeur de y

Bien vu! J'ai ajouté un tabulateur et cela donne ceci comme code.

//  Produire une sortie au format CSV.
 Serial.print(x);
 Serial.print(",");
 Serial.print("\t");
 Serial.print(y); 
 Serial.print(",");
 Serial.print("\t"); 
 Serial.println(z);

La sortie est beaucoup plus nette dans le moniteur série de l'IDE d'Arduino. Mais la sortie dans le fichier texte en passant par Processing demeure un peu du n'importe quoi! Lorsque je démarre la capture du port série par Processing, c'est comme s'il vidait un tampon dans le fichier texte et qu'ensuite le Arduino démarrait une nouvelle session (visible avec le Serial.println("Starting up L3G4200D"); ). La vidange initiale semble correcte pour la mise en forme mais pas ce qui suit le démarrage. Enfin, pour que cela soit plus clair, j'ai joint le fichier texte résultant.

Cordialement,

Pierre

GYRO_statiqueCSV.txt (469 Bytes)