Go Down

Topic: Probleme compas/accelerometre LSM303DLH (Read 3381 times) previous topic - next topic

bennurre

bonjour, je suis entrain de travail à la conception d'un robot pour se déplacera sur une pelouse et pour cela j'ai acheté un compas avec accéléromètre pour pouvoir le guider dans sa tache ! 

Problème: je suis allé sur le site suivant:

https://github.com/pololu/LSM303

et j'ai récupéré pas mal d'info ainsi que les bout de code pour faire des tests...

la compilation se fait très bien, mais quand je met en route le moniteur série pour lire les infos du module, rien ne se passe...
aucune info sur le moniteur et même la led de l'arduino ne clignote pas au rythme des infos envoyées...
J'ai essayé avec un UNO et un MEGA mais pas de changement. Impossible de lire aucune info sur le moniteur.

Auriez vous une idée pour me sortir de cette misère, car après 3 jours de test et bidouillage, je n'ai plus d'idée !!!

Merci d'avance !!

Have fun!

Viproz

Quel code as tu mis sur la carte ?

La librairie que tu utilise possède plusieurs exemples https://github.com/pololu/LSM303/tree/master/LSM303/examples

bennurre

salut, j'ai essayé les 3 codes et bien d'autres trouvé sur le net...  Dès que j'utilise le code du LSM303 = pas de moniteur serie....!!!  GRRRRR!!!!


#include <Wire.h>
#include <LSM303.h>

LSM303 compass;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  compass.init();
  compass.enableDefault();
}

void loop() {
  compass.read();

  Serial.print("A ");
  Serial.print("X: ");
  Serial.print((int)compass.a.x);
  Serial.print(" Y: ");
  Serial.print((int)compass.a.y);
  Serial.print(" Z: ");
  Serial.print((int)compass.a.z);

  Serial.print(" M "); 
  Serial.print("X: ");
  Serial.print((int)compass.m.x);
  Serial.print(" Y: ");
  Serial.print((int)compass.m.y);
  Serial.print(" Z: ");
  Serial.println((int)compass.m.z);
 
  delay(100);
}

bennurre

J'ai essayé une verification du port :

je mets le moniteur en marche, il cherche et dès que je branche le module il dit:

Scanning...
I2C device found at address 0x18  !
I2C device found at address 0x1E  !

mais pas "DONE" !!

et c'est tout, je pense qu'il bloque ensuite car plus d'autre scan.

(j'ai testé le le scanner avec un autre module en I2C et le scanner test en boucle et ne bloque pas et affiche "DONE" à chaque fois)

on dirai que dès que l'arduino accède au module, il freeze.

Viproz

Change les adresses dans le code de la lib, elles correspondent pas avec ton module

bennurre


Change les adresses dans le code de la lib, elles correspondent pas avec ton module


ah??

ok, mais peux tu me dire comment on fait pour les changer et où trouver les bonnes valeurs.?

merki!!

bennurre


Change les adresses dans le code de la lib, elles correspondent pas avec ton module


le code de la lib du LSM303.h est

#ifndef LSM303_h
#define LSM303_h

#include <Arduino.h> // for byte data type

// device types

#define LSM303DLH_DEVICE   0
#define LSM303DLM_DEVICE   1
#define LSM303DLHC_DEVICE  2
#define LSM303_DEVICE_AUTO 3

// SA0_A states

#define LSM303_SA0_A_LOW  0
#define LSM303_SA0_A_HIGH 1
#define LSM303_SA0_A_AUTO 2

// register addresses

#define LSM303_CTRL_REG1_A       0x20
#define LSM303_CTRL_REG2_A       0x21
#define LSM303_CTRL_REG3_A       0x22
#define LSM303_CTRL_REG4_A       0x23
#define LSM303_CTRL_REG5_A       0x24
#define LSM303_CTRL_REG6_A       0x25 // DLHC only
#define LSM303_HP_FILTER_RESET_A 0x25 // DLH, DLM only
#define LSM303_REFERENCE_A       0x26
#define LSM303_STATUS_REG_A      0x27

#define LSM303_OUT_X_L_A         0x28
#define LSM303_OUT_X_H_A         0x29
#define LSM303_OUT_Y_L_A         0x2A
#define LSM303_OUT_Y_H_A         0x2B
#define LSM303_OUT_Z_L_A         0x2C
#define LSM303_OUT_Z_H_A         0x2D

#define LSM303_FIFO_CTRL_REG_A   0x2E // DLHC only
#define LSM303_FIFO_SRC_REG_A    0x2F // DLHC only

#define LSM303_INT1_CFG_A        0x30
#define LSM303_INT1_SRC_A        0x31
#define LSM303_INT1_THS_A        0x32
#define LSM303_INT1_DURATION_A   0x33
#define LSM303_INT2_CFG_A        0x34
#define LSM303_INT2_SRC_A        0x35
#define LSM303_INT2_THS_A        0x36
#define LSM303_INT2_DURATION_A   0x37

#define LSM303_CLICK_CFG_A       0x38 // DLHC only
#define LSM303_CLICK_SRC_A       0x39 // DLHC only
#define LSM303_CLICK_THS_A       0x3A // DLHC only
#define LSM303_TIME_LIMIT_A      0x3B // DLHC only
#define LSM303_TIME_LATENCY_A    0x3C // DLHC only
#define LSM303_TIME_WINDOW_A     0x3D // DLHC only

#define LSM303_CRA_REG_M         0x00
#define LSM303_CRB_REG_M         0x01
#define LSM303_MR_REG_M          0x02

#define LSM303_OUT_X_H_M         0x03
#define LSM303_OUT_X_L_M         0x04
#define LSM303_OUT_Y_H_M         -1   // The addresses of the Y and Z magnetometer output registers
#define LSM303_OUT_Y_L_M         -2   // are reversed on the DLM and DLHC relative to the DLH.
#define LSM303_OUT_Z_H_M         -3   // These four defines have dummy values so the library can
#define LSM303_OUT_Z_L_M         -4   // determine the correct address based on the device type.

#define LSM303_SR_REG_M          0x09
#define LSM303_IRA_REG_M         0x0A
#define LSM303_IRB_REG_M         0x0B
#define LSM303_IRC_REG_M         0x0C

#define LSM303_WHO_AM_I_M        0x0F // DLM only

#define LSM303_TEMP_OUT_H_M      0x31 // DLHC only
#define LSM303_TEMP_OUT_L_M      0x32 // DLHC only

#define LSM303DLH_OUT_Y_H_M      0x05
#define LSM303DLH_OUT_Y_L_M      0x06
#define LSM303DLH_OUT_Z_H_M      0x07
#define LSM303DLH_OUT_Z_L_M      0x08

#define LSM303DLM_OUT_Z_H_M      0x05
#define LSM303DLM_OUT_Z_L_M      0x06
#define LSM303DLM_OUT_Y_H_M      0x07
#define LSM303DLM_OUT_Y_L_M      0x08

#define LSM303DLHC_OUT_Z_H_M     0x05
#define LSM303DLHC_OUT_Z_L_M     0x06
#define LSM303DLHC_OUT_Y_H_M     0x07
#define LSM303DLHC_OUT_Y_L_M     0x08

class LSM303
{
  public:
    typedef struct vector
    {
      float x, y, z;
    } vector;

    vector a; // accelerometer readings
    vector m; // magnetometer readings
    vector m_max; // maximum magnetometer values, used for calibration
    vector m_min; // minimum magnetometer values, used for calibration

    byte last_status; // status of last I2C transmission
   
    // HEX  = BIN          RANGE    GAIN X/Y/Z        GAIN Z
    //                               DLH (DLM/DLHC)    DLH (DLM/DLHC)
    // 0x20 = 0b00100000   ±1.3     1055 (1100)        950 (980) (default)
    // 0x40 = 0b01000000   ±1.9      795  (855)        710 (760)
    // 0x60 = 0b01100000   ±2.5      635  (670)        570 (600)
    // 0x80 = 0b10000000   ±4.0      430  (450)        385 (400)
    // 0xA0 = 0b10100000   ±4.7      375  (400)        335 (355)
    // 0xC0 = 0b11000000   ±5.6      320  (330)        285 (295)
    // 0xE0 = 0b11100000   ±8.1      230  (230)        205 (205)
    enum magGain { magGain_13 = 0x20, magGain_19 = 0x40, magGain_25 = 0x60, magGain_40 = 0x80,
                   magGain_47 = 0xA0, magGain_56 = 0xC0, magGain_81 = 0xE0 };

    LSM303(void);
   
    void init(byte device = LSM303_DEVICE_AUTO, byte sa0_a = LSM303_SA0_A_AUTO);
    byte getDeviceType(void) { return _device; }
   
    void enableDefault(void);
   
    void writeAccReg(byte reg, byte value);
    byte readAccReg(byte reg);
    void writeMagReg(byte reg, byte value);
    byte readMagReg(int reg);

    void setMagGain(magGain value);
   
    void readAcc(void);
    void readMag(void);
    void read(void);

    void setTimeout(unsigned int timeout);
    unsigned int getTimeout(void);
    bool timeoutOccurred(void);
   
    int heading(void);
    int heading(vector from);
   
    // vector functions
    static void vector_cross(const vector *a, const vector *b, vector *out);
    static float vector_dot(const vector *a,const vector *b);
    static void vector_normalize(vector *a);
   
  private:
    byte _device; // chip type (DLH, DLM, or DLHC)
    byte acc_address;
    unsigned int io_timeout;
    bool did_timeout;
   
    byte detectSA0_A(void);
};

#endif




-Standby

Prend toi 5min li la datasheet du composant et cherche l'erreur..
The Mind is like a parachute it works best when opened.

bennurre


Prend toi 5min li la datasheet du composant et cherche l'erreur..


OK, mission accomplie, j'ai regardé ( je n'ai pas dit: compris!!! lol) les 47 pages du datasheet mais je n'ai pas vu où été mon bonheur!

pourrais tu me donner un indice, du genre la page où ta trouvé la réponse, que j'arrive à comprendre...

et une fois trouvé, comment fait on pour changer l'adressage.?  merci !!


-Standby

les choses importantes commence page 24, le .ccp va te permettre de savoir commet la librairie marche c'est important d'y jeter un coup d'oeil aussi !
The Mind is like a parachute it works best when opened.

bennurre


les choses importantes commence page 24, le .ccp va te permettre de savoir commet la librairie marche c'est important d'y jeter un coup d'oeil aussi !


effectivement, il y a plein de chose intéressante, mais c'est trop trop complexe pour mon niveau!! je te donne ma langue au chat !

bennurre

avec le scanner I2C:

sans resistance de pullup le moniteur serie plante.

avec deux resistance de pullup, il affiche ceci...


I2C Scanner
Scanning...
I2C device found at address 0x18  !
I2C device found at address 0x1E  !
Unknow error at address 0x46
done

Scanning...
I2C device found at address 0x18  !
I2C device found at address 0x1E  !
Unknow error at address 0x4B
done

Scanning...
I2C device found at address 0x18  !
I2C device found at address 0x1E  !
Unknow error at address 0x44
done

Scanning...
I2C device found at address 0x18  !
I2C device found at address 0x1E  !
Unknow error at address 0x43
done

Scanning...
I2C device found at address 0x18  !
I2C device found at address 0x1E  !
Unknow error at address 0x46
Unknow error at address 0x7B
done

Scanning...
I2C device found at address 0x18  !
I2C device found at address 0x1E  !
Unknow error at address 0x43
done

Scanning...
I2C device found at address 0x18  !
I2C device found at address 0x1E  !
Unknow error at address 0x44
done

etc....

Go Up