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 :

Commande montée-descente d'un ascenseur


Sujet :

Arduino

Vue hybride

Nicay34 Commande montée-descente d'un... 16/09/2024, 08h49
f-leb Bonjour, Il y a une faute... 16/09/2024, 13h14
Guesset Bonjour, Les boutons sont... 16/09/2024, 15h50
Nicay34 J'ai corrigé l'erreur. Merci 17/09/2024, 10h13
Jay M vos boutons sont sans rebond ? 16/09/2024, 14h39
jpbbricole Bonjour Nicay34 Ton... 16/09/2024, 17h02
Guesset Bonjour, jpbbricole a... 16/09/2024, 17h34
Jay M une bibliothèque pour gérer... 17/09/2024, 11h23
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2024
    Messages : 2
    Par défaut Commande montée-descente d'un ascenseur
    Bonjour à toutes et à tous,

    Je viens de découvrir ce blog en cherchant des solutions à un problème que je rencontre avec mon code Arduino, et j’aimerais partager mon expérience pour obtenir vos conseils. Je travaille actuellement sur un projet de simulation de montée et descente d’un ascenseur à l’aide de Thinkercad. L’objectif final est de reproduire cette simulation sur une maquette physique.

    Mon objectif

    Dans ce projet, le code doit, dès le lancement de la simulation, n’allumer que la première LED (représentant le rez-de-chaussée) parmi quatre LED disponibles. L’ascenseur simule ensuite une montée ou une descente lorsque l’un des quatre boutons est pressé. Par exemple, si j’appuie sur le bouton correspondant au 4e étage, l’idée est que la LED du rez-de-chaussée reste allumée pendant un certain temps avant de s’éteindre lorsque la LED du premier étage s’allume, et ainsi de suite, avec un délai entre chaque étage pour simuler la progression.

    Le problème rencontré

    Le souci se présente dès que je lance la simulation : toutes les LED s’allument immédiatement comme si l’ascenseur montait d’un coup jusqu’au 3e étage (représenté par la 4e LED). Ensuite, le code fonctionne correctement. Je ne comprends pas pourquoi cela se produit au démarrage, et je suis à la recherche d’idées pour résoudre ce comportement inattendu.

    Voici mon code et le lien de ma simulation :

    https://www.tinkercad.com/things/kVJ...scenseur-esboo

    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
    // Définition des pins pour les LEDs et les boutons
    const int ledPins[] = {13, 12, 11, 10};  // Pins des LEDs
    const int buttonPins[] = {9, 8, 7, 6};   // Pins des boutons
     
    const int numLeds = 4;
    const int numButtons = 4;
     
    int currentFloor = -1;  // Étage actuel 
    bool buttonsPressed[numButtons] = {false, false, false, false};  // État des boutons
     
    void setup() {
      // Initialiser les pins des LEDs comme sorties
      for (int i = 0; i < numLeds; i++) {
        pinMode(ledPins[i], OUTPUT);
        digitalWrite(ledPins[i], LOW);  // S'assurer que toutes les LEDs sont éteintes au départ
      }
     
      for (int i = 0; i < numButtons; i++) {
        pinMode(buttonPins[i], INPUT_PULLUP);
      }
    }
     
    void loop() {
      bool buttonChanged = false;
     
      // Vérifier l'état de chaque bouton
      for (int i = 0; i < numButtons; i++) {
        bool buttonState = digitalRead(buttonPins[i]) == LOW;  // Lire l'état du bouton (LOW signifie pressé)
        if (buttonState != buttonsPressed[i]) {
          // Si l'état du bouton a changé
          buttonsPressed[i] = buttonState;
          if (buttonState) {
            // Si le bouton est pressé
            moveElevator(i);
            buttonChanged = true;
          }
        }
      }
     
      // Ajout d'un délai pour éviter les erreurs
      if (buttonChanged) {
        delay(300);  
      }
    }
     
    void moveElevator(int targetFloor) {
      if (targetFloor != currentFloor) {  // S'assurer que l'ascenseur se déplace seulement si nécessaire
        if (targetFloor < currentFloor) {
          // Déplacer l'ascenseur vers le bas
          for (int i = currentFloor; i >= targetFloor; i--) {
            updateLeds(i);
            delay(1000);  // Attendre un moment avant de changer d'étage
          }
        } else if (targetFloor > currentFloor) {
          // Déplacer l'ascenseur vers le haut
          for (int i = currentFloor; i <= targetFloor; i++) {
            updateLeds(i);
            delay(1000);  // Attendre un moment avant de changer d'étage
          }
        }
        currentFloor = targetFloor;  // Mettre à jour l'étage actuel
      }
    }
     
    void updateLeds(int floor) {
      // Éteindre toutes les LEDs
      for (int i = 0; i < numLeds; i++) {
        digitalWrite(ledPins[i], LOW);
      }
      // Allumer la LED correspondant à l'étage
      if (floor >= 0 && floor < numLeds) {  // Vérifier que l'étage est valide
        digitalWrite(ledPins[floor], HIGH);
      }
    }

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 157
    Billets dans le blog
    47
    Par défaut
    Bonjour,

    Il y a une faute de frappe ou une erreur de copier-coller dans ton lien vers la simulation.

  3. #3
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 599
    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 599
    Par défaut
    Bonjour,

    Les boutons sont munis de résistances de 10 kOhms qui ne servent à rien. En fait si, elles peuvent semer la pagaille.

    Pour l'état haut (bouton non appuyé), pas de problème, la résistance de 20 kOhms du pull_up lève toute ambiguïté.

    Pour l'état bas (bouton appuyé), nous n'aurons pas 0 Volt mais 5V/3 (5V*10k/(10k + 20k)) soit 0.333*5V, là ou le constructeur ne garantit la reconnaissance d'un 0 qu'en dessous de 0.3*5 Volt.

    Il y a une zone d'incertitude entre 0.3*5 V et 0.6*5 V dans laquelle ça peut tomber en marche comme faire n'importe quoi.

    En résumé, supprimer les 10 kOhms des boutons.

    Ceci n'explique cependant pas le problème rencontré que la simulation ne montre pas.

    Salutations

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2024
    Messages : 2
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Bonjour,

    Il y a une faute de frappe ou une erreur de copier-coller dans ton lien vers la simulation.
    J'ai corrigé l'erreur. Merci

  5. #5
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 895
    Par défaut
    vos boutons sont sans rebond ?

  6. #6
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Nicay34

    Ton problème provient, qu'au départ de ton programme les éléments du tableau buttonsPressed[] sont vus comme à true.
    Comme tes boutons sont, par défaut à false (DOWN par la résistance de PULL_DOWN), la condition if (buttonState != buttonsPressed) est vraie, au départ pour tout les boutons, d'où leur allumage simultané.
    Pour corriger ça au départ, il suffit de mettre tout les éléments du tableau à false, sauf l'élément 0, le rez-de-chaussée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      for (int i = 0; i < numButtons; i++) {
        pinMode(buttonPins[i], INPUT_PULLUP);
        buttonsPressed[i] = true;
      }
    buttonsPressed[0] = false; // Rez-de-chaussée
    Cordialement
    jpbbricole

  7. #7
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 599
    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 599
    Par défaut
    Bonjour,

    jpbbricole a raison.

    Le programme suppose des boutons reliés à la masse d'un coté et à l'entrée de l'autre, laquelle entrée est chargée par la résistance de pull_up. Un appui donne donc un zéro sur l'entrée correspondante.

    Mais le montage est tout autre, les boutons sont reliés directement au Vcc d'un côté (ce que je n'avais pas vu ) et à une entrée et une résistance de 10 k à la masse de l'autre (pull_down externe). Il en résulte qu'une pression sur un bouton amène un 1 logique.

    Mon conseil initial suppose donc de recâbler l'ensemble des boutons sans connexion directe au Vcc (court-circuit garantit) ou de garder le montage actuel mais d'inverser les états actifs : buttonState = digitalRead(buttonPins[i]) == HIGH;.

    Salutations

  8. #8
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 895
    Par défaut
    une bibliothèque pour gérer les boutons et leur rebond et une petite machine à état pour gérer le fonctionnement de l'ascenseur simplifieraient bien le code.

    Il faudrait aussi définir ce qu'il se passe si on appuie un bouton quand l'ascenseur est en mouvement (appel mis en mémoire ?).

    N'y a-t-il pas aussi des boutons à mettre dans l'ascenseur si vous voulez que ça corresponde à la réalité ??

    ==> appui bouton palier = mémoriser une demande d'appel de l'ascenseur
    ==> appui d'un bouton dans l'ascenseur = demande de destination.

    Plusieurs appuis peuvent être mémorisés tant que la demande n'a pas été servie.

    ça devrait ressembler peut-être à cela

    Nom : ascenseur.jpg
Affichages : 294
Taille : 109,8 Ko


    PS: parfois on peut aussi avoir deux boutons sur les paliers, un pour monter, un pour descendre... ça complexifie aussi la gestion du trajet de l'ascenseur

Discussions similaires

  1. Interception des commandes in et out
    Par KDD dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 18/12/2002, 16h55
  2. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  3. [Kylix] Commandes linux ss kylix
    Par csnickos dans le forum EDI
    Réponses: 3
    Dernier message: 15/09/2002, 20h24
  4. Réponses: 3
    Dernier message: 02/09/2002, 18h49
  5. Réponses: 2
    Dernier message: 11/08/2002, 21h27

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