Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Capteurs > Capteurs d’environnement > Capteur de température I2C

Capteur de température I2C

vendredi 2 janvier 2009, par Julien H.

  Sommaire  

Rien de bien compliqué avec le capteur LM75 qu’on va utiliser dans ce petit projet. C’est un composant I2C, qui retourne une valeur numérique de la température ambiante. Il n’est pas très précis (0,5 °C) ni très fiable (+/- 2 °C) mais peut s’avérer pratique.

PNG - 201.5 ko
Capteur LM75 en boîtier SO08
merci à Julian Lange : on se rend compte sur sa photo que le capteur est très petit.

Sur un robot, ce type de petit capteur peut servir à vérifier que la température n’augmente pas dangereusement à l’intérieur de la machine, près des moteurs ou des cartes de puissance, surtout si vous avez fait tous vos tests dans une pièce aérée [1], en vous arrêtant toutes les 2 minutes pour coder pendant 10 minutes :) et les cartes électroniques fixées de manière temporaire, et si ensuite vous équipez votre robot d’un carter fermé et que vous le faites tourner pendant 18 heures d’affilée sous les projecteurs de télé d’une compétition !

On va même pouvoir déclencher un arrêt automatique ou activer un ventilateur sans aucun programme car le circuit est équipé d’une sortie "thermostat" qui s’active quand vous dépassez une certaine valeur (modifiable par la liaison I2C) et qui ne se coupe qu’en dessous d’une seconde valeur (principe d’hystérésis), il serait dommage de s’en priver !

Plus de détail dans la datasheet.

PDF - 737.6 ko
Datasheet LM75
capteur de température de National Semiconductor

 Hardware

Pour nos tests, on va utiliser une petite carte à 10 euros fournie par Devtronic (myTWI temperatur-sensor) qui intègre le capteur et toute l’électronique nécessaire :
- résistances de pull-up (ici, 10 kOhms)
- cavaliers pour changer l’adresse I2C
- led indicatrice du thermostat
- connecteur pour un système à déclencher par le thermostat
- connecteurs pour se brancher sur une carte (myAVR ou autre)

PNG - 665.1 ko
Platine I2C "capteur de température"
Selon le modèle des cartes d’extension myTWI.
PDF - 623.8 ko
Doc technique de la carte myTWI

Si vous voulez faire votre propre carte, il n’est pas très cher, on le trouve pour un peu plus de 2 euros chez Gotronic sous la référence LM75CIM-5. Mais en package CMS SO08 et c’est pas forcément facile pour faire des tests rapides.

 Software

On va d’abord s’intéresser très simplement à lire la température. Les seules informations nécessaires sont :
- l’adresse I2C
- le registre à interroger pour lire la température
- le nombre d’octets à recevoir
- le format de la température pour un éventuel décodage.

Adresse I2C

La datasheet nous renseigne sur le format de l’adresse. Celle-ci est de 7 bits sur ce type de capteur I2C standard : une partie fixe 1 0 0 1 et une partie configurable avec les 3 entrées logiques disponibles sur le circuit. Avec nos 3 jumpers positionnés à 0, on a donc une adresse I2C égale à 1001000 en binaire, ou 0x48 en hexadécimal.

Nous reviendrons sur cette adresse lors de l’écriture du programme, car c’est un point sensible selon la bibliothèque de communication I2C qu’on utilise.

Registre de lecture

Il s’agit du registre d’adresse 00. Par défaut (à la mise sous tension), le pointeur de registre du circuit LM75 est positionné dessus.

Nombre d’octets

Deux octets sont utilisés pour représenter la température. Cela ne signifie pas qu’on dispose d’une information avec 16 bits de précision, car tous les bits ne sont pas significatifs. De toute façon, le circuit LM75 utilise un convertisseur analogique numérique qui a une précision de 9 bits, donc nous serons limités "par construction".

On appellera "msb" le premier octet reçu et "lsb" le second octet reçu. Attention, même si le second octet ne contient que la virgule (.5 ou .0 °C) et que vous ne comptez pas l’utiliser, ne comptez pas économiser la lecture de ce second octet, auquel cas le circuit pourrait se retrouver bloquer (pas définitivement, puisqu’au bout de 9 cycles d’horloge SCL il s’aperçoit du problème) mais suffisamment pour causer du tord à votre bus I2C ou à votre programme.

Format et décodage de la température

Dans la datasheet, on apprend que l’octet "msb" est codé en complément à deux ou "two’s complement" en anglais. C’est un format pratique en électronique pour faire des opérations arithmétiques et toute sorte de fonctions de l’algèbre de Boole. D’ailleurs on apprend ce format dans tout cours d’électronique. En complément à 2, on compte les nombres positifs de manière normale 0000, 0001, 0002, 0003 et on compte à rebours les nombres négatifs : 1111 pour -1, 1110 pour -2, etc... jusqu’à la moitié des nombres disponibles (0111 est le maximum positif et 1000 est le maximum négatif, soit 127 et -128).

Heureusement c’est le format utilisé par les microcontrôleurs AVR donc pas de problème particulier. Par contre pour la virgule il va falloir manipuler les octets.

 Tests

Première version

Voici le code d’une version utilisant uniquement des valeurs entières pour la température (cela prends moins de place au stockage si on a pas besoin du demi-degré).

/**
 * Lecture de la température sur le LM75
 */

int lireTemperature(void)
{      
        int multiplicateur; // un multiplicateur pour le signe
       
        u08 msb = 0; // premier octet (poids le plus fort)
        u08 lsb = 0; // second octet (poids le plus faible)
       
        // Lecture I2C
        cmd[0] = 0x00;  // registre 00  
        cmdSize = 1;    // 1 seul octet à envoyer
       
        // TEMP_ADDRESS = 0x90 car pour AVRlib il faut ajouter le 0 à la fin
        // donc on passe de 100 1000 (0x48) à 1001 0000 (0x90)
        i2cMasterSend(TEMP_ADDRESS,cmdSize,cmd);                                       
        i2cMasterReceive(TEMP_ADDRESS,2,cmd);
       
        msb = cmd[0];
        lsb = cmd[1];
       
        // Récupération et retrait du bit de signe
        if (msb & 0x80) {
                // en complément à 2, le bit de poids le plus fort à 1 signifie nombre négatif
                multiplicateur = -1;
        } else {
                multiplicateur = 1;
        }
        msb = msb & 0x7F;
       
        // Calcul température (première version, pas de virgule)
        return ((msb << 1)/2) * multiplicateur;
       
}

Seconde version

Pour pouvoir envoyer la virgule, il va falloir ruser. Notamment, il est très judicieux de ne pas gérer de nombre décimal.


[1ou comme nous dans un garage un peu frais, souvenirs souvenirs

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document