Problème avec une résistance de pullup

Portrait de Luke

Bonjour à tous,

Avant toute chose, je précise que je suis un grand débutant amateur, je n'ai aucune formation en électronique, mais j'adore les nouvelles technologies.J'ai découvert arduino il y a quelques jours, j'ai commandé un kit de démarrage et en attendant mon colis, je m'entraine sur le site tinkercad ( je pense que vous connaissez ).

J'ai suivi les tutoriels de la chaine U=RI,qui m'ont amené ici.

Je bloque sur le tuto suivant.

En fait tout fonctionne parfaitement, j'ai reproduit le schéma de la vidéo, mais quand il parle "d'enlever la résistance de pullup", chez moi ça ne marche plus, la LED ne s'allume pas et le bouton n'a aucun effet.

J'imagine qu'il y a quelquechose à recabler, j'ai tout essayé en fait ( un peu au hasard j'avoue ), En recablant le bouton poussoir sur le +, j'ai remarqué que la LED s'allume de nouveau, mais le bouton n'a plus aucun effet sur la LED.

Si quelqu'un veut bien m'expliquer la marche à suivre, et le pourquoi, ce serait très sympa :)

Voici où je me suis arrêté sur ce tuto ( tout fonctionne avec ce schéma et ce code ) :

sans-titre-1.jpg

  int portPushButton = 13;
  int portLED =2;
  int etatPushButton = HIGH;

void setup() {
  pinMode(portPushButton, INPUT);
  pinMode(portLED, OUTPUT);
  
}

void loop() {
  etatPushButton = digitalRead(portPushButton);
  
  if (etatPushButton == HIGH)
  {
    digitalWrite(portLED, HIGH);
  } 
    else
    {
      digitalWrite(portLED, LOW);
    }
}

Merci d'avancepour vos réponses

Portrait de Walter

Bonjour, dans ton code tu n'a pas changé INPUT en INPUT_PULLUP qui doit aller avec la suppression de la résistance.
L'arduino contient déjà une résistance de pullup, donc si tu active ton entré avec cette résistance interne, tu n'es pas obligé d'en utiliser une sur ta breadboard.
 

Portrait de Luke

Merci walter pour ta réponse.

En fait, même en mettant  pinMode(portPushButton, INPUT_PULLUP),ça ne fonctionne pas .... Voilà où j'en suis,la LED s'allume mais le bouton poussoir n'a aucun effet...

Là je sèche, voilà où j'en suis, j'ai rajouté INPUT_PULLUP  supprimé la résistance et recablé le + sur le bouton poussoir :

sans-titre-4.jpg

  int portPushButton = 13;
  int portLED =2;
  int etatPushButton = HIGH;

void setup() {
  pinMode(portPushButton, INPUT_PULLUP);
  pinMode(portLED, OUTPUT);
  
}

void loop() {
  etatPushButton = digitalRead(portPushButton);
  
  if (etatPushButton == HIGH)
  {
    digitalWrite(portLED, HIGH);
  } 
    else
    {
      digitalWrite(portLED, LOW);
    }
}

Merci encore pour votre aide :)

Portrait de Walter

pourquoi tu as remplacé la résistance par le fils?
Sur la vidéo il n'es pas question, uniquement d'enlever la résistance ?

Puisque tu demande à l'arduino une résistance en PULLUP branché sur le +5V d'un coté et à l'entrée digital de l'autre.
si tu connecté l'entrée de l'arduino aussi au +5V, ta résistance ne sert à rien puisqu'au même potentiel des deux cotés. 

Portrait de Luke

En fait,quand j'enlève simplement la résistance, il ne se passe plus rien, La LED ne s'allume plus .... en rajoutant ce fil elle s'allume .... je comprend pas trop là

Portrait de wolfram69

Bonjour Luke

Ne cherche pas plus longtemps, tu n'as pas de chance car il y a un bug sur l'entrée 13 dans Tinkercad la fonction pullup ne fonctionne pas elle est bien active sur les Arduino UNO réel. Cela vient sans doute du fait que cette entrée est aussi matérialisée pas la LED ( LED_BUILTIN ) qui de trouve sur les cartes Arduino.

Donc change la pin 13 par la pin 12 par exemple et INPUT_PULLUP fonctionnera.

Par contre sur une vrai carte Arduino UNO si tu ne mets pas de résistance de Pullup ni le paramètre INPUT_PULLUP sur l'entrée tu risques de voir ta LED clignoter de manière alléatoire car celle ci est soumises aux champs électromagnétique de l'environnement dans lequel elle est !

Si je peux me permettre, tu écris :

int etatPushButton = HIGH;  // de déclarer cette variable à HIGH ne sert strictement à rien

Ton code je pense fonctionne à l'envers car la LED s'éteint quand le bouton est rélâché et inversement

Pour débuguer un circuit je te conseille d'utiliser le port série associé à des Serial.println(xxx); dont xxx réprésente une variable quelconque et par exemple dans ton cas

Serial.println( digitalRead(portPushButton) ); tu verras alors qu'il n'y a aucun changement !

Pour simplifier ton code tu peux écrire cela :

int Button = 12;
int LED = 2;
void setup() {
  pinMode(Button, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
}
void loop() {
  digitalWrite(LED, digitalRead(Button)); // tu attribues ici directement la valeur lue !
}

  /* Pour inverser le fonctionnement remplace ajoute un "!" devant digitalRead(Button) comme ceci :

    digitalWrite(portLED, !digitalRead(Button)); */

Portrait de Luke

Merci pour ta réponse ! Effectivement en passant sur la broche 12 ça fonctionne normalement.

J'ai testé ton code, effectivement il est + propre, plus simple, et plus court :)

Au passage, existe-t-il une bonne alternative à tinkercad ?? Il est bien mais je pense qu'on peut trouver mieux :)

Portrait de wolfram69

Pour l'instant, en ce qui concerne les simulateurs, je ne pense pas, enfin simulateurs gratuit, il en existe mais hors de prix style Eagle avec les addin's.

Juste un petit truc pu coder !

Évite les variables avec des noms très long, c'est en général source d'erreur et souvent beaucoup moins parlant, n'utilise que les mots anglophones lorsqu'il sont plus courts et intelligibles par un epu tout le monde. Enfin c'est ma façon de faire et je m'y retrouve beaucoup plus facilement.

Portrait de Luke

Oui tu as raison, merci du conseil !

Une autre question,un peu hors sujet :D ....

J'ai remarqué que si je connecte une LED sur un port digital, j'ai du courant sur le +.

Par contre quand je connecte une LED sur un port analogique, il n'y a pas de courant... je suis obligé d'aller chercher une autre source de courant. ( ce qui augmente le nombre de cables à utiliser )

Je me trompe sûrement, mais à mon avis c'est parce qu'on parle " d'entrées /sorties digitale " et " d'entrée analogique " ? Pouvez-vous m'éclaircir sur ce point ? 

Merci encore :)

Portrait de wolfram69

Les ports analogiques peuvent aussi être déclarés en digital exemple

pinMode(A0 , OUTPUT);
ou pinMode( A1, INPUT_PULLUP);

Il n'y a que des entrées Analogiques ! Si tu applique une tension entre 0 et 5 volts sur A5 par exemple

Tu pourras lire une valeur proportionnelle de 0 à 1023 par la fonction analogRead(A5);

regarde en bas à droite on peut chatter ici !

Ai-je répondu à ton attente ?

Par contre on peux simuler une sortie Analogique  Sur la sortie 7 par exemple :

pinMode(8, OUTPUT);

analogWrite(8,255);

Mais ce n'est qu'un simulation de sortie Analogique voir ici :

https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion

Portrait de Walter

Bonjour, pour que tu es du courant, il faut que ta broche soit positionné au niveau HIGH(+5V).
si tu es sur une broche définie en INPUT, normalement elle ne devrait pas être fixé à un potentiel particulier(+5V), notamment pour une entrée analogique.
Sauf si tu la positionne explicitement comme tu l'a fait dans ton programme initial pour ton entrée digital.

un lien vers le diagramme de sortie de l'arduino Uno

Portrait de Luke

Ok merci pour ces précisions, j'y vois un peu plus clair :)

Portrait de wolfram69

Je viens de trouver un simulateur que je ne connaissais pas il y a peu de temps c'est Simulide

Par contre j'ai galèré pour ne plus avoir de message d'erreur si vous êtes intéressé je ferais un tuto, mais pour le moment j'ai simplement testé Blink avec succès !

Portrait de Luke

Alors j'ai testé rapidement Simulide, c'est pas mal, mais je n'arrive pas à lancer le programme, il y a des erreurs. Visiblement je dois créer un chemin vers un dossier, enfin c'est pas très clair ...; comment il faut faire ?

Portrait de wolfram69

Je connais les tutos que j'ai trouvé sont Nuls il ne donnent pas toutes les trucs et astuces.

Si tu es MAJEUR et uniquement si tu es MAJEUR il est possible, si tu veux de se joindre pas téléphone, les échanges de 06 se feront par le tchat dans l'affirmative.

Portrait de wolfram69

J'ai profité de ce sujet pour créer un tuto qui permet de mieux utiliser SimulIde donc il vous faudra aller ici

Portrait de Luke

super merci beaucoup je vais jeter un oeil :)