Capteur résistif : cas d’une CTN

Une CTN est un capteur résistif à coefficient de température négatif dont l’évolution de la résistance en fonction de la température est donnée par la figure suivante :

Principe de mesure d’une résistance

La plupart des modules pour capteur résistif utilise un pont diviseur de tension pour la mesure de la résistance du capteur. Par rapport au pont Wheatstone, cette méthode présente l’avantage d’être simple à mettre en oeuvre.

Montage 1

Le capteur est connecté à la masse. Il s’agit du montage le plus souvent rencontré.

Module Grove de fabrication personnelle

Montage 2

Le capteur est connecté à l’alimentation Vcc.

Module CTN Plug’uino (Sciencéthic)

Montage 3

En plus de la mesure de la tension du capteur, une mesure du courant est aussi réalisée à partir de la tension aux bornes de la résistance R par l’intermédiaire d’un amplificateur différentiel. La résistance du capteur est alors calculée avec la loi d’Ohm.

Module CTN Educaduino Lab (Eurosmart)

Mesure de la résistance de la CTN

L’ensemble formé du module pour capteur résistif et du microcontrôleur est vu comme un ohmmètre. Les programmes suivants ont donc pour objectif de mesurer la résistance de la CTN.

Arduino (Python/Nanpy)

L’entrée analogique A0 mesure la tension du capteur.

# Mesure de la résistance d'une CTN
from nanpy import ArduinoApi # Gestion de l'Arduino
from nanpy import SerialManager # Gestion port série
from time import sleep # Importation de sleep(seconde)

Vcc = 5.0 # Tension d'alimentation
Ro = 10000 # Résistance du pont

port = SerialManager(device='COM6') # Sélection du port série (à remplacer)
uno = ArduinoApi(connection=port) # Déclaration de la carte Arduino

while True :
	U = uno.analogRead(0)*5/1023 # Lecture la tension sur A0
	R = Ro*U/(Vcc-U) # Calcul de la résistance
	print("R = ", R) # Affichage
	sleep(1) # Temporisation d'une seconde

port.close() # Fermeture du port série

PyBoard (MicroPython)

Le montage ci-dessous utilise une carte Feather STM32F405 Express. L’entrée analogique A0 mesure la tension du capteur.

# Mesure de la resistance d'une CTN
from pyb import Pin, ADC, delay

adc = ADC(Pin("A0")) # Déclaration du CAN
Ro = 10e3 # Résistance série

while True:
    N = adc.read() # Mesure de la tension
    R = Ro*N/(4095-N) # Calcul de R
    print("R =", R) # Affichage
    delay(1000) # Temporisation

Micro:bit (MicroPython)

# Mesure de la resistance d'une CTN et calcul de la température
from microbit import *

Ro = 10e3 # Résistance série

while True:
	N = pin0.read_analog() # Mesure de la tension
	R = Ro*N/(1023-N) # Calcul de R
	print("R =", R) # Affichage
	sleep(1000) # Temporisation

Caractéristique R=f(T)

Courbe d’étalonnage

Les mesures suivantes peuvent être effectuées avec le microcontrôleur ou à l’ohmmètre.

Note : pour 25°C la résistance mesurée prend la valeur particulière de 10 kΩ !

Relation de Steinhart-Hart

Sur une grande plage de variation, la relation entre la température (en K) et la résistance de la CTN est :

    \[\dfrac{1}{T}=A+B\times \ln(R)+C\times (\ln (R))^3\]


A, B et C sont les coefficients de Steinhart-Hart. Ils sont donnés par le constructeur ou peuvent se déterminer expérimentalement à partir de trois points de mesure et du programme Python steinhart-hart.py.
Ce programme donne les résultats suivants :

    \[A=1,144\cdot 10^{-3}\,K^{−1} \quad B=2,078\cdot 10^{-3}\,K^{−1} \quad C=3,610\cdot 10^{-7}\,K^{−1}\]

Simplification de relation de Steinhart-Hart

Sur une plage de variation plus réduite de la température, la relation de Steinhart-Hart permet d’écrire :

    \[R \approx R_0 \times e^{\beta(\frac{1}{T}-\frac{1}{T_0})}\]


R_0 est la valeur de la résistance pour la température T_0.
\beta (en K).
Ces coefficients sont généralement donnés par le constructeur ou peuvent être déterminés par une modélisation de la caractéristique.
Le calcul de la température (en K) s’effectue à l’aide de la relation suivante :

    \[\dfrac{1}{T} = \dfrac{1}{\beta}\times\ln(\dfrac{R}{R_0})+\dfrac{1}{T_0}\]

Application : un thermomètre numérique

Il s’agit ici d’afficher par le microcontrôleur la température mesurée par la CTN à partir de la relation de Steinhart-Hart.

Arduino (Python/Nanpy)

# Mesure de la resistance d'une CTN et calcul de la température
# Calcul de la température à partir de la relation de Steinhart-Hart
from nanpy import ArduinoApi # Gestion de l'Arduino
from nanpy import SerialManager # Gestion port série
from time import sleep # Importation de sleep(seconde)
from math import log

Vcc = 5.0 # Tension d'alimentation
Ro = 10000 # Résistance du pont
A = 1.0832e-3 # Coeff. de Steinhart-Hart
B = 2.1723e-4 # ...
C = 3.2770e-7 # ...

port = SerialManager(device='COM6') # Sélection du port série (à remplacer)
uno = ArduinoApi(connection=port) # Déclaration de la carte Arduino

while True :
	U = uno.analogRead(0)*5/1023 # Lecture la tension sur A0
	R = Ro*U/(Vcc-U) # Calcul de la résistance
	T = 1.0 / (A + B*log(R) + C*log(R)**3) # Calcul de la température en Kelvin
	T = T-273.15 # Calcul de la température en Celsius
	print("R = ", R, "T = ", T) # Affichage
	sleep(1) # Temporisation d'une seconde

port.close() # Fermeture du port série

PyBoard (MicroPython)

# Mesure de la resistance d'une CTN et calcul de la température
# Calcul de la température à partir de la relation de Steinhart-Hart
from pyb import Pin, ADC, delay
from math import log

adc = ADC(Pin("A0")) # Déclaration du CAN

Ro = 10e3 # Résistance série
A = 0.0010832035972923174 # Coeff. de Steinhart-Hart
B = 0.00021723460553451255 # ...
C = 3.276999926128753e-07 # ...

while True:
    N = adc.read() # Mesure de la tension
    R = Ro*N/(4095-N) # Calcul de R
    T = 1/(A + B*log(R) + C*log(R)**3) - 273.15 # Relation de Steinhart-Hart
    print("R =", R, "T =", T) # Affichage
    delay(1000) # Temporisation

PyBoard (MicroPython)

# Mesure de la resistance d'une CTN et calcul de la température
# Calcul de la température à partir de la relation de Steinhart-Hart
from microbit import *
from math import log

Ro = 10e3 # Résistance série
A = 1.0832e-3 # Coefficients de Steinhart-Hart
B = 2.1723e-4 # ...
C = 3.2770e-7 # ...

while True:
	N = pin0.read_analog() # Mesure de la tension
	R = Ro*N/(1023-N) # Calcul de R
	T = 1/(A + B*log(R) + C*log(R)**3) - 273.15 # Relation de Steinhart-Hart
	print("R =", R, "T =", T) # Affichage
	sleep(1000) # Temporisation

En conclusion

Placer un capteur résistif (température, pression, lumière, …) dans un pont diviseur de tension reste une solution simple pour mesurer sa résistance à l’aide d’un microcontrôleur.

Pour marque-pages : Permaliens.

4 réponses à Capteur résistif : cas d’une CTN

  1. Wissam dit :

    Bonjour, je suis tombé sur votre site en cherchant comment utiliser le capteur de pression Grove sur une micro:bit.
    J’adore, merci pour ce travail!

    Pour ce qui est de la CTN, j’ai toujours utilisé le montage dans lequel elle est connectée à la bonne VCC. Y-a-t-il une raison pour laquelle le montage dans lequel elle est reliée à la masse est plus fréquemment utilisé?

    Merci d’avance.

    • Bonjour,
      Content que cela vous ait servi.
      En fait, vous avez raison, pour les CTN (et LDR) la connexion du capteur à Vcc est la plus utilisée car dans ce cas la tension augmente avec la température. Pratique pour un détection de seuil par exemple. Pour ma part, je préfère la connexion à la masse pour des raisons de sécurité : seules les broches GND et V sont accessibles. Lors d’un câblage, une mauvaise manipulation de la broche Vcc peut-être néfaste pour le microcontrôleur !

  2. Bonsoir,
    je cherche le source (Ultrasonic.cpp) modifié par eurosmart ayant la fonction get_duration() afin de le rajouter à la version officielle de Nanpy.
    Cette version est-elle compatible avec le capteur US de grove ?
    merci

    • Bonjour,
      Le capteur Ultrasonic Ranger Grove n’est pas câblé de la même manière. Un seul câble (jaune) sert de déclenchement (TRIG) et d’écho (ECHO) ! Il n’est donc pas compatible avec la librairie Educaduino Lab d’Eurosmart.

Répondre à Wissam Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *