Aller la suite :
Dialoguer périodiquement avec notre composant et faire des conversions en valeurs réelles, c’est réglé. On pourrait en rester là pour cette partie, mais après 8 pages de tuto, on va peut-être commencer à faire un peu plus … ou plutôt un peu moins … enfin mieux pas pire quoi
.
Déjà, on oublie cette valeur 4095 qui pique les yeux
. Sa vraie valeur c’est la valeur maxi de la résolution de l’ADC. Je défini donc une propriété
Resolution à mon objet ADC3208 et je lui mets la valeur 12.
Ensuite, mon programme il s’en fout du mcp3208, ce qui l’intéresse, c’est la valeur lue sur chaque capteur analogique. Je vais donc créer une class qui va contenir des objets 'capteur analogique' et c’est elle qui aura pour mission d’aller interroger le composant.
A la construction de cette class, je vais charger la config des capteurs et leur ajouter 2 propriétés à chacun. La première que je vais appeler Coef et qui n’est rien d’autre que le pas de conversion de base digitale/reelle et une seconde qui contiendra la valeur réelle et formatée que je vais appeler Value. Ensuite je vais lui ajouter 1 méthode Read qui aura pour rôle d’interroger le composant et d’initialiser les Values. Pour que ce soit plus rigolo (et surtout instructif), cette propriété Read aura 2 possibilités. Appelée sans paramètre, elle prendra en charge tous les capteurs mais on pourra aussi l’appeler en lui passant un un n° de canal pour ne traiter qu’un seul capteur (ouais, je sais, ça ne nous sert à rien pour l’instant, mais qui sait ….)
Aller nouveau fichier
sensor.js (à ne pas confondre avec
sensor.json qui contient les propriétés de config des capteurs) et on met ca dedans :
- sensojs.png (38.02 Kio) Vu 6476 fois
Dans le fichier spi_io on n’oublie pas de rajouter la propriété ‘this.Resolution = 12 ; a l’objet MCP3208’. J’ai aussi remplacé
Analog par
ANALOG dans le fichier
sensor.json (conventionnellement parlant, c’est plus mieux
)
- modif.png (25.91 Kio) Vu 6476 fois
Et on peut modifier le fichier index pour arriver à ca :
- index.png (32.98 Kio) Vu 6476 fois
Mouais, vous me direz, beaucoup de code pour finalement ne rien faire de plus. Bha moi je ne suis pas de cet avis. Déjà ça a plus de gueule (très important ca) et ça va énormément nous faciliter la vie pour la suite puisque maintenant on va pouvoir enrichir nos objets capteur, ce qui nous sera très utile pour répondre à tous les critères du cahier des charges.
Pour vous amuser, et voir ou je veux en venir, vous pouvez remplacer la boucle for de fonction test par un simple :
Console.log (sensorAn) ;
La prochaine fois, on remplacera la console locale par une page web
.
les codes :
sensor.js
Code : Tout sélectionner
var Sensor = {
ANALOG: function (sensorfile, adc) {
var ch = require(sensorfile).ANALOG;
var dmax = Math.pow(2, adc.Resolution) - 1;
for (var i = 0; i < ch.length; i++) {
ch[i].Coef = (ch[i].Vmax - ch[i].Vmin) / dmax;
ch[i].Value = 0.0;
}
this.Read = function (channel) {
if (typeof channel !== "undefined") {
let v = adc.ReadChannel(channel);
ch[channel].Value = (ch[channel].Coef * v +
ch[channel].Vmin).toFixed(ch[channel].Dec);
}
else {
let v = adc.ReadAll();
for(var i = 0; i<ch.length; i++) {
ch[i].Value = (ch[i].Coef * v[i] +
ch[i].Vmin).toFixed(ch[i].Dec);
}
}
};
this.Channel = ch;
}
};
module.exports = Sensor;
sensor.json
Code : Tout sélectionner
{
"ANALOG": [
{
"Iden": 0,
"Name": "Voltmetre 0",
"Unite": "Volt",
"Vmin": 0.0,
"Vmax": 5.0,
"Dec": 3
},
{
"Iden": 1,
"Name": "Voltmetre 1",
"Unite": "Volt",
"Vmin": 0.0,
"Vmax": 5.0,
"Dec": 3
},
{
"Iden": 2,
"Name": "Voltmetre 2",
"Unite": "Volt",
"Vmin": 0.0,
"Vmax": 5.0,
"Dec": 3
},
{
"Iden": 3,
"Name": "Voltmetre 3",
"Unite": "Volt",
"Vmin": 0.0,
"Vmax": 5.0,
"Dec": 3
},
{
"Iden": 4,
"Name": "Voltmetre 4",
"Unite": "Volt",
"Vmin": 0.0,
"Vmax": 5.0,
"Dec": 3
},
{
"Iden": 5,
"Name": "Voltmetre 5",
"Unite": "Volt",
"Vmin": 0.0,
"Vmax": 5.0,
"Dec": 3
},
{
"Iden": 6,
"Name": "Voltmetre 6",
"Unite": "Volt",
"Vmin": 0.0,
"Vmax": 5.0,
"Dec": 3
},
{
"Iden": 7,
"Name": "Voltmetre 7",
"Unite": "Volt",
"Vmin": 0.0,
"Vmax": 5.0,
"Dec": 3
}
]
}
index.js
Code : Tout sélectionner
var spi_io = require("./spi_io.js");
var sensor = require("./sensor.js");
var rpio = require("rpio");
rpio.init({ gpiomem: false, mapping: 'gpio' });
rpio.spiBegin();
var mcp3208 = new spi_io.MCP3208(rpio, 0, 512);
var sensorAn = new sensor.ANALOG("./sensor.json", mcp3208);
var test = function () {
sensorAn.Read();
for (var i = 0; i < sensorAn.Channel.length; i++) {
var c = sensorAn.Channel[i];
console.log(c.Name + " " + c.Value + " " + c.Unite);
}
console.log("\r\n");
};
setInterval(test, 1000);
process.on('SIGINT', function () {
rpio.spiEnd();
process.exit();
});
spi_io.js
Code : Tout sélectionner
var Spi_IO = {
MCP3208: function (rpio, cs, clk) {
this.Cs = cs;
this.Clk = clk;
this.Resolution = 12;
var adcResult = function (reg) {
rpio.spiTransfer(reg, reg, reg.length);
return reg;
};
this.ReadAll = function () {
rpio.spiSetClockDivider(this.Clk);
rpio.spiChipSelect(this.Cs);
var x = [];
var b = [];
for (i = 0; i < 8; i++) {
b = adcResult(Buffer([(i >> 2) + 6, i << 6 & 0xFF, 0x00]));
x[i] = ((b[1] & 0x0F) << 8) + b[2];
}
return x;
};
this.ReadChannel = function (channel) {
rpio.spiSetClockDivider(this.Clk);
rpio.spiChipSelect(this.Cs);
var b = adcResult(Buffer([(channel >> 2) + 6, channel << 6 & 0xFF, 0x00]));
return ((b[1] & 0x0F) << 8) + b[2];
};
}
};
module.exports = Spi_IO;
**********************************
Quelques capteurs susceptible de répondre cahiers des charges :
Capteur de courant 20 Amp. /20Vdc
https://www.gotronic.fr/art-capteur-de- ... -26058.htm
Sortie = 0.1v/Amp ; Vref/2=0 Amp, Donc allimenté en 5v : Vmin = -(2.5 / 0.1) = -25 ;Vmax = (2.5/0.1) = 25
On a donc une amplitude de 50A que l’on peut diviser par 4095 soit 0.01221001 Amp/Unité numérique
Capteur de temperature 0 à 110°
https://www.gotronic.fr/art-capteur-de- ... -18965.htm
Vmin : -40 ;Vmax : 125
Ou sinon :
https://www.gotronic.fr/art-capteur-de- ... -19287.htm
10mV/1°C. Donné pour 0 à 100° mais peut électriquement peut faire l’affaire pour des pointes à 100.
Vmin : 0 ;Vmax : 250
Capteur de tension 0 à 20 VDC
Ici, simple diviseur de tension suffit. Perso j’utiliserais un potentiomètre multitour (4.7k a 10k) que j’ajusterais pour avoir une division précise par 5 ce qui permettrais de mesurer des tensions de 0 à 25v. Dans ce cas :
Vmin : 0 ; Vmax : 25