Navigation

    OpenWindMap

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    🚨 Point faible Pioupiou : indicateur état de la pile

    Windbird
    5
    16
    929
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • nicolas
      nicolas last edited by nicolas

      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é.

      pascal31 1 Reply Last reply Reply Quote 0
      • pascal31
        pascal31 @nicolas last edited by

        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.

        Administrateur OWM.
        Bricolage: balise OWM Arduino compatible 3 capteurs : https://github.com/pcaunegre/MkrfoxWindShield

        nicolas 1 Reply Last reply Reply Quote 0
        • nicolas
          nicolas @pascal31 last edited by nicolas

          @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.

          T nicolas 2 Replies Last reply Reply Quote 0
          • T
            Tam @nicolas last edited by Tam

            @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à.

            nicolas 1 Reply Last reply Reply Quote 0
            • nicolas
              nicolas @Tam last edited by

              @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.c

              static 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++;
              }
              
              T 1 Reply Last reply Reply Quote 0
              • T
                Tam @nicolas last edited by Tam

                @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 ?

                nicolas 1 Reply Last reply Reply Quote 0
                • nicolas
                  nicolas @Tam last edited by

                  @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.

                  R 1 Reply Last reply Reply Quote 0
                  • R
                    Ratamuse @nicolas last edited by

                    @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+

                    nicolas 1 Reply Last reply Reply Quote 0
                    • nicolas
                      nicolas @Ratamuse last edited by nicolas

                      @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.pdf

                      Mais 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.

                      nicolas 1 Reply Last reply Reply Quote 0
                      • nicolas
                        nicolas @nicolas last edited by nicolas

                        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.

                        nicolas 1 Reply Last reply Reply Quote 0
                        • nicolas
                          nicolas @nicolas last edited by nicolas

                          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.

                          nicolas 1 Reply Last reply Reply Quote 0
                          • nicolas
                            nicolas @nicolas last edited by

                            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.

                            jr 1 Reply Last reply Reply Quote 0
                            • jr
                              jr @nicolas last edited by

                              http://savoie73.free.fr/battpioupiou.html
                              permet d'avoir une certaine info/batterie.

                              nicolas 1 Reply Last reply Reply Quote 0
                              • nicolas
                                nicolas @jr last edited by nicolas

                                @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.

                                1 Reply Last reply Reply Quote 0
                                • nicolas
                                  nicolas @nicolas last edited by

                                  @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.

                                  nicolas 1 Reply Last reply Reply Quote 0
                                  • nicolas
                                    nicolas @nicolas last edited by

                                    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++;
                                    }
                                    
                                    
                                    1 Reply Last reply Reply Quote 0
                                    • 1 / 1
                                    • First post
                                      Last post