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...
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.
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.
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)
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.
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).
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...
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
× 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.