Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mode INPUT_PULLUP - Comment ça marche ?

Sujet résolu
    4 janvier 2017 à 16:23:28

    Bonjour,

    Je suis en train de suivre le cours "Programmez vos premiers montages avec Arduino" et je sèche misérablement sur le chapitre des boutons poussoirs, en mode Input_Pullup.

    Si j'ai bien compris le montage d'une résistance en pull-up, la résistance est connectée en direct au 5V et au Pin (déclaré en input). Donc si le BP n'est pas appuyé, le 5V va directement au PIN, d'où la lecture à HIGH.

    Ce que je ne comprends pas, c'est le cas du mode INPUT_PULLUP.

    Que la résistance soit gérée en interne par la carte Arduino, pourquoi pas, mais d'où vient le 5V qui donne la lecture HIGH ? Puisque le pin est en Input, il ne délivre pas de courant...

    Je suis sûr que c'est tout bête, mais ça m'échappe. Alors si quelqu'un peut m'éclairer sur la question...

    Merci,

    Faguoren

    • Partager sur Facebook
    • Partager sur Twitter
    Faguoren
      4 janvier 2017 à 17:31:00

      Salut,

      Quand le pin est en INPUT_PULLUP, le montage est le même que lorsqu'on fait un circuit soi-même avec une résistance pull-up, sauf qu'il est caché à l'intérieur de l'Arduino (c'est l'Arduino qui le fait pour toi) !

      Du coup, tu n'as plus qu'à brancher ton poussoir, et le circuit se comportera exactement comme quand c'est toi qui faisait le montage pullup.

      -
      Edité par Balthaz 4 janvier 2017 à 17:32:10

      • Partager sur Facebook
      • Partager sur Twitter
        4 janvier 2017 à 18:51:59

        Sur la carte arduino, il y a un processeur ATMega qui exécute ton code.

        A l’intérieur de cette puce se trouve des millions de transistors pour former le cœur du processeur.

        Mais il y a aussi des résistances qui peuvent être activée ou non.

        Quand tu passes la pin en INPUT_PULL_UP, la puce va connecter une de ses résistances interne entre sa pin VCC (reliée au 5V) et sa pin d'entrée (reliée à l'une des pins de la carte arduino).

        Au final, cela revient exactement au même que de mettre la pin en INPUT et d'ajouter soit même une résistance entre 5V et la pin.

        Et pour répondre à ta question : le 5V provient du même 5V dont tu te sers quand tu mets manuellement une résistance.

        • Partager sur Facebook
        • Partager sur Twitter
          5 janvier 2017 à 9:07:43

          Merci beaucoup pour ces explications.

          En gros, on peut dire que le pin ne distribue pas de 5V s'il est en mode input, sauf s'il est en PULLUP, c'est ça ?

          • Partager sur Facebook
          • Partager sur Twitter
          Faguoren
            5 janvier 2017 à 9:27:44

            Une pin en mode INPUT ne fournie aucun courant.

            Une pin en mode INPUT_PULLUP peut laisser s'échapper un peu de courant au travers de la résistance mais ce sera vraiment un courant très faible étant donné que la résistance est élevée.

            Pour t'en rendre compte, tu peux connecter une LED sur ta pin :

            • En INPUT : la LED sera éteinte
            • En INPUT_PULLUP : la LED sera très faiblement éclairée (visible dans le noir)
            • Partager sur Facebook
            • Partager sur Twitter
              5 janvier 2017 à 9:44:16

              J'ai peut-être trop simplifié mon résumé, mais c'est ce qui me semblait le plus cohérent pour expliquer le schéma du cours :

              Si on essaye de suivre le sens du courant, il ne peut venir, a priori, que du pin.

              D'un autre côté, il ne s'agit ici que de tester l'état du bouton poussoir. Peut-être n'est-il pas réellement nécessaire d'envoyer du courant dans ce cas.

              • Partager sur Facebook
              • Partager sur Twitter
              Faguoren
                5 janvier 2017 à 14:07:46

                Quand tu n'appuie pas sur le bouton, la pin est dans le vide donc aucun courant ne peut passer.

                La résistance de pull-up interne va polariser l'état logique '1' donc tu vas lire HIGH avec digitalRead.

                --------

                Quand tu appuis sur le bouton, celui-ci force l'état logique '0' et tu vas lire LOW.

                La pin étant sur LOW, il va y avoir un petit courant qui s'échappera de la pin en passant par la résistance interne.

                • Partager sur Facebook
                • Partager sur Twitter
                  5 janvier 2017 à 16:06:08

                  Le pullup interne vaut entre 20k et 50kOhms d'après la datasheet.

                  D'ailleurs, c'est probablement pas une vraie résistance mais plutôt un FET utilisé en tant que résistance commandée (mais vu de l'extérieur on s'en fout).

                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 janvier 2017 à 16:14:02

                    Merci pour ces dernières précisions, c'est bien plus clair maintenant !
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Faguoren
                      5 janvier 2017 à 16:20:51

                      Note que mettre une résistance un peu précise dans une puce, c'est cher, car il faut un masquage de plus à la fabrication (entre autres) pour appliquer le matériau résistif sur la puce. Tandis que des transistors MOS, t'en as autant que tu veux puisque la puce est faite avec ça... Donc ton pullup est fait avec un MOSFET.

                      Avantage : il est commutable.

                      Inconvénient : la valeur de la résistance a une tolérance de +/- genre 50% et dépend aussi fortement de la T°... pour un pullup on s'en fout, mais faudrait pas qu'il te vienne à l'idée d'utiliser ça dans un diviseur de tension pour mesurer quelque chose...

                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 juin 2019 à 9:40:38

                        Bonjour les amis, j'ai un petit soucis. J'ai écrit un petit code dans arduino avec des résistance pull up sur les entrées. J'avais essayé avec un arduino UNO et tout marchait très bien. Mais, depuis quelque jours, j'essai le même programme qui ne donne plus le même résultat: J'ai besoin de votre aide. Merci pour vous réponses.

                        voici le code:

                        int buttonPinA =  2; //NIVEAU HAUT

                        int buttonPinB = 7; // NIVEAU BAS

                        int ledPin = 8;      // select the pin for the LED

                        int buttonValueA = 0;

                        int buttonValueB = 0;

                        void setup() {

                          // declare the ledPin as an OUTPUT:

                          pinMode(ledPin, OUTPUT);

                          pinMode(buttonPinA, INPUT_PULLUP); 

                          pinMode(buttonPinB, INPUT_PULLUP);

                        }

                        void loop() {

                          // read the value from the sensor:

                          buttonValueA = digitalRead(buttonPinA);

                          buttonValueB = digitalRead(buttonPinB);

                          // turn the ledPin on 

                          if (buttonValueA==HIGH)

                            {digitalWrite(ledPin,HIGH);} 

                        if

                        (buttonValueB==LOW)

                          { digitalWrite (ledPin,LOW);}

                         }

                        -
                        Edité par HermannTankpinou 1 juin 2019 à 9:46:39

                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 juin 2019 à 7:21:25

                          Si le programme marchait très bien avant, je pencherais plus sur un problème de cablage ou défaillance d'un capteur.

                          Pourrais tu nous en dire plus sur tes capteurs et la manière dont tu les as raccordé à l'arduino ?

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Mode INPUT_PULLUP - Comment ça marche ?

                          × 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