Capteur sans fil pour compteur d’eau avec « cyble » – Partie 1 : principe de fonctionnement

Capteur sans fil pour compteur d’eau avec « cyble » – Partie 1 : principe de fonctionnement

Quand j’ai voulu domotiser mon compteur électrique (d’abord le modèle Actaris, puis le Linky), ça a été relativement simple, puisqu’on trouve des informations sur le site d’enedis et pas mal de tuto sur le net. Pour le compteur de gaz (Gazpar), malgré la simplicité de récupération des impulsions, trouver de la doc a été un peu moins simple.

Pour ma prochaine victime, le compteur d’eau, ça semble encore plus compliqué. On ne voit pas de sortie impulsion, lisible par exemple avec un interrupteur reed. Il n’ y a pas non plus de connecteur à collecteur ouvert ou de simili port série… Les seuls éléments visibles sont l’index avec les chiffres qui tournent et une sorte de demi rondelle métallique qui tourne au gré de l’eau qui passe. Elle n’est pas magnétique.

Au fil de mes recherche, je suis tombé sur un projet très aboutit qui utilise un capteur optique en jouant sur l’effet miroir du disque pour capter les rotations : https://www.openhardware.io/view/15/Itron-Aquadis-watermeter-sensor#google_vignette
Étant donné que je n’ai pas l’électricité au niveau du compteur d’eau, j’ai continué à cherche une autre solution car la led IR du TCRT5000 tire un peu trop de courant pour pouvoir utiliser un accu lithium avec une autonomie d’au moins un an.

Une version avec des capteurs optiques plus adaptées à certains compteur avec une cyble « miroir » est disponible dans un autre article : Capteur optique sans fil pour compteur d’eau

La Cyble

D’après une documentation trouvée sur le site du fabriquant du compteur d’eau, ils appellent cette roue « cyble ». Dans les explications du principe de fonctionnement, il est dit :

Par effet de “courants de Foucault”, il y a variation du signal envoyé dans la bobine en regard de la cible et donc détection du passage de celle-ci.

Aiguille cyble
Variation du signal dans la bobine

La forme de la courbe me rappelle de lointains cours où on parlait de circuit RLC en régime libre et de signaux pseudo périodiques amortis. Elle m’a aussi rappelé un circuit réalisé il y a quelques années pour mesurer la valeur soit d’une inductance, soit d’un condensateur avec un arduino (en connaissant la valeur de l’autre) puis en mesurant la fréquence du signal résultant. La fréquence de résonance est donnée par la formule suivante, avec L en Henry et C en Farad :

    \[F_R = \frac{1}{2\pi \sqrt{LC}}\]

Connaissant la fréquence, L ou C, on peut retrouver la valeur inconnue.

Le principe de détection

D’après ce qui est énoncé, la présence de la « cyble » devant l’inductance devrait faire que le signal sera amorti plus rapidement. Au final, pour cette mesure, la fréquence de résonance n’est peut être pas d’une importance capitale. Elle doit néanmoins jouer sur l’autonomie : plus elle est élevée, plus la mesure sera rapide et plus le microcontrôleur pourra retourner en veille rapidement. Elle ne doit pas être trop élevée non plus pour rester mesurable par le microcontrôleur ou les composants annexes.

De plus, l’inductance devra être de petite taille (la taille du composant) car le diamètre de la « cyble » est relativement petit, 18mm de diamètre sur mon compteur.

 

Conception du circuit

L’oscillateur

Pour commencer, on va faire un simple oscillateur LC qui sera soumis à un échelon de tension par une des sortie d’un atmega328p (Arduino uno). PULSE est connecté sur une des sortie, ici D4 (PD4). On peut observer que sur les petites durées, la fonction delayMicroseconds n’est pas très précise.

Oscillateur simple

#define PULSE_OUT 4   //PD4

void setup() {
pinMode(PULSE_OUT , OUTPUT);
delay(1000);
}

void loop() {
digitalWrite(PULSE_OUT, HIGH);
delayMicroseconds(50);
digitalWrite(PULSE_OUT,LOW);
delay(500);
}

 

Oscillation sans objet

 

Oscillation avec un objet métallique à quelques mm au dessus de l’inductance

 

Ajout d’un bias et d’une tension de référence

Dans l’idée, ça fonctionne! Il va falloir maintenant traiter un peu le signal pour ne plus avoir de composante négative et ajouter un pont diviseur qui servira de référence de tension afin de compter les oscillations qui la traversent.

Oscillation sans objet, on compte à peu près 40 coupures de la référence (montantes ou descendantes)

 

Oscillation avec un objet métallique à quelques mm au dessus de l’inductance, seulement 24 intersections.

 

Compter les oscillations

Au début, j’ai pensé à dégainer un LM339 (4 comparateurs différentiels) et ainsi compter le nombre de fois où le signal amorti se trouve sous la tension de référence. Mais l’atmega328p est équipé d’un comparateur analogique. Les tensions entre AIN0 etAIN1 (alias D6 et D7 sur l’arduino uno/nano) sont comparées.
AIN0 peut être remplacé par la tension interne de référence via le bit ACBG du registre ACSR.
AIN1 peut être remplacé par un des port de l’ADC (PC0, PC1… alias A0, A1 sur l’arduino) via le bit ACME du registre ADCSRB et le registre ADMUX pour choisir le numéro PCx.

Diagramme du comparateur analogique de l’atmega328p

Sur le schéma suivant, basé sur un arduino nano, on utilise D4 pour l’impulsion, D6 (AIN0) pour la tension de référence générée par le pont diviseur et A0 (PC0) pour le signal oscillant.

Comptage des oscillations avec arduino nano

 

#include <avr/io.h>
#include <avr/interrupt.h>

#define PULSE_OUT 4 //PD4
#define PULSE_IN 14 //PC0
#define AIN0 6 //PD6

volatile uint8_t pulseCnt = 0;

void setup() {
Serial.begin(115200);

pinMode(PULSE_OUT , OUTPUT);
digitalWrite(PULSE_OUT,LOW);

pinMode(PULSE_IN, INPUT);
pinMode(AIN0, INPUT);

cli();
ADCSRA &= ~(1<<ADEN); // Désactive l'ADC
ADCSRB = (1 << ACME); // Active le multiplexeur (PCx en remplacement de AIN1)
ADMUX = 0; // Configure A0 (PC0) en remplacement de AIN1
DIDR1 = (1<<AIN1D) | (1<< AIN0D); // Désactive le buffer d'entrée du comparateur
sei();


delay(1000);
}

void loop() {
pulseCnt = 0;
digitalWrite(PULSE_OUT, HIGH);
delayMicroseconds(25);
digitalWrite(PULSE_OUT,LOW);

ACSR = (1<<ACIE); // Active les interruptions du comparateur analogique sur font montant et descendant, active le comparateur
delayMicroseconds(500);
ACSR = (1<<ACD); //Désactive les interruptions du comparateur analogique et désactive le comparateur

Serial.println(pulseCnt);

delay(500);

}

//Vecteur d'interruption du comparateur
ISR(ANALOG_COMP_vect){
pulseCnt++;
}
Programme de comptage des oscillations
Résultat dans la console

 

Le principe de base de la détection est maintenant opérationnel. Dans la prochaine partie on s’intéressera aux points suivants :

  • abaisser au maximum la consommation du circuit
  • comment compter le nombre de tour ? comment gérer le sens de rotation si besoin ?
  • trouver la fréquence de mesure idéale en fonction du compteur
  • calibrer la valeur mesurée avec et sans présence de la cyble.

 

One thought on “Capteur sans fil pour compteur d’eau avec « cyble » – Partie 1 : principe de fonctionnement

Laisser un commentaire

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