Developpez.com - Raspberry Pi

Le Club des Développeurs et IT Pro

Gérer la communication I2C entre un Raspberry Pi et un capteur grâce à Wiring Pi

Un tutoriel de Michel SEMAL

Le 2019-01-23 09:11:20, par michel.semal, Membre averti
Bonjour à tous,

Je viens de poster un petit tutoriel sur :

la communication entre un Raspberry et un module de mesure de température/humidité de type SI7021.

Ce tutoriel est créé afin de réaliser une communication avec le module SI7021 en utilisant la bibliothèque
wiringpi.

Le tutoriel propose une sortie en mode console avec les deux mesures , température et humidité, ainsi que le checksum de ces deux valeurs.
Pour les fondus de matériels, j'ai aussi traduis le code pour l'Arduino.

J'espère vous avoir avoir aidé.
N'hésitez pas à laisser un commentaire.

Michel Semal.

Le forum Raspberry Pi sur developpez.com
  Discussion forum
4 commentaires
  • f-leb
    Responsable Arduino et Systèmes Embarqués
    Salut

    J'ai repris ce Si7021 que je pilote avec une carte maître FPGA programmée en Verilog. J'ai pas mal galéré, mais j'obtiens enfin quelque chose...

    Après avoir envoyé la commande de température en mode No Hold Master (commande 0xF3), je lance et relance la commande de lecture (Setup Read 0x40). Tant que la conversion n'est pas terminée, le capteur n'acquitte pas (NAK) :


    (point vert = Start ou Start Repeating, point orange = Stop)

    Environ 7ms plus tard (conforme à la doc qui annonce 7ms typique et 10,8ms maxi), la conversion est terminée et le capteur acquitte enfin (Setup Read 0x40 + ACK):



    Il reste alors à lire les 3 octets retournés (successivement poids fort MSB, poids faible LSB, et Checksum)

    0x6034, il fait 19,2°C

    Je pourrai en dire davantage quand j'aurai fini la mise au point, je ne maîtrise pas tout encore et je ne suis pas au bout de mes peines

    extrait du code (machine à états finis en Verilog)
    Code verilog :
    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
    ... 
            s_I2C_ADRR  : // Slave Address (0x40) + Read 
              begin 
                if (!i2c_busy) begin 
                  i2c_start = 0; 
                  i2c_write = 1; 
                  i2c_data_in = I2C_ADRSi7021_Read; 
                  r_I2C_State_Next = s_I2C_MEASURE_CHECK; 
                end  
              end  
             
            s_I2C_MEASURE_CHECK : 
              begin 
                if (!i2c_busy) begin 
                  if (i2c_ack_write) begin // si NAK 
                    i2c_write = 0; 
                    i2c_start = 1; 
                    r_I2C_State_Next = s_I2C_ADRR; // si NAK, la conversion n'est pas terminée, on retourne à l'étape précédente 
                  end else 
                  begin // si AK 
                    r_I2C_State_Next = s_I2C_MEASURE;  // si AK, fin de la conversion, il faut récupérer les données de température à l'étape suivante 
                  end 
                end 
              end 
     
             
            s_I2C_MEASURE : // conversion terminée 
              begin 
                if (!i2c_busy) begin 
                  i2c_write = 0; 
                  i2c_read = 1; 
                  i2c_ack_read = 1; 
                  r_I2C_State_Next = s_I2C_READ_MSB; 
                end 
              end 
     
            s_I2C_READ_MSB : 
              begin 
              ...
  • f-leb
    Responsable Arduino et Systèmes Embarqués
    Merci Michel pour cette contribution

    C'est important la partie décodage des trames I2C à partir de la datasheet, le lecteur pourra ainsi s'adapter à tout capteur I2C, et il y en a beaucoup.

    Wiring pi est installé par défaut sur Raspbian, mais toujours en C, le lecteur peut aussi utiliser la bibliothèque bcm2835(facile à installer) et causer à son capteur en I2C.

    Et si on préfère en Python avec RPi.GPIOhttps://deusyss.developpez.com/tutor...ythonEtLeGpio/
  • Auteur
    Expert éminent sénior
    Envoyé par f-leb
    Salut

    J'ai repris ce Si7021 que je pilote avec une carte maître FPGA programmée en Verilog. J'ai pas mal galéré, mais j'obtiens enfin quelque chose...
    Hello,

    as-tu prévu un tutoriel ? J'aimerais bien connaître les cartes et logiciels que tu as utilisés. Les copies d'écran proviennent d'où ?
  • f-leb
    Responsable Arduino et Systèmes Embarqués
    Salut,

    Pour un tutoriel, il faudra attendre un peu. Il y a trop de trucs que je ne maîtrise pas bien, ça reste assez bancal pour l'instant (je n'arrive pas à faire des relevés à suivre, je suis obligé de débrancher/rebrancher la carte à chaque mesure de température, je n'arrive pas à calculer la température en °C pour l'afficher, etc. encore du boulot)

    Pour la carte FPGA utilisée voir ici, pour les copies d'écran, voir