🚨 Point faible Pioupiou : indicateur état de la pile
-
La technologie de pile utilisée pour le Pioupiou V1 est très spécifique.
Contrairement aux piles usuelles, la tension ne faiblit pas avec la décharge. Elle reste à 3.6V. C'est seulement lorsque l'on tire du courant que celle-ci s'écroule.Il arrive donc régulièrement que l'on ait un appareil en bon état, mais qui semble ne plus fonctionner. On sort la pile pour la mesurer : elle affiche 3.6V alors qu'elle est vide. Cela pousse à diagnostiquer l'appareil comme en panne, à tord.
Nous devons impérativement équiper le Windbird d'un système de mesure de la pile en charge. On pourrait par exemple mesurer la tension de la pile lorsque le GPS est allumé.
-
D'après les schémas v1.0 et v1.1 je ne vois pas comment la tension pile est mesurée. J'aurais pensé que l'entrée analogique du micro était utilisée.
-
@pascal31 Interne au module TD, donc après le régulateur. C'est d'ailleurs étonnant que ça nous sorte 3.6V, alors que le module est alimenté en 3.3V régulé. Doit y avoir un souci quelque part.
-
@nicolas J'ai trouvé le bug de la tension pile dans le code que tu as rendu publique (ce qui est très classe !). C'est l'usage de TD_MEASURE_VoltageTemperatureExtended(bool mode) que tu as inversé.
mode = false c'est pour l'alimentation
mode = true c'est pour la température
C'est vrai aussi que c'est bizarre de la part de TelecomDesign d'avoir regroupé ces deux fonctions dans une seule...
Il faudrait donc que tu changes ton message d'alerte de pile faible par température basse !
Non plus sérieusement maintenant que la tension de pile et la température vont retrouver leur place, ça serait bien qu'on puisse visualiser la température des pioupious sur l'interface surtout que j'ai vu dans le code que tu l'envoyais déjà. -
@tam effectivement, la doc dit ça :
https://github.com/Telecom-Design/TD_RF_Module_SDK/blob/master/lib/libtdcore/src/td_measure.c/***************************************************************************//** * @brief * Accurately measure the Power Supply voltage or the temperature. * * @param[in] mode * If true, measure the temperature, if false, measure the power supply * voltage. * * @return * The measured temperature is given in 1/10 degrees Celsius, the power supply * voltage is given in mV. If ADC is not available, returns 0. ******************************************************************************/
Mais ça paraît cohérent avec mon code ?
https://github.com/pioupiou-archive/pioupiou-v1-firmware/blob/main/firmware/src/pp_monitoring.cstatic void ProbeTemperature () { float temperature = (TD_MEASURE_VoltageTemperatureExtended(true) / 10.); if (temperature < tempMin) tempMin = temperature; if (temperature > tempMax) tempMax = temperature; tempAvg += temperature; tempCount++; } static void ProbeVoltage () { int32_t voltage = TD_MEASURE_VoltageTemperatureExtended(false); if (voltage == 2000) return; // = reading has failed ? if (voltage < voltageMin) voltageMin = voltage; if (voltage > voltageMax) voltageMax = voltage; voltageAvg += voltage; voltageCount++; }
-
@nicolas Mais c'est que tu as raison ! C'est moi qui ai lu à l'envers... Bon, comme punition faut que je trouve vraiment pourquoi la tension remontée n'est pas 3,3V mais 3,6V...
Et sinon pour la température, y a-t-il une raison pour laquelle tu ne l'affiches pas alors que tu la remontes ? -
@tam Le boitier chauffe au soleil, donc la température mesurée ne veut pas dire grand chose. Je la garde juste en "diagnostic technique". On pourra par exemple tenter de modéliser l'usure de la pile en fonction de la température.
-
@nicolas
Bonsoir,
Sur le dernier GNUVario, j'ai mis un MAX17048 pour mesurer le niveau de charge de la batterie li-ion en I2C et cela fonctionne super bien. Pour une batterie Li-SOCl2, Maxim integrated propose le MAX17201.
https://www.maximintegrated.com/en/products/power/battery-management/MAX17201.html
Tu peux peut être creuser de ce coté...
a+ -
@ratamuse
Ou ce modèle, spécialement conçu pour notre type d'application et cette techno de batterie : https://www.ti.com/lit/ds/symlink/bq35100.pdfMais honnêtement, je ne suis pas très convaincu par cette solution. C'est cher, ça complexifie, et finalement ça ne mesure pas grand chose.
-
Une piste, également, du coté de ces deux fonctions :
uint8_t TD_SIGFOX_PowerVoltage (void);
Retrieve the power supply voltage measured during last SIGFOX transmission.
Returns the power supply voltage value during last SIGFOX transmission in 1/10s of mV plus 2 V if MSB is 0, or plus 3 V if MSB is 1.uint32_t TD_SIGFOX_PowerVoltageExtended(void)
Retrieve the power supply voltage measured during last SIGFOX transmission.
Returns the power supply voltage value during last SIGFOX transmission in mV.Le seul souci, c'est que ça mesure après le régulateur.
-
L'idée globale avec cette techno de batterie, c'est que la tension reste stable, mais la résistance interne augmente.
Il faut donc mesurer la chute de tension lors d'un appel de courant.
A priori, les transmission Sigfox devraient être lissées par la supercap.
La solution "zero budget énergétique", serait de mesurer la chute de tension pendant l'allumage du GPS. Mais c'est seulement une fois tous les X jours (voir même jamais si l'on ne relocalise qu'en cas de déplacement grâce à l'accéléromètre).
Possible d'allumer très brièvement la LED, par exemple une fois par heure. Juste le temps de prendre une mesure avec l'ADC. Mais est-ce que la pile réagit assez rapidement ? Il faudrait tester.
-
Ok, je vais récupérer une dizaine de piles en fin de vie, issues des SAVs Next Model RC.
Ça va permettre de faire des tests. -
http://savoie73.free.fr/battpioupiou.html
permet d'avoir une certaine info/batterie. -
@jr Oui mais seulement lors du démarrage, et pas de manière fiable. Ça affiche parfois 3.6V alors que la pile est HS. L'idéal serait de pouvoir détecter et prévenir de l'usure au moins un mois à l'avance.
-
@nicolas said in Point faible Pioupiou : indicateur état de la pile:
@pascal31 Interne au module TD, donc après le régulateur. C'est d'ailleurs étonnant que ça nous sorte 3.6V, alors que le module est alimenté en 3.3V régulé. Doit y avoir un souci quelque part.
J'ai trouvé une piste pour le 3.6V dans les messages de démarrage / arrêt. Ça pourrait être un souci d'encodage / décodage des trames Sigfox. Je dois vérifier plus en détail.
-
Notes en vrac, pour plus tard :
void PP_SIGFOX_StartupMessage (float windSpeed, float windHeading) { message[0]= SIGFOX_STARTUP_MESSAGE | EncodeWindHeading(windHeading); message[1]=EncodeWindSpeed(windSpeed); message[2]=TD_MEASURE_VoltageTemperature(false); //voltage // embed compilation date in startup message //MMM DD YYYY //01234567890 message[3]=__DATE__[0]; message[4]=__DATE__[1]; message[5]=__DATE__[2]; message[6]=__DATE__[4]; message[7]=__DATE__[5]; message[8]=__DATE__[9]; message[9]=__DATE__[10]; SIGFOX_SEND(message, 10); } voltage in 1/10s of mV plus 2 V if MSB is 0, or plus 3 V if MSB is 1. if (measure >= 3000) { msb = 0x80; measure -= 3000; } else { msb = 0x00; measure -= 2000; } // Divide by 10 with proper rounding measure /= 5; return (measure & 1) ? (measure >> 1) + 1 + msb : (measure >> 1) + msb; voltage in 1/10s of mV plus 2 V if MSB is 0, or plus 3 V if MSB is 1. static uint8_t EncodeVoltage(float milliVolts) { return (uint8_t)(float)((milliVolts / 10. + 0.5) - 200.); } TD_MEASURE_VoltageTemperatureExtended(false); * @return * The measured temperature is given in 1/10 degrees Celsius, the power supply * voltage is given in mV. return (uint8_t)(float)((milliVolts / 10. + 0.5) - 200.); static void ProbeVoltage () { int32_t voltage = TD_MEASURE_VoltageTemperatureExtended(false); if (voltage == 2000) return; // = reading has failed ? if (voltage < voltageMin) voltageMin = voltage; if (voltage > voltageMax) voltageMax = voltage; voltageAvg += voltage; voltageCount++; }