Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] D6F-PH0025AD1 (i2c)

Sujet résolu
    9 mai 2015 à 9:46:18

    Bonjour,

    je réalise un projet de tunnel aérodynamique c'est pourquoi afin de capter la vitesse du flux d'air j'ai décidé d'utiliser un tube de pitot et donc d'un capteur de pression différentiel. Dans mon programme j'utilise aussi un capteur de température afin de calculer la masse volumique de l'air.

    bref voici mon programme :

    #include "Wire.h"
    #define addrs 0x6C // I2C bus address
    int P;
    int I;
    float T;
    float temp; // intitialisation de la varriable
    int tempPin = 0;
    float rho;
    float q;
    
    void setup()
    {  // Open serial communications 
      Serial.begin(9600);
      Wire.begin();
      I = initialize(addrs); // start wire connection
    
    }
    int initialize(int i2c_addr)
    
    {
      
      //INITIALIZATION AFTER POWER UP
      Wire.beginTransmission(i2c_addr);
      Wire.write(0x0B);  
      Wire.write(0x00); 
      int x = Wire.endTransmission(); 
      return x;
    }
    
    int pressure(int i2c_addr)
    {
      //MCU MODE
      Wire.beginTransmission(i2c_addr);
      Wire.write(0x00);   
      Wire.write(0xD0);  // reg 0 - address register high byte 
      Wire.write(0x51);  // reg 1 - address register low byte
      Wire.write(0x40);  // reg 1 - address register low byte
      Wire.write(0x18);  // reg 2  - serial control register - indicate # bytes among others (page 7 bottom)
      Wire.write(0x06);  // reg 3 - value to be written to SENS control register
      int x = Wire.endTransmission(); 
    
      delay(33);
    
      //WRITE
      Wire.beginTransmission(i2c_addr);
      Wire.write(0x00);   
      Wire.write(0xD0);
      Wire.write(0x51);
      Wire.write(0x2C);
      x = Wire.endTransmission(); 
      
      //READ
      Wire.beginTransmission(i2c_addr);
      Wire.write(0x07);
      x = Wire.endTransmission(); 
    
      Wire.requestFrom(i2c_addr, 2);
      byte hibyte = Wire.read();
      byte lobyte = Wire.read();
      long raw = word( hibyte, lobyte);  
      //Serial.print("raw pressure:\t ");
      //Serial.println(raw); 
      
      // D6F-PH5050AD3 ==> rangeMode=500 ==> int rd_pressure =  ((raw - 1024) * rangeMode * 2 / 60000L) - rangeMode
      // D6F-PH0505AD3 ==> rangeMode=50  ==> int rd_pressure =  ((raw - 1024) * rangeMode * 2 / 60000L) - rangeMode
      // D6F-PH0025AD1 ==> rangeMode=250 ==> int rd_pressure=(raw - 1024) * rangeMode / 60000L
      int rangeMode = 250;
      int rd_pressure =((raw - 1024) * rangeMode / 60000);
      return rd_pressure;
    }
    
    
    
    
    void loop()
    {
      temp = analogRead(tempPin);
      temp = temp * 0.48828125; // conversion temperature en celcius
      temp = temp + 273.15; // conversion en kelvin
      Serial.print("TEMP = "); // affichage de la temperature 
      Serial.print(temp);
      Serial.print("*");
      Serial.println();
      Serial.print("rho = ");
      rho = 1.292 * 273.15 / temp; // calcul de la masse volumique de l'air
      Serial.print(rho);
      Serial.println();
      Serial.print("--------------------");
      Serial.println();
      q = 0.5 * rho;
      delay(1000); // 1 seconde 
      P=pressure(addrs);
      Serial.print("pressure:\t ");
      Serial.println(P);
      delay(10000); //delay for 10 seconds
    
    }


    le problème est qu'il n'affiche pas la pression régulièrement dans le moniteur série. Je suis obligé de "jouer" avec le câble d'alimentation pour avoir une valeur.

    Pour info je me suis (grandement) inspiré de  http://forum.arduino.cc/index.php?topic=285116.0 pour le programme

    datasheet : http://www.omron.com/ecb/products/pdf/en-d6f_ph.pdf

                    http://www.mouser.com/pdfdocs/ApplicationNotes_Diff_Pressure_Sensor_App_note_D6FPH_Rev_1.pdf

    photo du projet :

     

    merci d'avance 

    -
    Edité par MeFreeze 9 mai 2015 à 9:47:32

    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2015 à 11:07:08

      MeFreeze a écrit:

      le problème est qu'il n'affiche pas la pression régulièrement dans le moniteur série. Je suis obligé de "jouer" avec le câble d'alimentation pour avoir une valeur.

      Pour info je me suis (grandement) inspiré de  http://forum.arduino.cc/index.php?topic=285116.0 pour le programme

      Que veux tu dire par "régulièrement" et "jouer avec le câble d'alimentation" ?

      Tu code est censé afficher température/pression toutes les 11.5 secondes, ce n'est pas le cas ?

      -
      Edité par lorrio 9 mai 2015 à 11:07:30

      • Partager sur Facebook
      • Partager sur Twitter
        9 mai 2015 à 11:16:20

        Si théoriquement mais cela n'arrive quasiment jamais. Or quand je déconnecte puis reconnecte l'alimentation de mon capteur j'obtiens une valeur de pression  puis plus rien ... (et encore pas toujours)

        -
        Edité par MeFreeze 9 mai 2015 à 11:19:05

        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2015 à 11:29:14

          Sur ta photo, je ne vois pas les résistance de pull-up de 2.2k pour le bus I2C, ne les aurais tu pas oubliées ?

          -
          Edité par lorrio 9 mai 2015 à 11:29:53

          • Partager sur Facebook
          • Partager sur Twitter
            9 mai 2015 à 11:35:24

            oui, je ne savais pas. Cela peut expliquer le problème ?
            • Partager sur Facebook
            • Partager sur Twitter
              9 mai 2015 à 11:53:04

              Oui, cela peut expliquer le problème.

              Une bus I2C a impérativement besoin de résistance de pull-up pour fonctionner correctement.

              Sans ces résistances, il peut y avoir énormément d'erreur de communication sur le bus.

              • Partager sur Facebook
              • Partager sur Twitter
                9 mai 2015 à 13:40:56

                ok, je vais essayer de trouver des résistances de 2.2 k ohms et voir si ça règle le problème. Merci
                • Partager sur Facebook
                • Partager sur Twitter
                  27 mai 2015 à 14:26:59

                  c'était bien les résistances pull up , merci
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 mai 2015 à 15:43:36

                    Eh oui, un bus I2C sans résistance de pull-up, ça marche beaucoup moins bien.

                    Bonne continuation pour ton projet ;)

                    • Partager sur Facebook
                    • Partager sur Twitter

                    [Arduino] D6F-PH0025AD1 (i2c)

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown