Partage
  • Partager sur Facebook
  • Partager sur Twitter

ARDUINO- BOUCLE CALCUL ERREUR

Formule mathématique inclue dans un programme

    11 avril 2019 à 17:06:20

    Bonjour, je fais appel à votre aide pour un problème dans mon programme.

    Le montage utilise un "inductive sensor grove 2 channel" qui me sort des valeurs dans le moniteurs séries telles que :44230266

    Grâce à des cales étalons plastiques, j'ai réalisé une courbe excel qui me donne une fonction mathématique. En fonction de la valeur de sortie du capteur, je récupère une distance. Sauf que j'aimerai que mon programme m'affiche directement la valeur en millimètre dans le moniteur série. J'ai donc incorporer la fonction dans mon programme (j'ai modifié celui donné dans la bibliothèque)

    Problème, je ne comprends pas comment le programme de base utilise les 2 channel. Il  y en a un appelé CHANNEL_0, et l'autre RESULT_CHANNEL1. Bref déjà ça je ne comprends pas, pourquoi l'un c'est channel0 et l'autre result channel1 alors que dans le moniteur série il m'affiche bien resultchannel0 ???

    Je vous laisse voir le programme (basic_demo) :

    #include "Seeed_LDC1612.h"

    LDC1612 sensor;


    void setup()
    {
        Serial.begin(115200);
        delay(100);
        Serial.println("start!");

        sensor.init();

        if(sensor.single_channel_config(CHANNEL_0))
        {
            Serial.println("can't detect sensor!");
            while(1);
        }


    }


    void loop()
    {
        u32 result_channel1=0;
        u32 result_channel2=0;

        /*shows the status of sensor.*/
        //sensor.get_sensor_status();

        /*Get channel 0 result and parse it.*/
        sensor.get_channel_result(CHANNEL_0,&result_channel1);

        /*sensor result value.you can make a lot of application according to its changes.*/
        if(0!=result_channel1)
        {
            Serial.print("result_channel0 is ");
            Serial.println(result_channel1);
        }
       
        delay(1000);
    }

    ET CE QU'IL DONNE DANS LE MONITEUR SERIE :

    result_channel0 is 44151673
    result_channel0 is 44153718
    result_channel0 is 44153718
    result_channel0 is 44151673

    Grâce à mon Excel, j'obtiens la fonction :

    y = 1E-39x6 - 3E-31x5 + 4E-23x4 - 2E-15x3 + 9E-08x2 - 1,8618x + 2E+07



    Donc je me dis que je n'ai qu'à la rajouter dans le programme ce qui va me donner :

    #include "Seeed_LDC1612.h"

    LDC1612 sensor;
    int (resultchannel0);
    long distance=0;

    void setup()
    {
        Serial.begin(115200); //initialiser le capteur
        delay(100);
        Serial.println("start!"); //démarrage

        sensor.init();

        if(sensor.single_channel_config(CHANNEL_0))
        {
            Serial.println("can't detect sensor!");
            while(1);
        }
    }


    void loop()
    {
        u32 result_channel1=0;
        u32 result_channel2=0;

      
        //sensor.get_sensor_status();

      
        sensor.get_channel_result(CHANNEL_0,&result_channel1);
        distance = ((1*pow(10, -39)*pow(CHANNEL_0, 6))-(3*pow(10, -31)*pow(CHANNEL_0, 5))+(4*pow(10, -23)*pow(CHANNEL_0, 4))-(2*pow(10, -15)*pow(CHANNEL_0, 3))+(9*pow(10, -8)*pow(CHANNEL_0, 2))-(1,8618*(CHANNEL_0))+(2*pow(10, 7)));;

      
        if(0!=result_channel1)
        {
            Serial.print("result_channel0 is ");
            Serial.println(result_channel1);
            Serial.print("distance is ");
            Serial.println(distance);
        }
       
        delay(1000);
    }



    ET SES RESULTATS :

    result_channel0 is 44153718
    distance is 20000000
    result_channel0 is 44152696
    distance is 20000000
    result_channel0 is 44152696
    distance is 20000000
    result_channel0 is 44151673
    distance is 20000000
    result_channel0 is 44154741
    distance is 20000000


    Il me sort une constante.... J'ai vérifié tant de fois la formule du calcul donc je ne pense pas que l'erreur vient de là. Mais plutôt des commandes SerialPrint ou SerialPrintLn mais aussi le fait que j'utilise peut être le mauvais channel. Bref je n'y comprends rien sachant que c'est mon premier programme....


    Merci d'avance pour votre aide.


    • Partager sur Facebook
    • Partager sur Twitter
      12 avril 2019 à 16:11:11

      Bonjour,

      Le résultat de la mesure brute du capteur est dans la variable result_channel1, pas dans CHANNEL_0, qui est une constante qui sert à indiquer à la fonction get_channel_result quel canal est utilisé.

      Au niveau du calcul, même s'il peut renvoyer la bonne valeur avec la fonction pow, tu pourrais plutôt utiliser des multiplications successives pour évaluer le polynôme:

      float coefficients[] = {1e-39, 3e-31, 4e-23, 2e-15, 9e-8, 1.8618, 2e+7};
      
      void loop() {
      ...
      
         float distance = coefficients[0];
         for(int i = 0; i < 6; ++i) {
            distance = distance * result_channel1 + coefficient[i+1];
         }
      ...
      }

      pow est une fonction coûteuse donc il vaut mieux l'éviter quand c'est possible.

      • Partager sur Facebook
      • Partager sur Twitter
        17 avril 2019 à 0:30:34

        Je vous confirme que mon code est correct malgré l'utilisation (abusive peut etre) des pow. Je vais essayer un truc et je reviens vers vous

        -
        Edité par Barxis 17 avril 2019 à 3:06:29

        • Partager sur Facebook
        • Partager sur Twitter
          17 avril 2019 à 3:04:57

          BON !!! J'ai tout revérifié à la calculatrice, et c'est la fonction que me sort excel qui ne va pas..... Je n'arrive donc pas à obtenir une formule correcte. Mon programme arduino avec les POW est bon (vérifié manuellement avec la calculatrice). Quelqu'un pourrait m'aider à extraire la fonction qui relie la VALEUR aux millimètres ???? Sachant que l'arduino me sort la VALEUR et qu'il faut que je la convertisse en MILLIMETRE grâce au tableau obtenu par étalonnage. Merciiii

          millimètre 0 1,031 1,913 2,846 3,788 4,759 4,819 5,701 6,634 7,578 11,366

          14,212

          VALEUR 55346747 53602530 51193172 48910016 47180533 46043444 45958600 45347987 44984440 44751793 44342858

          44230266

          • Partager sur Facebook
          • Partager sur Twitter

          ARDUINO- BOUCLE CALCUL ERREUR

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown