IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Un Else if qui pose problème BOB


Sujet :

Arduino

  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut Un Else if qui pose problème BOB
    Dans mon programme j'utilise des "Else if" pour diriger et donner des ordres à mon robot. Avance, recule, etc...

    Un en particulier pose un problème car il ne veut pas faire ce que je lui demande. Lorsque je lui demande de revenir il ne fait qu'une partie de l'ordre.
    Dans le prog je lui dit de faire demi-tour et avancer, mais il ne fait que le demi-tour et s'arrete. J'ai essayé un tas de choses mais il ne veut rien savoir.

    Voir PARTI DU CODE QUI POSE PROBLEME

    Tous les autres ordres fonctionnent mai pas celui-ci. Je vous mets la partie du code :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    //***********************************************
    //*                                             LOOPING                       *
    //***********************************************
    
    void loop()
    
    {
    
      while (Serial.available())
      {
        delay (2); // lecture car par car
        char c = Serial.read();
        messageRecu += c;
    
      }
      if (messageRecu.length() > 0)
      {
        if ((messageRecu.indexOf("recule") != -1)) { // marche arrière
          Serial.println("recule");
          stopp(); recul(); delay(1000); stopp();
          messageRecu = "";
        }
        else if ((messageRecu.indexOf("bâbord") != -1)) { // moteur stop
          Serial.println("quart-de-tour à gauche");
          turnG(); delay(600); stopp();
          messageRecu = "";
        }
        else if ((messageRecu.indexOf("tribord") != -1)) { // moteur stop
          Serial.println("quart-de-tour à droite");
          turnD(); delay(600); stopp();
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("demi-tour gauche") != -1)) || ((messageRecu.indexOf("retourne gauche") != -1))) { // demi-tour gauche
          Serial.println("demi-tour gauche");
          turnG(); delay(2600); stopp();
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("demi-tour droite") != -1)) || ((messageRecu.indexOf("retourne droite") != -1))) { // demi-tour droite
          Serial.println("demi-tour droite");
          turnD(); delay(2600); stopp();
          messageRecu = "";
        }
        else if ((messageRecu.indexOf("reviens") != -1)) { // Demi-tour et reviens
          Serial.println("reviens");
          stopp(); turnD(); delay(2600); stopp(); avance();          // PARTI DU CODE QUI POSE PROBLEME
          messageRecu = "";
        }
    
        else if ((messageRecu.indexOf("gauche") != -1)) { // tourne à gauche brièvement
          Serial.println ("a gauche");
          turnG(); delay(100); stopp();
          messageRecu = "";
        }
        else if ((messageRecu.indexOf("droite") != -1)) { //tourne à droite brièvement
          Serial.println("a droite");
          turnD(); delay(100); stopp();
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("stoppe") != -1)) || ((messageRecu.indexOf("stop") != -1)) || ((messageRecu.indexOf("arrête") != -1)) || ((messageRecu.indexOf("bouge plus") != -1))) { // moteur stop
          Serial.println("stop"); stopp();
          // Transmission etat LED Rouge
          Wire.beginTransmission(0x02); // Envoyer vers device #Led
          Wire.write(2); // Envoi un 2
          Wire.endTransmission(0x02); // Arreter la transmission
          delay(1000);
          // Transmission etat LED Eteint
          Wire.beginTransmission(0x02); // Envoyer vers device #Led
          Wire.write(0); // Envoi un 0
          Wire.endTransmission(0x02); // Arreter la transmission
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("demi-tour à gauche") != -1)) || ((messageRecu.indexOf("demi-tour gauche") != -1)) || ((messageRecu.indexOf("reviens") != -1))) { // moteur stop
          Serial.println("demi-tour gauche");
          turnG(); delay(2600);
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("demi-tour à droite") != -1)) || ((messageRecu.indexOf("demi-tour droite") != -1)) || ((messageRecu.indexOf("reviens") != -1))) { // moteur stop
          Serial.println("demi-tour droite");
          turnD(); delay(2600);
          messageRecu = "";
        }
    
        else if ((messageRecu.indexOf("repos") != -1)) { // marche avant
          Serial.println("repos");
          Qest_capt_B(); stopp();
          // Transmission etat LED Eteint
          Wire.beginTransmission(0x02); // Envoyer vers device #Led
          Wire.write(0); // Envoi un 0
          Wire.endTransmission(0x02); // Arreter la transmission
    
          delay(5000); //les instructions à répéter tant que la condition est vérifiée
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("avance") != -1)) || ((messageRecu.indexOf("go") != -1)) || ((messageRecu.indexOf("vas-y") != -1)) || ((messageRecu.indexOf("viens ici") != -1))) {
          Serial.println("avance");
          onyva();  //les instructions à répéter tant que la condition est vérifiée
    
        }
        else if ((messageRecu.indexOf("manuel") != -1)) { // marche avant
          Serial.println (messageRecu);
          Qest_capt_B();
          if (((dist_AVCGB < 3) || (dist_AVGB < 3)) || ((dist_AVCDB < 3) || (dist_AVDB < 3)) ||
              ((dist_AVCH < 10) || (dist_COL_F < 10) || (dist_TETE_F < 10))
             )
          {
            recul(); delay(150); stopp();
            messageRecu = "stop";
            messageRecu = "";
          }
          else
          {
            avance();  //les instructions à répéter tant que la condition est vérifiée
          }
        }

    Quelqu'un à une idée, merci

    Cordialement

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    ta variable messageRecu n'a pas de caractères de fin de chaîne le '\0'. Il serait bien que tu affiches son contenu avant ta série de if pour voir ce qu'il y a vraiment. Je me demande si les espaces et les accents dans tes instructions sont bien gérées.

    Pour lire des données sur le port série j'utilise la fonction readBytesUntil(), j'évite aussi les accents, les espaces. J'utilise aussi l'instruction compareTo() pour comparer deux chaînes de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    const int BUF_SIZE = 255;
     
    char *pch;
    char buf[BUF_SIZE];  // buffer de lecture.
    String pStr;
    //...............
     
    void setup()
    {
      memset(buf, 0, sizeof(buf)); // reset
      pch = NULL;
     
      Serial.begin(115200);
    }
     
    void loop()
    {
    n = Serial.readBytesUntil('\n', buf, BUF_SIZE);  // lire le port série jusqu'à un \n (touche Entrée)
     
    if (n > 0)
    {
        pch = strtok(buf, "\n");
        pStr = pch;
    //......
        if (pStr.compareTo("blabla") == 0)
        {
            // faire quelque chose
        }
    //.....
       memset(buf, 0, sizeof(buf));
       pch = NULL;
    }
     
    }

  3. #3
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    Citation Envoyé par Auteur Voir le message
    ta variable messageRecu n'a pas de caractères de fin de chaîne le '\0'.
    Vu qu’il fait += et appelle length dessus ce doit être une String donc pas besoin de gérer le nul final


    Mais oui sur le fond la lecture du port série est mauvaise. (Virer le delay et lire les données quand elles arrivent, traiter la commande quand vous aurez reçu le caractère marquant la fin de la commande, par exemple le \n)

    Les accents et espaces sont bien gérés si c’est dans l’IDE car tout est en UTF8

    Le souci c’est plus un code synchrone avec un protocole asynchrone sans doute mais faudrait voir tout le code

  4. #4
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut
    STOP !!! J'ai trouvé une solution. Pourquoi faire compliquer...

    J'ai supprimé mon ordre "reviens" et modifié l'ordre "avance" en y rajoutant un "if"
    Je vous mets la partie du code modifié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    //***********************************************
    //*                       LOOPING                     *
    //***********************************************
    
    void loop()
    
    {
    
      while (Serial.available())
      {
        delay (2); // lecture car par car
        char c = Serial.read();
        messageRecu += c;
    
      }
      Serial.println(messageRecu);
      if (messageRecu.length() > 0)
      {
        if ((messageRecu.indexOf("recule") != -1)) { // marche arrière
          Serial.println("recule");
          stopp(); recul(); delay(1000); stopp();
          messageRecu = "";
        }
        else if ((messageRecu.indexOf("bâbord") != -1)) { // moteur stop
          Serial.println("quart-de-tour à gauche");
          turnG(); delay(600); stopp();
          messageRecu = "";
        }
        else if ((messageRecu.indexOf("tribord") != -1)) { // moteur stop
          Serial.println("quart-de-tour à droite");
          turnD(); delay(600); stopp();
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("demi-tour gauche") != -1)) || ((messageRecu.indexOf("retourne gauche") != -1))) { // demi-tour gauche
          Serial.println("demi-tour gauche");
          turnG(); delay(2600); stopp();
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("demi-tour droite") != -1)) || ((messageRecu.indexOf("retourne droite") != -1))) { // demi-tour droite
          Serial.println("demi-tour droite");
          turnD(); delay(2600); stopp();
          messageRecu = "";
        }
    
    
    // ORDRE SUPPRIME
    /*    else if ((messageRecu.indexOf("reviens") != -1)) { // Demi-tour et reviens
          Serial.println("reviens");
          stopp(); turnD(); delay(2600); onyva();
    
        }
    */
        else if ((messageRecu.indexOf("gauche") != -1)) { // tourne à gauche brièvement
          Serial.println ("a gauche");
          turnG(); delay(100); stopp();
          messageRecu = "";
        }
        else if ((messageRecu.indexOf("droite") != -1)) { //tourne à droite brièvement
          Serial.println("a droite");
          turnD(); delay(100); stopp();
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("stoppe") != -1)) || ((messageRecu.indexOf("stop") != -1)) || ((messageRecu.indexOf("arrête") != -1)) || ((messageRecu.indexOf("bouge plus") != -1))) { // moteur stop
          Serial.println("stop"); stopp();
          // Transmission etat LED Rouge
          Wire.beginTransmission(0x02); // Envoyer vers device #Led
          Wire.write(2); // Envoi un 2
          Wire.endTransmission(0x02); // Arreter la transmission
          delay(1000);
          // Transmission etat LED Eteint
          Wire.beginTransmission(0x02); // Envoyer vers device #Led
          Wire.write(0); // Envoi un 0
          Wire.endTransmission(0x02); // Arreter la transmission
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("demi-tour à gauche") != -1)) || ((messageRecu.indexOf("demi-tour gauche") != -1))) { // moteur stop
          Serial.println("demi-tour gauche");
          turnG(); delay(2600);
          messageRecu = "";
        }
        else if (((messageRecu.indexOf("demi-tour à droite") != -1)) || ((messageRecu.indexOf("demi-tour droite") != -1))) { // moteur stop
          Serial.println("demi-tour droite");
          turnD(); delay(2600);
          messageRecu = "";
        }
    
        else if ((messageRecu.indexOf("repos") != -1)) { // marche avant
          Serial.println("repos");
          Qest_capt_B(); stopp();
          // Transmission etat LED Eteint
          Wire.beginTransmission(0x02); // Envoyer vers device #Led
          Wire.write(0); // Envoi un 0
          Wire.endTransmission(0x02); // Arreter la transmission
    
          delay(5000); //les instructions à répéter tant que la condition est vérifiée
          messageRecu = "";
        }
    // ORDRE MODIFIE
        else if (((messageRecu.indexOf("avance") != -1)) || ((messageRecu.indexOf("reviens") != -1)) || ((messageRecu.indexOf("vas-y") != -1)))
     {
          if ((messageRecu.indexOf("reviens") != -1)) {
            stopp(); turnD(); delay(2600);messageRecu = "avance";    
          }
    
          Serial.println("avance");
          onyva();  //les instructions à répéter tant que la condition est vérifiée
          
        }
        /*
            else if ((messageRecu.indexOf("manuel") != -1)) { // marche avant
              Serial.println (messageRecu);
              Qest_capt_B();
              if (((dist_AVCGB < 3) || (dist_AVGB < 3)) || ((dist_AVCDB < 3) || (dist_AVDB < 3)) ||
                  ((dist_AVCH < 10) || (dist_COL_F < 10) || (dist_TETE_F < 10))
                 )
              {
                recul(); delay(150); stopp();
                messageRecu = "stop";
                messageRecu = "";
              }
              else
              {
                avance();  //les instructions à répéter tant que la condition est vérifiée
              }
            }

    En tout cas ça fonctionne. Pour ce qui des accents, j'utilise une appli que j'ai crée avec APP INVENTOR (plus de pub). Lors de la reconnaissance vocale les accents y sont, donc, dans le prog il faut les mettre aussi sinon ça ne fonctionne pas.

    Nom : Screenshot_App Inventor1.jpg
Affichages : 98
Taille : 29,5 Ko

    Maintenant je vais m'attaquer à la reconnaissance faciale et d'objets.

    Merci à vous, cordialement.

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    c'est tombé en marche mais ce code pour écouter le port série et recevoir une commande n'est pas génial
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      while (Serial.available())
      {
        delay (2); // lecture car par car
        char c = Serial.read();
        messageRecu += c;
      }

    vous risquez des soucis de perte de données ou de commandes suivant le débit en bauds utilisés, la longueur des commandes et la rapidité d'envoi de deux commandes consécutives par exemple

    le mieux c'est que app inventor envoie une fin de ligne après chaque commande et vous écoutez les commandes séparément

    - tant que vous n'avez pas reçu la fin de ligne vous bâtissez la commande
    - une fois reçue, vous analysez cette commande et remettez tout à zéro pour attendre la prochaine commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    void loop() {
      static bool messageDisponible = false;
     
      if (Serial.available()) {
        // on a reçu un nouveau caractère, on le traite
        char c = Serial.read();
        if (c == '\n') messageDisponible = true;
        else messageRecu += c;
      }
     
      if (messageDisponible) {
     
        // on a un message complet à gérer, on analyse le message
        Serial.println(messageRecu);
     
        if ((messageRecu.indexOf("recule") != -1)) { // marche arrière
          Serial.println("recule");
          stopp(); recul(); delay(1000); stopp();
        }
     
     
        else if ((messageRecu.indexOf("bâbord") != -1)) { // moteur stop
          Serial.println("quart-de-tour à gauche");
          turnG(); delay(600); stopp();
        }
     
     
        else if ((messageRecu.indexOf("tribord") != -1)) { // moteur stop
          Serial.println("quart-de-tour à droite");
          turnD(); delay(600); stopp();
        }
     
     
        else if (((messageRecu.indexOf("demi-tour gauche") != -1)) || ((messageRecu.indexOf("retourne gauche") != -1))) { // demi-tour gauche
          Serial.println("demi-tour gauche");
          turnG(); delay(2600); stopp();
        }
     
     
        else if (((messageRecu.indexOf("demi-tour droite") != -1)) || ((messageRecu.indexOf("retourne droite") != -1))) { // demi-tour droite
          Serial.println("demi-tour droite");
          turnD(); delay(2600); stopp();
        }
     
        else if ...
     
     
     
     
        // une fois le message traité (ou ignoré si commande inconnue)
        // on se prépare à recevori une nouvelle commande
        messageRecu = "";
        messageDisponible = false;
      }
    }

    ce n'est pas parfait parce que si vous envoyez des commandes pendant le traitement par exemple de "demi-tour gauche", vous avez un trou de 2,6 secondes pendant lequel vous n'écoutez pas le port série.

    si des données sont envoyées pendant ce temps là disons à 9600 bauds (j'imagine que vous parlez en BT à votre robot) vous avez potentiellement le temps de recevoir quasiment 2500 caractères... et le buffer du port série n'en contient que 64... ce qui fait qu'une partie des nouvelles commandes sont perdues s'il y a plus de 64 caractères

  6. #6
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut
    Merci J MAY,

    Pour l'instant tout fonctionne, mais je vais quand même garder l'info sous le coude.

    Je cloture le pose poste.

    a bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA]: Nom de champ qui pose problème
    Par Amitom dans le forum Access
    Réponses: 4
    Dernier message: 07/06/2007, 09h26
  2. [D5] Transtypage qui pose problème
    Par MelkInarian dans le forum Delphi
    Réponses: 4
    Dernier message: 06/04/2007, 16h38
  3. requete update qui pose problème
    Par kirian dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/02/2007, 11h20
  4. code qui pose problème
    Par onePersonne dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/10/2006, 14h27
  5. Un cast de SmartPointer qui pose probléme
    Par Higestromm dans le forum C++
    Réponses: 3
    Dernier message: 13/10/2005, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo