Lecture de températures avec un DS18B20

1.1.1        La théorie

Le but de ce projet sera de lire une température via le Raspberry.

Il y a plein de moyens de faire ça, soit avec des composants soit avec des modules assurant cette fonction, soit en analogique, soit en numérique.

Par exemple :

-         Le module gyroscope et accéléromètre MPU6050 comporte un thermomètre accessible en I2C

-         Le module Sens Hat a également un thermomètre accessible en I2C

-         A l’ancienne, une résistance CTN couplée à un convertisseur analogique digital permet de mesurer une température

Pour ne pas refaire des choses déjà faite et pour apprendre à utiliser un nouveau bus du Raspberry, Je vais utiliser ici un Dallas DS18B20.

Ce composant utilise le bus numérique 1-wire et permet de mesurer des températures entre -55° et 125° Celsius. La précision est de 0.5° entre -10° et 85° et de 2° pour le reste de la plage de mesure. Son câblage est très simple avec deux ou trois fils.

Si vous avez le composant seul, il demande une résistance de 4700Ω entre le fils de donnée et la masse afin de minimiser les parasites. Il y a pleins de sites sur Internet qui explique cela.

De mon côté, je me suis acheté des petits modules déjà pré-câblés que l’on trouve pour environ 1.5€ sur EBay.


 

1.1.2        Activation du bus 1-wire

Par défaut, le bus 1-wire du Raspberry est désactivé.

Afin de le vérifier, il suffit d’aller dans le répertoire /sys/bus et voir si quelque chose parle de 1-wire

Pour le configurer, je vais faire comme pour les autres bus avec l’utilitaire raspi-config

L’option 5 Interfacing Options (dans les dernières versions de l’utilitaire ça a changé, avant c’était Advanced Options)

P7 1-Wire

On demande l’activation de l’interface

Un message qui nous indique que l’interface est activée

On sort de l’utilitaire

Et on reboot

Une petite vérification indique qu’il y a bien un nouveau bus qui s’appelle w1

Si rien n’est branché sur le bus, il n’y a que le device w1_bus_master1 qui correspond au maitre, c’est-à-dire le Raspberry ainsi que des périphériques 00-x00000000000 semblant indiquer que rien n’est branché. Je n’ai rien trouvé de probant sur Internet au niveau de la signification de ces faux périphériques, mais ça semble normal.


 

1.1.3        L’électronique

Le bus 1-wire peut être utilisé soit sur trois broches : Une alimentation, une masse et une de donnée, voir même sur seulement deux broches dans un mode appelé parasite. Dans ce cas, il n’y a qu’une masse et une broche de données. Le principe étant qu’avant une mesure, la broche de donnée se met à l’état haut permettant la charge d’un condensateur qui alimentera le composant pendant le temps de la mesure.

Par défaut, le driver 1-wire utilise la broche GPIO-04 du Raspberry comme broche de données. Il semblerait qu’il soit possible de modifier cette broche en utilisant un driver spécial ou en allant bricoler le noyau linux. Il serait également possible de gérer plusieurs interfaces 1-wire sur plusieurs broches GPIO. Je vais éviter cela et me contenter de cette broche.

De toute façon, l’interface 1-wire peut adresser plusieurs périphériques, il n’y a pas besoin d’avoir une broche par périphériques. Le driver semble indiquer qu’on peut brancher jusqu’à 64 périphériques.

Il y a également quelques informations très importantes dans le Datasheet du DS18S20

En page 2, il y a un tableau des caractéristiques électriques

Le Supply Voltage indique que le composant peut être alimenté entre 3 et 5.5V

Le Pullup Supply Voltage est généralement identique au Supply Voltage (il est rare d’utiliser deux alimentations pour ce genre de module). Malgré la résistance entre cette tension et la ligne de données qui doit normalement faire 4700Ω (10kΩ sur mon module) il y a un petit risque que la broche de données GPIO04 reçoive plus de 3.3V si le module est alimenté en 5V, il vaut donc mieux alimenter le composant en 3.3V.


 

En page 5, un diagramme montre que le module utilise des registres internes et de la mémoire.

En particulier une mémoire tampon (Scratchpad ou bloc note en français).

Il y a également une EEPROM qui permet de mémoriser une mesure, mais elle ne semble pas être utilisable avec le driver du Raspberry.

Toutefois, si vous réussissez à l’utiliser, attention, elle n’est garantie que pour 50000 écritures, pas plus, mais elle gardera une valeur en mémoire au moins 10 ans.


 

Pour mon module, le câblage est simple, la broche VCC sur une alimentation 3.3V du Raspberry, la broche GND sur une masse et la broche DQ sur la GPIO04 (Comme d’habitude, éviter de câbler avec le Raspberry alimenté)

Si vous n’avez que le composant, ne pas oublier la résistance de 4700Ω entre VPU (VDD) et la broche de données (DQ) (Voir schéma un peu plus haut)

Après allumage du Raspberry, on a un nouveau device et on a perdu les devices parasites

Le numéro 28-0416525590ff correspond à l’identifiant de mon composant. Le 28 sera toujours là, mais le reste du numéro correspond à l’identifiant 64 bits du composant. Le constructeur garantie qu’il est unique, il ne peut pas y avoir de doublon. Le 28 correspond bien à un Dallas DS18B20, sur  la liste des composants.

Si on descend dans l’arborescence, c’est là que ça devient intéressant

Trois pseudos fichiers nous donnent de précieuses informations

Le name qui donne le nom du composant (même si on l’a déjà)

Le uevent qui donne des informations d’identification encore plus précise

Et surtout le w1_slave dont la lecture lance une mesure et qui indique si la mesure est correcte et la température mesurée en millième de degré (même si on n’a qu’une précision de 0.5°)

(Le répertoire power ne donne rien d’intéressant)

Pour câbler plusieurs modules, il suffit de mettre toutes les broches en parallèle.

Ici, une copie d’écran avec trois modules.


 

1.1.4        Le logiciel

Le vieil adage qui dit que sur Unix/Linux tout est fichier s’applique ici à la lettre, il va suffire d’aller lire le fichier w1_slave pour connaitre la température mesurée.

Comme d’habitude, une petite classe va permettre d’implémenter tout ça pour une utilisation plus facile.

En fait, il va y avoir plusieurs classes, voici la liste des fichiers avec leur utilisation :

Fichier

Utilisation

Gestion1Wire.h

Fichier d’entête de la classe gérant le bus 1-wire.

Gestion1Wire.cpp

Classe gérant le bus 1-wire. Dès l’appel du constructeur, la classe scan tous les périphériques présents sur le bus.

GestionSlave1Wire.h

Fichier d’entête de la classe gérant les périphériques.

GestionSlave1Wire.cpp

Classe gérant les périphériques. Cette classe implémente un périphérique virtuel qui permet d’avoir un prototype commun pour tous les périphériques du bus. Toutes les classes des périphériques doivent dériver de cette classe virtuelle.

GestionDS18B20.h

Fichier d’entête de la classe gérant le DS18B20

GestionDS18B20.cpp

Classe gérant le DS18B20. Elle dérive de la classe GestionSlave1Wire avec la gestion spécifique des températures.

MesureDS18B20.h

Fichier d’entête de la classe gérant les mesures de température.

MesureDS18B20.cpp

Classe gérant les mesures de température.

tst1Wire.cpp

Le fichier de test des classes ci-dessus.

 


 

La liste des fichiers, la commande de compilation et l’exécution du programme de test.


 

1.1.5        Liste des programmes

https://github.com/montotof123/raspberry/blob/master/260_DS18B20/Gestion1Wire.cpp

https://github.com/montotof123/raspberry/blob/master/260_DS18B20/Gestion1Wire.h

https://github.com/montotof123/raspberry/blob/master/260_DS18B20/GestionDS18B20.cpp

https://github.com/montotof123/raspberry/blob/master/260_DS18B20/GestionDS18B20.h

https://github.com/montotof123/raspberry/blob/master/260_DS18B20/GestionSlave1Wire.cpp

https://github.com/montotof123/raspberry/blob/master/260_DS18B20/GestionSlave1Wire.h

https://github.com/montotof123/raspberry/blob/master/260_DS18B20/MesureDS18B20.cpp

https://github.com/montotof123/raspberry/blob/master/260_DS18B20/MesureDS18B20.h

https://github.com/montotof123/raspberry/blob/master/260_DS18B20/tst1Wire.cpp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Lien vers la base du site.