Pilote logiciel (Driver) d'un module de mesure de luminosité VEML-7700 pour Pico

Le composant MAX-31865 permet des mesures de température de relativement bonne précision par l'utilisation d'une sonde platine (RTD). Ce petit pilote pour le pico permet de simplifier son utilisation.

Installation

Commencez par télécharger le fichier suivant : Driver_MAX31865.tar.gz


Copier le fichier téléchargé vers le répertoire "/home/pi" puis extraire ce fichier. L'extraction créera un répertoire nommé "Driver_MAX31865" :


tar zxvf Driver_MAX31865.tar.gz


Le répertoire "Driver_MAX31865" contiendra la code source sous la forme d'un fichier d'entête et d'un fichier source nommés "max31865.h" et "max31865.cpp". Il contient également un fichier nommé "CMakeLists.txt" et un programme d'exemple "temp31865.cpp".


Si vous souhaitez modifier le code source, je vous conseille de créer un autre répertoire et d'y copier le contenu du répertoire "/home/pi/Driver_MAX31865" vers un autre répertoire. Cela vous évitera de "polluer" le répertoire "/home/pi/Driver_MAX31865" et de conserver une version d'origine du code source.

Utilisation

Classe CMAX31865


Le pilote logiciel MAX31865 est implémentée sous la forme d'une classe nommée CMAX31865. Cette classe est classique et son utilisation est standard. L'exemple suivant montre comment instancier un objet de cette classe pour un MAX31865 installé sur le bus spi0 avec les broches GP6, GP7, GP8 et GP9 pour les lignes SPI SCK, TX, RX et CS :


  CMAX31865* pMAX;
  pMAX = new CMAX31865(spi0, 6, 7, 8, 9);

A propos du composant MAX31865


Ce chip fonctionne selon 2 modes de lecture de la température. En mode continu ou en mode one shot. Cette classe utilise le mode one shot qui permet un contrôle plus précis de l'instant auquel sont faites les mesures.

Ce chip est relativement mal documenté... ou alors j'ai raté des trucs !

Tout d'abord, lors d'une lecture sur le bus SPI, il retourne toujours un octet à 0x00 avant de renvoyer les données demandées. Je n'ai pas vu ce "détail" dans la documentation. Donc pour le lire, il vaut mieux lire tous les registres d'un seul coup, tout en lisant un octet de plus que ce que l'on attend. Avec la librairie bcm2835, cela impose d'envoyer d'abord 8 octets tous à 0, puis de lire 9 octets, on se retrouve alors avec le tableau suivant :

 - Element 0 : Octet à 0 inutile et bon à jeter
 - Element 1 : Valeur courante du registre de configuration : Sa valeur doit être celle appliquée lors de l'initialisation ou d'un trig sauf le bit D1 qui est alors à 0.
 - Element 2 : MSB de la mesure.
 - Element 3 : LSB de la mesure.
 - Elements 4 à 7 : Registres de fautes, non utilisés par cette classe.
 - Element 8 : Registre de faute d'état.

Voir le code de la méthode readRawADC pour l'implémentation de tout cela.

Autre pépin, visiblement non documenté, la broche DRDY qui devrai indiquer que la mesure est prête à être lue semble ne pas fonctionner en mode one shot. Seule façon de lire la bonne mesure.... attendre un délai entre la méthode trig et la méthode readRawADC. La valeur de ce délai ???? 52 ms si on utilise un réseau 60 Hz (et donc un filtre à 60 Hz), 62,5ms pour le 50 Hz. A ces valeurs il faut ajouter au moins 1 ms.

Utilisation du pilote MAX31865


Le seul réel point potentiellement délicat concerne l'initialisaiton du composant via la méthode initialize de la classe. En effet le composant MAX31865 supporte divers types de sondes platine pouvant potentiellement avoir des valeurs de résistance à 0°C différentes. A titre d'exemple, on utilise couramment des sondes platine 100 Ohms ou des sondes platine 1000 Ohms. De plus les sondes peuvent être reliées au MAX31865 par 2, 3 ou 4 fils. Il est donc important de ne pas se tromper lors de l'initialisation du composant afin de lui transmettre les bonnes valeurs de configuration.


Ce point est important pour mettre en oeuvre la bonne linéarisation en température à  partir des données retournées par le composant. Ces données sont retournées par rapport à  une résistance de référence nommée RREF physiquement cablée sur le composant. Dans le cas de RTD 100 Ohms, RREF vaut 430 Ohms, dans le cas de RTD 1000 Ohms, RREF vaut 4,3 KOhms.


A titre d'exemple, chez ADAFRUIT leur produit MX31865 est disponible dans les deux versions :
 - 100 Ohms : Product ID : 3328
 - 1000 Ohms : Product ID : 3648

Seule la valeur de RREF différencie ces deux versions : Voir : https://learn.adafruit.com/adafruit-max31865-rtd-pt100-amplifier/f-a-q.


Les valeurs par défaut de la méthode initialize sont adaptées à la france (filtre 50 Hz), définissent une RTD 3 fils de 100 Ohms.


Le principe général d'utilisation est alors le suivant :


Initialisation :
 - initialize
 - configure
Obtention d'une mesure :
 - trig
 - Attente de 52 ou 62.5 ms
 - readRawADC
 - rawADCToResistance
 - resistanceToTemperature

Pour simplifier, une méthode nommée measureTemperature intègre tout le boulot décrit pour l'obtention d'une mesure. Ce n'est pas plus rapide, mais c'est plus simple.

Programme d'exemple


  .../...
float Temperature = 0.0;
CMAX31865* pMAX31865 = new CMAX31865((spi0, 6, 7, 8, 9);
  
pMAX31865->initialize(MAX31865_100_RTD_TYPE, MAX31865_RTD_3_WIRES, MAX31865_50HZ_FILTER);
pMAX31865->configure();
  
pMAX31865->measureTemperature(&Temperature);
  .../...

Types

Le pilote AI418S définie les types suivants :


Types de sonde platine : Nombre de fils de cablage.


  typedef enum _MAX31865_RTD_WIRES
  {
    MAX31865_RTD_2_WIRES,
    MAX31865_RTD_3_WIRES,
    MAX31865_RTD_4_WIRES,
  } MAX31865_RTD_WIRES;

Types de sonde platine : Résistance à 0°C.


  typedef enum _MAX31865_RTD_TYPE
  {
    MAX31865_100_RTD_TYPE, // RREF = 430 Ohms
    MAX31865_1000_RTD_TYPE, // RREF = 4.3 KOhms
  } MAX31865_RTD_TYPE;

Filtrage de la fréquence secteur.


  typedef enum _MAX31865_FILTER
  {
    MAX31865_50HZ_FILTER,
    MAX31865_60HZ_FILTER,
  } MAX31865_FILTER;

Macros

Le pilote définie des macros pour précisier le bus SPI utilisé et les broches SCK, TX, RX et CS. Elles sont utilisées par défaut par le constructeur. Bien sur, toutes autres valerus conformes au diverses implémentation des bus SPI sur le pico sont valides.


  #define MAX31865_SPI_PORT spi0 // bus SPI0
  #define MAX31865_SPI_SCK 6 // SPI0 SCK sur GPIO6
  #define MAX31865_SPI_TX 7 // SPI0 TX sur GPIO7
  #define MAX31865_SPI_RX 8 // SPI0 RX sur GPIO8
  #define MAX31865_SPI_CS 9 // SPI0 CS sur GPIO9

Constructeur

CMAX31865(spi_inst_t* spibus = MAX31865_SPI_PORT, const uint& unSpiSckGpio = MAX31865_SPI_SCK, const uint& unSpiTxGpio = MAX31865_SPI_TX,const uint& unSpiRxGpio = MAX31865_SPI_RX,const uint& unSpiCsGpio = MAX31865_SPI_CS)

Méthodes publiques

voidinitialize(MAX31865_RTD_TYPE eRTDType, MAX31865_RTD_WIRES eRTDWires, MAX31865_FILTER eFilter)
boolconfigure()
boolreadRawADC(ushort* punValue)
floatrawADCToResistance(const ushort unReadADC)
floatresistanceToTemperature(const float fResistance)
boolmeasureTemperature(float* fTemperature)

Détails des Méthodes

Constructeur



CMAX31865(spi_inst_t* spibus = MAX31865_SPI_PORT, const uint& unSpiSckGpio = MAX31865_SPI_SCK, const uint& unSpiTxGpio = MAX31865_SPI_TX, const uint& unSpiRxGpio = MAX31865_SPI_RX, const uint& unSpiCsGpio = MAX31865_SPI_CS);

Description : Constructeur d'une instance de la classe CMAX31865.


Paramètre : spibus - type spi_inst_t* - Identificateur du bus SPI auquel est reliée le composant MAX31865. Valeur par défaut SPI_PORT = spi0.

Paramètre : unSpiSckGpio - type const uint& - Broche GPIO du signal SCK du bus SPI. Valeur par défaut MAX31865_SPI_SCK = 6.

Paramètre : unSpiTxGpio - type const uint& - Broche GPIO du signal TX du bus SPI. Valeur par défaut MAX31865_SPI_TX = 7.

Paramètre : unSpiRxGpio - type const uint& - Broche GPIO du signal RX du bus SPI. Valeur par défaut MAX31865_SPI_RX = 8.

Paramètre : unSpiCsGpio - type const uint& - Broche GPIO du signal CS du bus SPI. Valeur par défaut MAX31865_SPI_CS = 9.


Méthodes publiques génériques



bool initialize(MAX31865_RTD_TYPE eRTDType, MAX31865_RTD_WIRES eRTDWires, MAX31865_FILTER eFilter)

Description : Permet de régler le le type de sonde platine et le filtrage du secteur. Cette méthode ne fait que transmettre les paramètres au pilote. Ils ne sont appliqués au composant que par l'appel de la méthode configure.


Paramètre : eRTDType - type MAX31865_RTD_TYPE - Type de RTD.

Paramètre : eRTDWires - type MAX31865_RTD_WIRES - Nimbre de fils de la RTD.

Paramètre : eFilter - type MAX31865_FILTER - Fréquence secteur.



bool configure()

Description : Applique les paramètres de configuration passés via la méthode initialize au composant MAX31865.


Valeur de retour : Booléen indiquant le succès ou l'echec de la méthode.



bool readRawADC(ushort* punValue)

Description : D2clenche une mesure et retourne la valeur brute issue du convertisseur analogique du composant MAX31865.


Paramètre : punValue - type short* - Pointeur vers un entier recevant le contenu des registres du convertisseur analogique du MAX31865 en sortie de la fonction.


Valeur de retour : Booléen indiquant le succès ou l'echec de la méthode.



float rawADCToResistance(const ushort unReadADC)

Description : Permet de convertir une valeur brute telle que retournée par la méthode readRawADC en valeur de résistance.


Paramètre : unReadADC - type const ushort - Valeur brute issue du convertisseur analogique du composant MAX31865.

Valeur de retour : Résistance de la RTD.



float resistanceToTemperature(const float fResistance)

Description : Permet de convertir une valeur de résistance telle que retournée par la méthode rawADCToResistance en valeur de température en degrés Celsius.


Paramètre : fResistance - type const float - Résistance de la RTD.

Valeur de retour : Température.



bool measureTemperature(float* fTemperature)

Description : Effectue une mesure et retourne directement la température.


Paramètre : fTemperature - type float* - Pointeur vers un flottant recevant la mesure de température en sortie de la fonction.

Valeur de retour : Booléen indiquant le succès ou l'echec de la méthode.