Compteur de consommation électrique

Le but

On trouve sur le marché des compteurs de consommation électrique. Ces compteurs se présentent sous la forme d'un module à insérer dans un tableau électrique. Ils permettent l'affichage de la consommation sur un afficheur LCD, mais ils peuvent aussi fournir l'information de consommation sous forme d'une impulsion tous les 0,5 W/h.

Je propose ici la réalisation d'un montage permettant de récupérer ces impulsions et de fournir le total à un système complexe (un PC) qui sera capable de tracer des courbes et faire des statistiques.

Le compteur

Le compteur que j'utilise est de la marque Voltcraft. On le trouve chez Conrad. Le compteur utilise des normes Allemandes que j'ai du mal a trouver sur le net. Dans la pratique ce n'est pas bien grave, car l'interfaçage est plutôt simple. Chaque fois que le compteur enregistre une consommation de 0.5W/h, il envoi une impulsion de 30ms au travers d'un optocoupleur.

Les contraintes

  • Le circuit final doit être assez petit pour plus facilement placé dans un tableau électrique.
  • Le prix du montage doit rester abordable
  • Le circuit doit être évolutif et accepter au moins 8 compteurs. C'est la demande du "client"
  • Le but étant de fournir les informations de consommation à un PC, il faut utiliser un bus de communication présent sur la plupart des machines et proposant des solutions de mise en œuvre pas trop complexes.

Les solutions retenues

Pour répondre au problème de taille, il vaut mieux s'orienter vers un microcontrôleur. Il fournira un maximum d'I/O dans un minimum de place et proposera des protocoles de communications intégrés. Pour que le coût reste accessible, il est intéressant de s'orienter vers les microcontrôleurs PIC. Ils ne sont pas cher à l'achat et même le programmateur de PIC est bon marché. Pour le protocole de communication évolutif et que l'on trouve fréquemment dans les PC, l'I²C est un bon client. Bien que l'on trouve plus souvent un port série ou un port parallèle sur un PC, il n'est pas intéressant de les utiliser car on sera limité à un seul montage de collecte de compteurs par PC. En revanche le protocole I²C permet de connecter plusieurs compteurs d'impulsions.

Le PIC16F88 intègre 12 I/O et un bus I²C esclave. Il intègre un oscillateur interne qui évite d'ajouter un quartz. Ses I/O fournissent suffisamment de courant pour piloter des LEDs, il n'y a donc pas besoin d'ajouter de transistors. Et finalement on le trouve au format DIL, plus facile à souder.

Datasheet du pic16f88

Pour le protocole de communication, on ferra en sorte que le PIC émule une eeprom I²C de type 24c02. Le protocole est simple à mettre en œuvre et il existe tout un tas de drivers qui savent s'adresser à ces composants. Il faudra pouvoir configurer l'adresse I²C pour pouvoir chaîner plusieurs modules.

Datasheet de l'eeprom

Les I/O pour relever les compteurs seront multiplexés pour économiser au maximum le nombre de ports du PIC à utiliser.

Le schéma

L'affectation des I/O du pic est faite tout d'abord en fonction des capacités des pins (par exemple l'I²C est forcément affecté aux pins 7 at 10) et ensuite en fonction de la réalisation du circuit imprimé sachant qu'il est préférable de faire un simple face car c'est plus facile à réaliser.

Le montage sera alimenté via le connecteur de l'I²C, on trouve généralement dans les PC des broches d'alimentation avec le bus I²C. Le port B est préféré pour les lignes de la matrice car il intègre des résistances de pull-up, cela toujours 4 résistances de moins à caser sur le circuit imprimé. On retrouve les signaux A0 à A2 qui permettent de positionner l'adresse I²C. Il a fallu ajouter des résistances de tirage, car ces ports là n'en disposent pas en interne. et finalement, les signaux AN0 à 2 sont disponible pour des extensions telles que d'autres colonnes de compteurs à relever ou des LEDs pour le debug.

Les lignes X0 à 3 et Y0 à 1 permettent de scanner les compteurs. Comme les compteurs fournissent une interface à base d'optocoupleur, on est sûr de ne pas avoir de problème électrique, et on est s'assure aussi que le scan en matrice fonctionnera bien car on aura pas de retour entre deux lignes d'un même matrice si l'on à deux impulsion simultanée. On aurait eu ce problème avec des commutateur simples.

Détails d'un scan de deux impulsions simultanées.

On peut noter deux connecteurs pour le bus I²C. Comme l'I²C est un bus série, le second connecteur permet de chaîner un second montage releveur de compteurs. De cette manière, l'interfaçage de plusieurs compteur sera plus propre et plus simple.

Finalement, il reste 3 leds. LD3 est juste le témoin d'alimentation. Elle permet d'indiquer à l'utilisateur un défaut d'alimentation. LD1 sera utiliser pour indiquer une activité sur le bus I²C et LD2 sera utiliser pour indiquer l'enregistrement d'une impulsion en provenance d'un des 8 compteurs.

L'implantation des composants

L'implantation des composants
Le tracé du circuit
Le circuit et les composants

L'implantation des composants pour la version CMS

L'implantation des composants
Le tracé du circuit
Le circuit et les composants

Le programme

L'algorithme est assez simple, il est basé uniquement sur des interruptions. Le pic est réveillé toutes les millisecondes et sur chaque paquet I²C reçu ou à émettre.

Chaque milliseconde, on va commencer par incrementer le compteur de millisecondes. On va ensuite scanner les ports pour savoir si l'on a une impulsion. Si l'impulsion à été déjà vue on l'ignore, sinon, on la comptabilise et on calcule le nombre de millisecondes écoulées depuis la dernière impulsion sur ce même port.

Lorsque l'on se fait réveiller pour une IRQ I²C, on peut avoir une lecture ou une écriture. Si c'est une écriture, on mémorise l'adresse que le master souhaitera lire, si c'est un lecture, on renvoie la donnée présente à l'adresse demandée précédemment par le master, et on fini par incrémenté cette adresse.

Update du 11/01/2013

Le PIC16F88 est fourni avec un bug dans la gestion du protocole I²C (voir SSP Module Silicon/Data Sheet Errata). Le code du PIC comprend donc le paliatif à ce problème proposé par Microchip. Il embarque un compteur de reset de l'I²C pour monitorer ce bug. D'autre part l'utilisation du bit CKP (maintain clock down) dans le code I²C était buggé.

J'ai également ajouté une version CMS du montage. Cette version est programable insitu. Attention, le schéma est légèrement modifié pour des question de routage simple face et le code assembleur que je fourni n'est pas adapté aux ports utilisés par ce nouveau schéma.

Le montage réalisé

Le fonctionnement

La carte répond par défaut à l'adresse 0x57. Le protocole 24c02 est simple, on envoi un octet entre 0x00 et 0xff pour positionner l'adresse que l'on souhaite lire, et ensuite on faire des lecture successives qui vont renvoyer les datas à partir de cet octet. Bien sur l'écriture ne fonctionne pas.

Le pic fourni une plage de donnée de 256 octets. Seuls les 60 premiers octets sont utiles. Les données sont organisées comme ceci:

AdresseDonnée
0x00 à 0x0ftag ascii qui identifie la version du code du pic
0x10compteur d'impulsions 8 bits pour le port 0
0x11compteur d'impulsions 8 bits pour le port 1
0x12compteur d'impulsions 8 bits pour le port 2
0x13compteur d'impulsions 8 bits pour le port 3
0x14compteur d'impulsions 8 bits pour le port 4
0x15compteur d'impulsions 8 bits pour le port 5
0x16compteur d'impulsions 8 bits pour le port 6
0x17compteur d'impulsions 8 bits pour le port 7
0x18...0x1bContient le temps en ms écoulé entre les deux dernière impulsions pour le port 0
0x1c...0x1fContient le temps en ms écoulé entre les deux dernière impulsions pour le port 1
0x20...0x23Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 2
0x24...0x27Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 3
0x28...0x2bContient le temps en ms écoulé entre les deux dernière impulsions pour le port 4
0x2c...0x2fContient le temps en ms écoulé entre les deux dernière impulsions pour le port 5
0x30...0x33Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 6
0x34...0x37Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 7
0x38...0x3bl'uptime de la carte en ms
0x3ccompteur de paliatif i²c. L'i²c du PIC 16f88 deconne et il faut parfois le reinitialiser. Ce comteur compte les réinitialisations.
Les valeurs sur 4 octets sont codées avec l'octet de poids faible sur la plus petite adresse. Par exemple:
adressevaleur
0x18 (lsb)0x01
0x190x02
0x1a0x03
0x1b (msb)0x04
Se lira 0x04030201

Les fichiers du projet