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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 chevronné
    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
    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 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 252
    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.

  4. #4
    Membre averti
    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
    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 averti
    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
    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 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 252
    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.

+ 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