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

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Gérer la communication I2C entre un Raspberry Pi et un capteur grâce à Wiring Pi
Un tutoriel de Michel SEMAL

Le , par michel.semal

11PARTAGES

16  0 
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

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de f-leb
Responsable Arduino et Systèmes Embarqués https://www.developpez.com
Le 26/04/2021 à 22:53
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 : Sélectionner tout
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 
          ...
2  0 
Avatar de f-leb
Responsable Arduino et Systèmes Embarqués https://www.developpez.com
Le 25/01/2019 à 21:50
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/
1  0 
Avatar de Auteur
Expert éminent sénior https://www.developpez.com
Le 27/04/2021 à 18:21
Citation Envoyé par f-leb Voir le message
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ù ?
0  0 
Avatar de f-leb
Responsable Arduino et Systèmes Embarqués https://www.developpez.com
Le 27/04/2021 à 21:08
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
0  0