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 :

Pb commande moteur + LED simultanné


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Retraité bricoleur
    Inscrit en
    Juillet 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Retraité bricoleur

    Informations forums :
    Inscription : Juillet 2023
    Messages : 6
    Par défaut Pb commande moteur + LED simultanné
    Bonjour, je souhaite piloter un moteur avec courte acceleration et faire clignoter une LED pendant tout le temps que le moteur tourne. J'ai ecrit un programme avec une sortie analogique connectée à une LED pour simuler le moteur, et une autre LED pour le clignotement. Elle s'allume mais ne clignote pas. JE ne comprends pas pourquoi. Ci dessous le code :

    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
    void Ouverture() {
      Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
      previousTime=millis();
      currentTime=millis();
      while (Etat_fin_course_ouvert == LOW) {
        analogWrite(analog_Out_moteur_ouverture, Output_Moteur_Ouverture);
        currentTime = millis();
        if((currentTime-previousTime)>2000){
          previousTime=currentTime;
          if (etat_led_moteur == 0) {
            digitalWrite(led_moteur, HIGH);
           }
          else {
            digitalWrite(led_moteur, LOW);
          }
          etat_led_moteur == !etat_led_moteur;
        }
        if (Output_Moteur_Ouverture < 255) {
          Output_Moteur_Ouverture = Output_Moteur_Ouverture + 1 ;
          delay (Tempo_Acceleration) ;
        }
        Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
      }
    analogWrite(analog_Out_moteur_ouverture, 0);
    }
    Merci pour votre aide

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 791
    Par défaut
    Hello,

    Ligne 16, pas == qui est une comparaison, mais = qui est une assignation.

    Edit: le clignotement de la led ne se fait que toutes les 2 secondes. Est-ce voulu ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Retraité bricoleur
    Inscrit en
    Juillet 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Retraité bricoleur

    Informations forums :
    Inscription : Juillet 2023
    Messages : 6
    Par défaut
    Merci beaucoup, j'ai cherché longetemps dans les boucles alors que c'était une simple erreur ! Par contre cette instruction erronée n'est pas détectée par le compilateur, ça signifie qu'elle est autorisée. Mais à quelle fin ? car le résultat de cette comparaison n'est pas mis dans une variable

  4. #4
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 791
    Par défaut
    Cette ligne n'est aboslument pas erronée. Et si elle n'est pas signalée par le compilateur, c'est que les options de compilation sont insuffisantes. Si je compile ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(void) {
    	int k=0;
     
    	k==!k;
     
    	return(0);
    }
    sans option, je n'ai aucun message. Avec l'option -Wall, j'ai le message

    kk.c: In function 'main':
    kk.c:4:10: warning: statement with no effect [-Wunused-value]
    4 | k==!k;
    | ~^~~~
    Perso, je compile toujours avec -Wall -Wextra. Ne pas me demander comment les ajouter à la chaine de compilation pour arduino, je n'en ai pas la moindre idée.

  5. #5
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Citation Envoyé par Sansvingt Voir le message
    ! Par contre cette instruction erronée n'est pas détectée par le compilateur, ça signifie qu'elle est autorisée. Mais à quelle fin ? car le résultat de cette comparaison n'est pas mis dans une variable
    Oui une opération sans objet ni effet de bord est autorisée dans le langage. Elle est généralement reportée si on a tous les warnings actifs car l’optimisation va tout simplement dégager cette ligne.

    Pour l’IDE arduino on peut rajouter les options de compilation qui donnent plus de détails dans les préférences. (Activer tous les warnings)

    —————
    D’ailleurs ça me fait penser que Souvent on fait l’erreur inverse et on met dans un test = au lieu de ==

    Il faut se pencher sur la spécification du langage c++ pour comprendre pourquoi c’est correct et donc le Compilateur n’a pas à vous dire que c’est faux :

    La spec dit qu’un test prend la forme
    if (condition) statement
    Où statement est exécuté si la condition s’évalue à vrai.

    Votre condition était une expression d’affectation d’une variable disons X = 3

    Une assignation est une expression qui met la valeur calculée à droite du signe égal dans la variable qui est à gauche du signe égal puis ça retourne comme valeur d’expression cette valeur

    Donc la condition X=3 met 3 dans X et vaut 3. Pour l’évaluation de la condition c’est comme si on avait écrit
    if (3) expression
    (Avec en plus le fait que X ait pris cette valeur)

    Donc le compilateur doit mettre du code pour décider si 3 est vrai ou faux. Il y a une règle en C et C++ qui dit que un nombre peut être implicitement promu en valeur de vérité (booléen) et que 0 c’est faux et toute autre valeur c’est vrai.

    Donc 3 s’évalue à vrai et le statement est exécuté

    Tout ceci suit parfaitement la définition du langage.

    C’est une spécificité ancienne qui permettait d’optimiser du code plutôt que d’écrire deux lignes
    X = un calcul
    if (X != 0) faire quelque chose

    On pouvait écrire
    if (X = un calcul) faire quelque chose
    Le résultat du calcul restait dans des registres à la compilation et donc c’était plus efficace.

    Depuis les compilateurs et optimiseurs ont évolué et la version a deux lignes est compilée de la même façon que la version a une seule ligne, mais c’est resté dans la spécification pour compatibilité avec l’historique.

    C’est un piège dans lequel on tombe souvent au début. Une bonne chose à se rappeler c’est que l’on doit toujours commencer par la constante quand on écrit un test qui en comporte une.

    Si au lieu d’écrire
    if (X == 3) faire quelque chose
    J’écris
    if (3 == X) faire quelque chose
    C’est le même test et donc ça fonctionne pareil mais si je me trompe et que j’oublie un =
    if (3 = X) faire quelque chose
    Alors le compilateur va mettre une erreur car on ne peut pas affecter une nouvelle valeur à une constante

    ==> ça évite donc ce genre d’étourderie

  6. #6
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour,

    Le fait qu'une expression ait une valeur permet aussi de faire des affectations multiples à la suite : i = j = k = 5;

    C'est issu d'une époque où la concision était de mode (sauf pour les switch ).

    Salutations

Discussions similaires

  1. Commande moteurs de fort puissance via Arduino
    Par akuma8 dans le forum Arduino
    Réponses: 2
    Dernier message: 30/11/2014, 11h21
  2. Commande de led avec le port serie
    Par valdano dans le forum MATLAB
    Réponses: 0
    Dernier message: 24/04/2013, 18h23
  3. Commande moteur pas à pas via port parallèle
    Par -N4w4k- dans le forum Robotique
    Réponses: 9
    Dernier message: 05/04/2012, 00h00
  4. Commander une LED reliée au port //
    Par orfix dans le forum C
    Réponses: 6
    Dernier message: 12/08/2009, 16h36
  5. pic16f877, commande moteur
    Par bibom dans le forum C
    Réponses: 5
    Dernier message: 18/11/2006, 23h42

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