Comportement inversé sur nano v3, sur code simple de button

Bonjour,

Je suis ultra débutant en matière de codage arduino et de branchement, du coup histoire d'y aller doucement, je teste des trucs simples.
Je suis sur de l'Arduino nano V3, et je veux tester un des exemples, le 02.Digital->Button.
En gros, si on actionne un bouton connecté sur le pin D2, cela doit allumer la led 13 du nano.
Je simule le bouton avec 2 fils (une sur GND l'autre sur le pin D2) que je fais se toucher quand je veux allumer la led.

Seulement voilà, le nano réagit à l'envers, la led 13 s'allume quand on ne touche à rien, et quand je fais se toucher les fils, elle s'éteint.
J'ai fait le test avec 4 nanos, même résultat.

Il m'étonnerait que le code soit erroné, et que toutes les nanos soient défectueuses.

Donc où est-ce que je me trompe?
La simulation du bouton avec deux simples fils causerait le défaut?

Au cas où j'ai inversé les HIGH et les LOW pour voir, ça ne résout pas le problème, je n'y vois aucune logique.

Je suis un noob, mais cela ne doit pas être un soucis de téléversement, quand je teste le 01.Basic->Blink, ça fonctionne très bien.

Bonjour,

Moi ça ne m'étonnerait pas que le test soit inversé dans le code.
Met ton code (bien sur entre balises de code).

Je ne vois rien d'anormal. La LED s'allume parce que l'entrée D2 est en l'air, donc elle capte tous les parasites environnants, et n'arrête pas d'osciller entre LOW et HIGH.
Lorsque l'on relie D2 à GND elle s'éteint car digitalRead(buttonPin) vaut LOW et dans ce cas on appelle digitalWrite(ledPin, LOW).
Un conseil : renseigne-toi sur : pinMode(buttonPin, INPUT_PULLUP);

En gros je n'aurais pas compris le code?

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

Donc lorsque tu fermes le fil tu appliques un 0 sur D2 ==> D2 = LOW

Et le test ci-dessus applique un LOW sur la LED lorsque l'entrée est à LOW donc cela fonctionne comme prévu

Ce serait bien de remplacer

pinMode(buttonPin, INPUT);

par

pinMode(buttonPin, INPUT_PULLUP);

Afin que l'entrée ne soit pas en l'air lorsque lefil n'est pas connecté.

Bonjour neosayien,

Vous avez un PB en utilisant l'exemple 02.Digital->Button. Si vous traduisez les explications en anglais au début du croquis vous pouvez lire :

Le circuit :
  - LED fixée de la broche 13 à la terre à travers une résistance de 220 ohms
  - bouton-poussoir attaché à la broche 2 à partir de +5V
  - Résistance 10K fixée à la broche 2 depuis la terre

- Remarque: sur la plupart des Arduinos, il y a déjà une LED sur la carte
    attaché à la broche 13.

Un lien vous amène vers le croquis du bouton poussoir.

https://www.arduino.cc/en/Tutorial/BuiltInExamples/Button

l'exemple 02.Digital->Button met en œuvre un montage avec une résistance de pull-down. C'est à dire qu'une résistance de rappel de 10KOhms est utilisée pour amener l'entrée à la masse si l’interrupteur est ouvert. C'est l'inverse pour une résistance de pull-up qui peut être montée en externe mais qui existe également en interne d'où les explications de fdufnews et de hbachetti.
Comme ils vous l'expliquent le code change pour un pull-up interne :
1/ SETUP : pinMode(buttonPin, INPUT_PULLUP);
2/ dans la loop il faut inverser les LOW et HIGH bien sûr.

Voici le montage pour l'exemple 02.Digital->Button :


Bonne journée.

Ok, donc pour cet exemple le bouton fonctionnerait à l'inverse de ce que je pensais, quand on appuie dessus, en fait on rompt le passage de courant pour donner l'info.
Je suppose qu'il y a plusieurs type de bouton, donc plusieurs comportement possible.
Et pour que ça réagisse comme je le pensais, le INPUT_PULLUP est à ne pas oublier.

Merci à tous pour votre aide.

Oui, il y a plusieurs types de boutons, mais le plus courant (et de loin) est le bouton normalement ouvert et qui se ferme quand on appuie dessus.
Ça dépend surtout de la façon dont le bouton est câblé. Il faut que le programme soit en accord avec le câblage.
Comme l'a écrit @philippe86220 le programme que tu as utilisé correspond au câblage décrit dans les commentaires de ce programme.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.