MicroPython - HACK du module voltmètre avec interface Grove

Bonjour a tous, 

Dans ce précédent article, nous vous parlions du pilote MicroPython pour le module Voltmètre U087 de M5Stack.

Aujourd'hui, nous allons parler d'un petit hack matériel (et m-à-j de la bibliothèque) pour soit:

  1. supporter 2 modules voltmètres 
  2. Lire de très faibles tensions directement sur l'ADS1115.
    Ce qui permet de l'utiliser avec un SHUNT (shunt sur Wikipedia).

Cas pratique

J'ai une résistance de 4.7 Ohms avec un pouvoir de dissipation de 500W (oui, vous avez bien lu! C'est une sacrée résistance).

Je dois pouvoir lire le courant continu qui y passe quand elle est utilisé.
Le compte est vite fait.... P=R*I^2 nous indique 500=4.7*I^2 donc que le courant est de l'ordre de 10.3 Ampères. Outch! nos breakouts habituels ne survivront pas! Il faudra donc ruser.

Source: bibliothèque VMeter pour MicroPython

Grâce au shunt RSA-10-100 monté en série avec la résistance de 500W, nous avons une résistance négligeable (mais calibrée) en série dans le circuit de puissance. 

Il suffit donc de lire la chute de tension aux bornes de cette résistance calibrée pour en déduire le courant la traversant.

Shunt RSA-10-100

La nomenclature du produit indique que la chute de tension est de 100mV pour 10A. Si un courant de 3.45A traversait le shunt alors la chute de tension aux bornes serait de 34.5mV... il ne reste plus qu'a pouvoir lire cette tension... raison pour laquelle un VMeter à été modifié.

Pourquoi hacker un VMeter?

La raison est simple! Le VMeter dispose d'un isolateur entre le circuit de mesure et le circuit basse tension (côté microcontrôleur).

Avec des tensions de mesure de l'ordre de 60V et des courants allant jusque 10A, il y a tout intérêt à garder un circuit d'isolation entre le microcontrôleur et le circuit haute tension.

Hacks du VMeter

approche de la tension

Dans sont fonctionnement standard, l'ADS1115 du VMeter est utilisé sur une plage de tension de 0 à 2.048V (configuration par défaut).
Il est donc possible de lire directement la tension aux bornes du shunt.

En éliminant le pont diviseur et la tension de bias (2.5V), il est possible de lire directement la tension sur l'entrée différentielle de l'ADS1115.
L'expérience a démontré qu'il n'était pas nécessaire d'augmenter la résolution de l'ADS1115.

Approche I2C

L'ADS1115 et l'EEPROM sont deux composants I2C avec une adresse fixe.

Hors, il ne peut pas y avoir deux périphériques I2C avec la même adresse sur le bus!

Il faudra donc modifier l'adresse I2C de l'ADS1115 et de l'EEPROM sur le module VMeter.

Modification ADS1115

Source: bibliothèque VMeter pour MicroPython

Il y a donc une série de composant à retirer. Une patte à dessouder & soulever sur l'ADS1115.
Puis une série de 3 pontages à réaliser.
C'est assez délicat à réaliser, il faut aussi disposer du savoir faire nécessaire.

Modification de l'EEPROM

Côté EEPROM, il faut également modifier son adresse I2C pour éviter une collisions si l'on place deux module VMeter sur le bus I2C.

Les modifications du module sont testées à l'aide du script suivant:

from machine import I2C
from vmeter import *
from time import sleep

# Pico - I2C(1) - sda=GP8, scl=GP9
i2c = I2C(1, freq=10000)
# M5Stack core
# i2c = I2C( sda=Pin(21), scl=Pin(22) )

vmeter = Voltmeter(i2c, ads1115_addr=0x4b, eeprom_addr=0x51 ) # Addr-->Scl
while True:
	# read ADC voltage (in millivolts)
	print( 'ADC Voltage: %5.3f mV' % vmeter.adc_mv )
	sleep( 0.3 )

Qui permet de lire la chute de tension avec un grande précision sur le shunt. La documentation du Le dépôt GitHub démontre cette précision avec un test pratique. 

Utilisation des deux VMeter

pour finir, j'ai branché les deux modules VMeter. L'un mesure la tension et l'autre (la version hackée) le courant traversant le shunt.

Du coup, il est possible de  calculer la puissance consommée (P = U x I).

Le script est simplissime:

from machine import I2C
from vmeter import *
from time import sleep

# Pico - I2C(1) - sda=GP8, scl=GP9
i2c = I2C(1, freq=10000)

vmu = Voltmeter(i2c )
vmi = Voltmeter(i2c, ads1115_addr=0x4b, eeprom_addr=0x51 ) # hacked version

while True:
 u = vmu.voltage
 i = vmi.adc_mv # in millivolts
 i = i * 0.1 # in Amps (each mv = 0.1 A).
 # afficher Tension, Courant, Puissance
 print( 'U: %5.3f v, I: %5.3f amps --> P: %5.3f watt' % (u, i, u*i) )
 sleep( 0.3 )

Ce qui produit le résultat suivant:

U: 15.312 v, I: 3.306 amps --> P: 50.625 watt
U: 17.106 v, I: 3.569 amps --> P: 61.048 watt
U: 17.997 v, I: 3.769 amps --> P: 67.828 watt
U: 18.967 v, I: 4.063 amps --> P: 77.054 watt
U: 21.295 v, I: 4.431 amps --> P: 94.365 watt
U: 22.316 v, I: 4.613 amps --> P: 102.933 watt
U: 22.713 v, I: 4.731 amps --> P: 107.459 watt
U: 23.631 v, I: 4.881 amps --> P: 115.351 watt
U: 24.020 v, I: 5.050 amps --> P: 121.302 watt
U: 24.860 v, I: 5.188 amps --> P: 128.963 watt
U: 25.543 v, I: 5.300 amps --> P: 135.380 watt
U: 25.952 v, I: 5.381 amps --> P: 139.653 watt
U: 26.093 v, I: 5.388 amps --> P: 140.577 watt

Plus d'information

Liste d'achat

Aucun commentaire