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 :
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.
{
MAX31865_RTD_2_WIRES,
MAX31865_RTD_3_WIRES,
MAX31865_RTD_4_WIRES,
} MAX31865_RTD_WIRES;
Types de sonde platine : Résistance à 0°C.
{
MAX31865_100_RTD_TYPE, // RREF = 430 Ohms
MAX31865_1000_RTD_TYPE, // RREF = 4.3 KOhms
} MAX31865_RTD_TYPE;
Filtrage de la fréquence secteur.
{
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_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
| void | initialize(MAX31865_RTD_TYPE eRTDType, MAX31865_RTD_WIRES eRTDWires, MAX31865_FILTER eFilter) |
| bool | configure() |
| bool | readRawADC(ushort* punValue) |
| float | rawADCToResistance(const ushort unReadADC) |
| float | resistanceToTemperature(const float fResistance) |
| bool | measureTemperature(float* fTemperature) |
Détails des Méthodes
Constructeur
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
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.
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.
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.
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.
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.
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.