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 :

Boucle while infinie


Sujet :

Arduino

  1. #1
    Membre éclairé
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Points : 665
    Points
    665
    Billets dans le blog
    3
    Par défaut Boucle while infinie
    Salut tout le monde!
    Je travaille actuellement avec mon groupe en technologie pour faire une maquette d'une maison tournante.
    Le but est de faire une maison qui va tourner suivant la direction du soleil.
    Pour cela j'utilise un arduino uno avec un base shield V2 où je branche deux capteur de luminosité en A0 et en A3. J'utilise aussi un motor sheild pour contrôler mes moteurs qui sont eux même alimentés via le moto shield par une pile 9V.
    Les deux capteurs de luminosité sont placés côte à côte sur la maison et ce que je fais dans le programme c'est que je fais une comparaison entre les variables qui reçoivent le nombre de lux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Tant que (CapteurDroite > CapteurGauche) {<div style="margin-left:40px">Tourner la maison à droite
    Récupérer la valeur des deux capteurs</div>}
     
    Tant que (CapteurGauche > CapteurDroite) {<div style="margin-left:40px">Tourner la maison à gauche
    Récupérer la valeur des deux capteurs</div>}
     
    Tant que (CapteurDroite == CapteurGauche) {<div style="margin-left:40px">Arrêter les moteurs
    Récupérer la valeur des deux capteurs</div>}
    Mon problème est que je reste toujours dans la boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tant que (CapteurGauche > CapteurDroite) {<div style="margin-left:40px">Tourner la maison à gauche
    Récupérer la valeur des deux capteurs</div>}
    //même si je cache l'un des capteurs avec mon pouce
    Voilà une partie du programme sans les capteurs fin de course, la LED d'alerte et le bouton d'arrêt d'urgence:
    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
    void setup()
    {
      //Moteur
      pinMode(12, OUTPUT); //Moteur sur le pin 12 (A)
      //LOW -> droite
      //HIGH -> gauche
    }
     
    void loop()
    {
      //Capteur de luminosité
      int CDroitP = 3;
      int CGauchP = 0;
     
      //Récupération de la luminosité
      int DroitL = analogRead(CDroitP);
      int GauchL = analogRead(CGauchP);
     
      //Tant que la luminosité à droite > gauche alors tourner à droite
      while (DroitL > GauchL) {
        //Attendre 500MS
        delay(500);
     
        //Faire tourner le moteur à droite avec sa vitesse maximal
        digitalWrite(12, HIGH);
        analogWrite(3, 255);
     
        //Récupération de la luminosité
        int DroitL = analogRead(CDroitP);
        int GauchL = analogRead(CGauchP);
      }
     
      //Tant que la luminosité à gauche > droite alors tourner à gauche
      while (GauchL > DroitL) {
        //Attendre 500MS
        delay(500);
     
        //Faire tourner le moteur à gauche avec sa vitesse maximal
        digitalWrite(12, LOW);
        analogWrite(3, 100);
     
        //Récupération de la luminosité
        int DroitL = analogRead(CDroitP);
        int GauchL = analogRead(CGauchP);
      }
     
      //Si DroitL = GauchL alors stop
      if (DroitL == GauchL) {
        //Attendre 500MS
        delay(500);
     
        //Arrêt du moteur
        analogWrite(3, 0);
     
        //Récupération de la luminosité
        int DroitL = analogRead(CDroitP);
        int GauchL = analogRead(CGauchP);
      }
    }
    Merci d'avance!


    PS: Il me faudrait une technique en C pour pouvoir faire une troncature sur les lux récupérer car je ne pense pas qu'on arriveras à avoir exactement Droite == Gauche!
    Cordialement,
    Herman Adrien.

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Citation Envoyé par BlackoOSX Voir le message
    PS: Il me faudrait une technique en C pour pouvoir faire une troncature sur les lux récupérer car je ne pense pas qu'on arriveras à avoir exactement Droite == Gauche!
    Abs(Droite - Gauche) > Seuil, ou seuil est la valeur de la différence entre les 2 mesures en dessous de laquelle tu considère qu'elles sont égales.

    Et je pense que ton problème vient de là, de tes mesures qui ne sont et ne seront probablement strictement égales
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre éclairé
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Points : 665
    Points
    665
    Billets dans le blog
    3
    Par défaut
    Salut!
    Merci de votre réponse si rapide!
    Le problème c'est que quand je cache l'un des capteurs avec mon pouce sa valeur en lux devrais être proche de 0 donc il devrais changer de sens. Pour l'instant je reste sur mon problème de changement de direction. L'arrêt des moteurs on verras plus tard.
    Cordialement,
    Herman Adrien.

  4. #4
    Membre éclairé
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Points : 665
    Points
    665
    Billets dans le blog
    3
    Par défaut Code
    Salut!
    Je me suis repenché sur le sujet, j'ai avancer le code et j'ai modifier les boucles while. Ce ne sont plus des boucles mais tout simplement des if parce que de toute façon le loop() est une boucle donc cela ne change rien. J'ai essayé votre méthode :
    Abs(Droite - Gauche) > Seuil
    Mais je ne comprends pas trop comment cela marche. J'ai été sur un site: http://www.tutorialspoint.com/c_stan...nction_abs.htm et apparement il faut inclure studio.h et stdlib.h.
    Je ne suis qu'un débutant en Arduino et aussi en C alors je me demande à quoi servent ces librairies? Je ne comprends pas aussi comment marche le "Seuil" dont vous parlez. Est-ce toutes les valeurs < ou > à par exemple 5 qu'il va retenir pour une variable. Comment utilise-ton "abs"? De cette façon?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int VARIABLE = abs(VARIABLE2 - VARIABLE3) > ou < Seuil;
    Merci d'avance!
    Cordialement,
    Herman Adrien.

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Alors pour commander, il faut inclure les .h. Ces .h contiennent les déclaration de fonctions contenues dans les librairies correspondantes.

    Dans ton programme, tu fais appel en permanence à des fonctions (abs en est une). A la compilation, le compilateur doit connaitre la signature, ou la déclaration de cette fonction pour savoir si ton appel est correct. En gors il s'agit du nombre et du type de paramètre que le fonction attend et du type de la valeur de retour qu'elle renvoie. Tout cela est contenu dans les fichiers .h.

    Quant à la fonction Abs, il s'agit de l'implémentation de la fonction mathématique Valeur Absolue.

    Lorsque tu fait VARIABLE1 - VARIABLE2, cela va te donner comme valeur l'écart entre les 2 valeurs. Cet écart peut être positif ou négatif suivant les valeurs de VARIABLE1 et VARIABLE2.
    ABS permet de s'affranchir du signe de cet écart pour ne garder que sa valeur.

    LE principe du seuil est que :
    1 - On part sur la base que, compte tenu de la précision de la mesure, compte tenu de divers paramètres, tes valeurs VARIABLE1 et VARIABLE2 seront très certainement jamais strictement égales.
    2 - Compte-tenu de ce que représentent ces valeurs, on peut considérer que 2 valeurs très proches, bien que pas égales représentent quand même pour nous une même valeur égale. La différence étant mise sur le compte de l’imprécision tolérée.

    Cette imprécision tolérée est justement notre valeur de seuil. Si la différence entre les 2 valeurs (donc ABS(VARIABLE1 - VARIABLE2) est en dessous de cette imprécision (donc notre Seuil) on considère les valeurs égales

    ABS(VARIABLE1 - VARIABLE2) <= Seuil ---> On considère les valeurs égales et on traite comme tel
    ABS(VARIABLE1 - VARIABLE2) > Seuil ----> On considère les valeurs différentes (on pas encore égale, dans ton processus) et on traire comme tel.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  6. #6
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    bonsoir,

    stdio.h (STandarD Input Ouput) et stdlib.h. (STandarD LIBrairie) sont des bibliothèques C et C++. Pour utiliser la fonction abs() il faut les ajouter dans ton code.

    Mais pour programmer ton Arduino tu n'as pas besoin de les appeler explicitement :
    https://www.arduino.cc/en/Reference/Abs

    Pour l'utiliser :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    double seuil = 0.1;
    double var1 = 2.00;
    double var2 = 4.00;
     
    if (abs(var1-var2) > seuil)
    {
        // code
    }


    [edit]sevyc64 m'a devancé.... [/edit]

Discussions similaires

  1. boucle while infini!
    Par guizaniseifislam dans le forum Langage
    Réponses: 2
    Dernier message: 02/03/2012, 01h30
  2. Boucle do while infinie
    Par Ironxynalate dans le forum SAS Base
    Réponses: 2
    Dernier message: 19/06/2011, 10h25
  3. Boucle à l'infini avec While et un Reader
    Par mrocks dans le forum Windows Forms
    Réponses: 5
    Dernier message: 16/06/2009, 16h13
  4. Boucle while infinie
    Par god_enel dans le forum C
    Réponses: 1
    Dernier message: 16/04/2007, 11h35
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

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