IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Capteur pression différentiel


Sujet :

Arduino

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 17
    Points
    17
    Par défaut Capteur pression différentiel
    Bonjour, j'ai une carte arduino et un capteur de pression différentiel type sdp6xx (le sdp610 précisément) et je voulais savoir comme le programmer pour permettre de récupérer la valeur de la pression mesurer. J'ai branché le SCL sur le port Analogique A5 et SDA sur A4, les deux en parallèle à une résistance de 10k pull up.
    J'ai besoin de votre avis sur mon montage, et sur comment programmer pour obtenir un résultat? J'alimente en 3.3v.
    Les librairies du sdp6xx trouver sur le web SDP6xx.cpp SDP6xx.h.
    Le datasheet : http://www.sensirion.com/fileadmin/u...sheet_V1.7.pdf
    Je suis encore novice dans ce domaine.

    Ne voyant pas comment me servir de ces libraries, j'ai testé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void setup() 
    {
      // Start serial at 9600 baud
      Serial.begin(9600); 
    }
     
        void loop() 
    {
      // Read the input on analog pin 0:
      //int sensorValue = analogRead(A4);
     int sensorValue = Sensor;
     
      // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
      float voltage = sensorValue * (3.3 / 1023.0)*10000;
      // Print out the value you read:*/
      Serial.println(voltage);  Serial.print("  ");
      Serial.println(sensorValue);
      // Wait 100 milliseconds
      delay(500);
    }
    Mais j'obtiens toujours la valeurs analogique 547/548/549/546, toujours une de ces 4 là.

  2. #2
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Bonjour,

    Pour commencer, tu lis (de façon très maladroite) une valeur analogique pour connaitre la valeur issue de ton capteur qui lui communique sur le bus numérique I²C. Avant d'aller plus loin, regarde comment mettre en place une communication entre ton Arduino et ton capteur : http://www.arduino.cc/en/Tutorial/MasterReader. Tu trouveras très certainement l'adresse de ton capteur sortie d'usine dans sa datasheet.

    Pour continuer, tu remarqueras que dans la datasheet du capteur, chapitre 5.1, tu dois convertir la valeur lue depuis ton capteur dans l'unité que tu souhaites exploiter.
    pressure = sensor output ÷ scale factor (le scale factor se trouve chapitre 2.1).

    Je pense, au vue de ton code, que tu as voulu aller beaucoup trop vite sans prendre le temps de comprendre ce que tu faisais. Essayes de lire quelques tutoriels sur la prise en main de l'Arduino en commençant avec des exemples simples (Allumer une led, lire une valeur analogique etc...)

    Cdlt, dM
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  3. #3
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Bonjour,
    Je n'utilise pas Arduino mais je te conseil vivement de suivre les conseils de deletme car avec Arduino on peut faire du prototypage rapide sans rien comprendre à ce que l'on fait.
    On peut avoir une grande impression de maîtrise tout en restant dans l'éternel amateurisme.

    Le code devrait plus ressembler à ça.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <Wire.h>
     
    // variables
       char c[2]; 
       unsigned int buffer_temporaire;
       int i ;
       float pression;
     
    void setup()
     {
       Wire.begin();        // join i2c bus (address optional for master)
       Serial.begin(9600);  // start serial for output
     }
     
    void loop()
     {
    // init variables
       c[0] = 0; c[1] = 0; 
       buffer_temporaire = 0;
       i = 0;
       pression = 0.0;
     
       Wire.requestFrom(64, 2);    // request 2 bytes from slave device #64 (voir adresse du capteur dans la datasheet, résolution 12bits)
     
       while(Wire.available())    // slave may send less than requested
       { 
          if(i < 2) // sécurité antidébordement
          {
             c[i] = Wire.read(); // receive a byte as character
             Serial.print(c[i]); / pour info avant conversion
             i+=1;
          }
       }
     
       buffer_temporaire = c[0];
       buffer_temporaire = buffer_temporaire << 8;
       buffer_temporaire += c[1];
     
    // ********** faire la conversion ici ********** 
    // pressure = sensor output ÷ scale factor (le scale factor se trouve chapitre 2.1).
    //
    // a tester  
    pression = (float)buffer_temporaire / (float)60; //SDP610 500PA
     
    // pression = (float)buffer_temporaire / (float)240; //SDP610 125PA
    //pression = (float)buffer_temporaire / (float)1200; //SDP610 25PA
     
      Serial.print(pression); 
      delay(500);
     }

    Je répète je n'ai pas Arduino donc je n'ai pas pu tester ce code (en plus je n'ai pas de compilateur sous la main pour faire un essai de principe).

    Tiens nous au courant et surtout suis le conseil de deletme.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Je pense qu'il a raison, mais avant toutes choses, quand je fais le test de l'i2c scanning, sur les ports a4 a5 pour sda/sdl, il reste bloqué sur la ligne
    error = Wire.endTransmission();, je les observé grâce au serial.print. Je devrais pouvoir identier l'adresse avec le scanner non? 64 dans la datasheet ou 0x40.
    Et une autre question comme sa, pourquoi le tableau de deux caractères? c(0) et (1)?
    Pour la prise en main de l'arduino, c'est vrai que c'est trop facile à mon goût, j'ai déjà fais des leds, dé etc.. quand j'étais gosse avec, et j'ai fais la semaine dernière un décodeur infrarouge pour créer une télécommande centrale, je m'attendais à beaucoup de code, alors que j'ai inclus une librairie et j'ai écris 5lignes ').
    Pour le moment, je pense que le gros problème est le scanner, si il ne détecte pas i2c niveau a4/a5, je peux rien faire enfaite :p?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Et merci pour le code, je l'ai testé, il est bien écris mais il bloque à Wire.requestFrom(64, 2); // request 2 bytes from slave device #64 (voir adresse du capteur dans la datasheet, résolution 12bits)
    Sans doute encore un problème vu au scanner i2c

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Effectivement si tu as problème avec l'I2C tu ne pourras pas causer avec ton capteur. Je ne pourrai pas t'aider davantage car je n'ai pas d'aduino chez moi et je ne sais pas non plus ce que c'est ce scanner I2C ?

    Pour ta question avec le tableau de char. Tout d'abord il y a plusieurs manière de faire autrement. Mais si j'ai fais ça c'est parce que ton capteur semble renvoyer une mesure sur 12 bits donc 2 octets. Seulement la fonction wire.read () retourne 1 octet et pas 2 (si mes yeux ont bien lu le lien de deleteme). Donc je stock l'octet de poids fort dans c [0] et celui de poids faible dans c [1].

    J'aurai pu aussi prendre une variable "int" de plus grande capacité et trouver un artifice dans le langage C qui permet de stocker l'octet de poids fort et m'arranger pour que l'octet de poids faible ne vienne pas l'écraser mais plutôt se mettre juste à la suite.

    Sinon tu as bien compris la philosophie d'Arduino "électronique et informatique rapide (beaucoup trop a mon goût)". Bien sûr, il ne faut tomber dans l'autre extrême en réinventant le fil à couper le beurre a chaque foid non plus, entendons nous bien.

    Si tu pousses tes connaissances plus loin dans les microcontrôleur et l'électronique en générale tu verras que c'est passionnant.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Oui effectivement, sinon pour le scanner i2c, c'est http://playground.arduino.cc/Main/I2cScanner
    Après je ne sais pas vraiment si il ne le détecte pas, ton code bloque sur le Wire.requestFrom(64, 2); mais avec mon code tous bête analogread(a4), j'arrive tous de même à obtenir un truc qui bouge quand on souffle sur le capteur(grâce à un tuyau), mais rien de correcte je pense.

  8. #8
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Avec I2C scanner ça affiche quoi ?
    Il trouve un device I2C ou pas ?

    Je viens de lire ton lien et si tu as bien câblé ton capteur normalement il doit le voir.

    Pour ton entrée analogique je te garantie que ça ne peux pas fonctionner car ton capteur est numérique. Ça reviendrai à brancher un câble réseau sur l'entrée micro, par exemple, d'une carte audio de pc. Il n'y a aucune chance que tu entendes dans les haut-parleur quelques choses de pertinent !
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Brancher la borne Sda/sdl sur A4/A5 ne marcheraient pas alors car le capteur étant digital, je devrais les connectés non sur l'analog mais sur les pin digital? C'est bien ce que tu dis? Je m'en doutais un peu au vu du titre de la datasheet et j'avais donc essayé.

  10. #10
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Je vais être plus précis.
    Ton micro Atmel à des broches configurables, elles peuvent être soient des entrées logiques soient des sorties logiques, ou des entrées analogiques ou carrément un bus I2C ou SPI, par simple configuration logiciel du micro. Si tu regardes la datasheet de ton micro Atmel tu verras ce que chaque broche sait faire.

    Si j'en crois le lien plus haut la broche SDA de ton capteur doit être connectée à la broche 4 de ton Arduino et la broche SCL du capteur à la broche 5 de Arduino. Ensuite il faut que la masse GND soit la même pour le arduino et le capteur. En ce qui concerne l'alimentation assure toi que c'est compatible car ton capteur s'alimente en 3.3V et j'espère que Arduino ne sort pas du 5V et que tu ne t'en sert pas pour alimenter le capteur sinon il est mourru !

    Ensuite il est fort probable que la fonction Wire.begin () configure les broches 4 et 5 de ton Arduino en périphérique I2C. Au quel cas elles sont plus en mode analogique mais belles et bien en numériques.

    A mon sens pour utiliser efficacement les librairies Arduino il faut savoir comment le micro fonctionne.

    Es tu sur et certain de ton câblage et des alimentations ?
    Peux tu prendre une photo de ce câblage, le genre de photo où j'arriverai à voir sur quelles broches tu es reliées ?
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Pour mon montage, j'ai tout simplement : Capteur > Vcc sur le 3.3v de l'arduino comme dit dans le ds(datasheet), le sda sur le a4 et le scl sur le a5 avec gnd sur le gnd. Les liaisons sda, scl sont toutes les deux connectés aux pin a4/a5 avec pour chaque fil une résistance de PU 4.7k en parallèle. Après j'ai récupéré la librairie sdp6xx

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Pour information, j'ai enfin réussi à détecter le capteur, enfin avec le scanner, cela ne résoud pas mes autres problèmes de code, mais sa c'est résolu. (Y se pourrai que j'ai confondu le sdp600 et 610 dans la Datasheet :p, on ne dira rien)

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    J'obtiens sa: http://prntscr.com/6xska2
    Code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    #include <Wire.h>
    #include <SDP6xx.h>
     
    void setup()
    {
      Wire.begin(); 
      Serial.begin(115200);
    }
     
     
    void loop()
    {
       Serial.println((float)SDP6xx.readPA());
       delay(100);
    }
    SDP6xx.h
    SDP6xx.cpp

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Après modification du code, j'obtiens sa : http://prntscr.com/6xt3sd
    Ceux sont des valeurs possibles non? Quand j'inspire, j'obtiens une pression de 32400 et -32400 quand j'expire.?
    Merci,

  15. #15
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    si j'en comprend la datasheet, la mesure que tu obtiens est une mesure brute. Tu dois ensuite appliquer le ScaleFactor correspondant à ton modèle (section 2.1 de la datasheet) pour obtenir la pression dans une unité connue.

    Si tu as un modèle 500Pa, il faut diviser la valeur obtenue par 60 pour l'avoir en Pascal, par 6000 pour l'avoir en mBar (et donc par 6000000 pour l'avoir en Bar).

    Sachant que 500Pa correspond à 5 mBar, ce sont des pressions quand même relativement faibles. Si tu teste avec la bouche, tu peux aller bien au delà de ces valeurs (ça dépend des personnes, mais en forçant, en aspiration on peut avoisiner le bar de dépression, en souflant, un peu moins du bar en pression)
    Les valeurs que tu lis, si c'est la mesure brute, non corrigée par le ScaleFactor, traduise simplement la saturation du capteur puisque pour 500Pa, le capteur devrait renvoyer théoriquement la valeur 30000
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Oui merci, effectivement il faut appliquer le scaledfactor pour retrouver une différence raisonnable. Grâce à vous, j'ai pu terminer mon projet en utilisant la librairie du sdp6xx. Thanks

  17. #17
    Nouveau Candidat au Club
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour

    J'essaie de mon coté d'utiliser le capteur avec une sonde pitot.

    Peux tu poster ton sketch?

    Cdlt

  18. #18
    Nouveau Candidat au Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Sketch
    Voici le code pour avoir les valeurs brutes en utilisant un capteur SDP-610 avec arduino


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <Wire.h>
     
     
    void setup()
    {
      Wire.begin(); 
      Serial.begin(115200);// mettre a jour avec le moniteur serie
    }
     
     
    void loop()
    {
     
       Serial.println((int)SDP6xx.readPA());
       delay(500);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. signal de pression pour un capteur cylindrique
    Par enami87 dans le forum MATLAB
    Réponses: 5
    Dernier message: 23/12/2012, 22h45
  2. Pression de 2 touches clavier
    Par djfab dans le forum GLUT
    Réponses: 12
    Dernier message: 24/04/2005, 14h48
  3. pression<->temperature
    Par clovis dans le forum Mathématiques
    Réponses: 7
    Dernier message: 22/04/2004, 19h47
  4. Réponses: 10
    Dernier message: 01/12/2003, 23h17
  5. pression sur la Suppr problème
    Par nicholz dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/01/2003, 19h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo