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 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.
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.
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.
Les I/O pour relever les compteurs seront multiplexés pour économiser au maximum le nombre de ports du PIC à utiliser.
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 | ![]() |
Le tracé du circuit | ![]() |
Le circuit et les composants | ![]() |
L'implantation des composants | ![]() ![]() |
Le tracé du circuit | ![]() |
Le circuit et les composants | ![]() |
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.
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:
Adresse | Donnée |
---|---|
0x00 à 0x0f | tag ascii qui identifie la version du code du pic |
0x10 | compteur d'impulsions 8 bits pour le port 0 |
0x11 | compteur d'impulsions 8 bits pour le port 1 |
0x12 | compteur d'impulsions 8 bits pour le port 2 |
0x13 | compteur d'impulsions 8 bits pour le port 3 |
0x14 | compteur d'impulsions 8 bits pour le port 4 |
0x15 | compteur d'impulsions 8 bits pour le port 5 |
0x16 | compteur d'impulsions 8 bits pour le port 6 |
0x17 | compteur d'impulsions 8 bits pour le port 7 |
0x18...0x1b | Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 0 |
0x1c...0x1f | Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 1 |
0x20...0x23 | Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 2 |
0x24...0x27 | Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 3 |
0x28...0x2b | Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 4 |
0x2c...0x2f | Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 5 |
0x30...0x33 | Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 6 |
0x34...0x37 | Contient le temps en ms écoulé entre les deux dernière impulsions pour le port 7 |
0x38...0x3b | l'uptime de la carte en ms |
0x3c | compteur de paliatif i²c. L'i²c du PIC 16f88 deconne et il faut parfois le reinitialiser. Ce comteur compte les réinitialisations. |
adresse | valeur |
---|---|
0x18 (lsb) | 0x01 |
0x19 | 0x02 |
0x1a | 0x03 |
0x1b (msb) | 0x04 |