INA219 (capteur de courant / tension bidirectionel
Salut...
Enfin j'avance dans ma quette du parfait capteur de courant pour le raspberry ...
Je compte donc utiliser (entre autres) le bien connu ina219 pour mesurer ce qui entre et sort de mes batteries...
https://www.adafruit.com/product/904
Le soucis avec ce capteur, c'est que d'origine il n'est capable que de mesurer une tension max de 26v et un ampérage max de 3.2A.
pour contourner le problème ... la solution est simple ... Il suffit de dessouder le shunt interne au capteur (la grosse resistance marquée R100) et d'utiliser un shunt externe adapté a son installation. Dans mon cas j'utilise un shunt 300A / 75mv
Et pour la tension...en réalité contrairement a ce qui est annoncé partout, le module accepte sans problèmes jusqu a 32v...donc parfait pour une installation en 24v
Edit: le module n'accepte plus de 26v que quelques minutes, donc voir le ina226 pour une installation en 24v
Pour la partie logicielle, la seule library python que j'ai trouvé qui fonctionne sans problèmes et celle d'adafruit :
https://github.com/adafruit/Adafruit_CircuitPython_INA219
J'ai donc câbler tout ca sur mon shunt et les ports i2c du gpio, puis installer la library
sans autres modifs je fait un essaie avec le script test :
import time
import board
from adafruit_ina219 import ADCResolution, BusVoltageRange, INA219
i2c_bus = board.I2C()
ina219 = INA219(i2c_bus)
print("ina219 test")
# display some of the advanced field (just to test)
print("Config register:")
print(" bus_voltage_range: 0x%1X" % ina219.bus_voltage_range)
print(" gain: 0x%1X" % ina219.gain)
print(" bus_adc_resolution: 0x%1X" % ina219.bus_adc_resolution)
print(" shunt_adc_resolution: 0x%1X" % ina219.shunt_adc_resolution)
print(" mode: 0x%1X" % ina219.mode)
print("")
# optional : change configuration to use 32 samples averaging for both bus voltage and shunt voltage
ina219.bus_adc_resolution = ADCResolution.ADCRES_12BIT_32S
ina219.shunt_adc_resolution = ADCResolution.ADCRES_12BIT_32S
# optional : change voltage range to 32V
ina219.bus_voltage_range = BusVoltageRange.RANGE_32V
# measure and display loop
while True:
bus_voltage = ina219.bus_voltage # voltage on V- (load side)
shunt_voltage = ina219.shunt_voltage # voltage between V+ and V- across the shunt
current = ina219.current # current in mA
# INA219 measure bus voltage on the load side. So PSU voltage = bus_voltage + shunt_voltage
print("PSU Voltage: {:6.3f} V".format(bus_voltage + shunt_voltage))
print("Shunt Voltage: {:9.6f} V".format(shunt_voltage))
print("Load Voltage: {:6.3f} V".format(bus_voltage))
print("Current: {:9.6f} A".format(current / 1000))
print("")
time.sleep(1)
en lançant le script j’obtiens des valeurs... mais forcement, puisque j'ai changer de shunt, la valeur d’ampérage n'est pas bonne.. Je constate également que la valeur d’ampérage obtenue est la même que ma tension de shunt. j'ai donc chercher vainement sur le net la façon de calibrer le module... et après plusieurs heures de recherche infructueuse a mon niveau de programmation...j'ai décider de faire plus simple ...
puisque ma valeur d’ampérage est égale a ma tension de shunt ... et que mon shunt externe fait 300A pou 75mv... 300/75 = 4mv pour 1 ampère. il me suffit donc de modifier la ligne :
print("Current: {:9.6f} A".format(current / 1000))
en :
print("Current: {:9.6f} A".format(current * 0.4))
et voila ... le script me donne les bonnes valeurs en boucle toute les seconde...
pi@PvMonit:~ $ sudo python3 /opt/PvMonit/bin/ina219bis.py
Config register:
bus_voltage_range: 0x1
gain: 0x3
bus_adc_resolution: 0x3
shunt_adc_resolution: 0x3
mode: 0x7
PSU Voltage: 24.351 V
Shunt Voltage: -0.001210 V
Load Voltage: 24.352 V
Current: -4.840000 A
PSU Voltage: 25.314 V
Shunt Voltage: -0.001980 V
Load Voltage: 25.316 V
Current: -7.920000 A
PSU Voltage: 25.406 V
Shunt Voltage: -0.002090 V
Load Voltage: 25.408 V
Current: -8.360000 A
PSU Voltage: 25.063 V
Shunt Voltage: -0.001470 V
Load Voltage: 25.064 V
Current: -5.880000 A
PSU Voltage: 25.441 V
Shunt Voltage: -0.002600 V
Load Voltage: 25.444 V
Current: -10.400000 A
Voila... il reste plus qu'a utiliser ca avec le script peukert pour avoir le SOC de la batterie... Mais la du coup je sèche un peu et je sais pas trop comment m'y prendre...