Go Down

Topic: Input et bouton poussoir (Read 2949 times) previous topic - next topic

gerse

Nov 05, 2011, 06:52 pm Last Edit: Nov 05, 2011, 07:58 pm by Jean-François Reason: 1
Bonjour à tous
Pour les présentations, je suis tout neuf sur le forum, sur arduino et l'électronique en général  :smiley-red:...

Je fais des essais sur les inputs et les boutons poussoir et il y a des choses que je ne comprends pas.

Voici le schéma:


1) Pourquoi la borne input est par défaut à 1?
2) Peut on "initialiser" cette valeur à 0?
3) Pourquoi faut-il obligatoirement créer un court circuit pour passer à la valeur 0  :smiley-eek-blue:?
4) N'y aurait il pas un moyen plus "propre" d'arriver à ce résultat d'autant que l'on a un switch qui ouvre et ferme le circuit?

Merci beaucoup pour votre temps et vos réponses
Serge

P.S. Ici mon bout de code qui vient du kit que j'essaye. Rien que du basic (mais en C hahah!) mais déjà il ne fait pas ce qu'il dit puisque, bouton pressé, la led est eteinte, sinon allumée
 

Code: [Select]
// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 7;     // 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);    
 Serial.begin(9600);
}

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:
 Serial.print("buttonState = "); Serial.println(buttonState);
 if (buttonState == HIGH) {    
   // turn LED on:    
   digitalWrite(ledPin, HIGH);  
 }
 else {
   // turn LED off:
   digitalWrite(ledPin, LOW);
   
 }
}


jfs

Pour directement prendre les bonnes habitudes, mets ton code entre les balises "code" le bouton avec le #  XD
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

al1fch

#2
Nov 05, 2011, 08:42 pm Last Edit: Nov 05, 2011, 08:49 pm by al1fch Reason: 1
Bonjour

J'ai bien peur que le code et le schéma ne soient pas fait (tels quels) l'un pour l'autre.
Sur le schéma la résistance R1 (entre +5V et D7) amène une état haut ("1") quand le bouton n'est pas actionné. Pour avoir un état bas ("0") il faut 'tirer' l'entrée D7 vers la masse.
Le 'court-circuit' créé par l'appui sur le bouton emporte le 'bras de fer' avec R1 => état bas garanti sur D7
(pour imposer une tension rien de tel qu'un bon "court-circuit")

Le code fonctionnerait par contre comme prévu en permutant R1 et le bouton poussoir =
Une résistance qui tire vers la masse et un 'court-circuit' qui tire vers +5V

J'ai mis entre guillemets le mot "court-circuit" comme il était employé dans la question.
En fait le vrai court-circuit, le 'mauvais' se produirait si l'on remplaçait R1 par un fil ou une résistance de trop faible valeur. L'appui sur le bouton créerait un passage direct entre +5V et la masse.... et ça ce n'est pas recommandé du tout !

R1 a donc deux rôles sur le schéma montré :
-bouton relâché : amener +5V sur D7
-bouton appuyé : limiter le courant descendant du +5V vers la masse à travers le bouton (0,5 mA)

piif

#3
Nov 05, 2011, 09:55 pm Last Edit: Nov 05, 2011, 10:06 pm by piif Reason: 1
Je n'ai que quelques jours d'avance sur toi, alors j'en profite pour frimer ;-)

Pour préciser la réponse précédente, le point important, c'est que si un connecteur (ici D7) est "en l'air", son état logique est incertain (et n'arrête pas de changer), c'est pourquoi il faut toujours qu'il soit explicitement à 0 ou à +5, ce qui se fait en le reliant soit à GND soit à Vin, le tout en faisant attention qu'il n'y ait jamais de liaison directe entre 0 et +5, ce qui ferait alors un "mauvais court circuit".

En passant, le schéma peut être simplifié, en enlevant la résistance entre + et D7, et en effectuant un digitalWrite(HIGH) sur D7, ce qui active un "pull up resistor" interne, qui fait exactement la même chose (voir la doc de digitalWrite pour les détails).

à+ (en espérant avoir été utile)

gerse

Hello

Effectivement en inversant les 2 composants le programme tourne juste :D.
Je n'avais pas imaginé les choses de ce point de vu.

J'ai donc maintenant:
Bouton relâché: état 0
Bouton appuyé: état 1

Mais dans ce cas, j'ai une tension qui traverse perpétuellement ma résistance R1 ?

Si à la question la réponse est oui, alors y a-t-il d'autres moyens pour avoir un switch "neutre" ou ca se construit toujours comme ca?

En tous cas merci pour ces infos qui m'ont bien aidé à comprendre. et je n'oublierais plus les # pour mon code ;)
Serge

al1fch

#5
Nov 05, 2011, 10:34 pm Last Edit: Nov 05, 2011, 10:35 pm by al1fch Reason: 1
C'est toujours comme çà !
quand le bouton n'est pas actionné la résistance R1 est à 5V d'un côté et à 4,9999V de l'autre.
Le courant qui la traverse est tellement faible qu'il faut du très bon matériel pour le mesurer.

Comme indiqué par piif une résistance peut être activée dans le microcontrôleur entre la borne D7 et le +5V. (pull-up ou tirage vers le haut)
Elle peut éventuellement remplacer R1 dans le schéma présenté, mais pas dans le schéma où R1 est en 'tirage vers la masse'. IL me semble qu'il n'y a pas en interne de 'pull-down' activable.

gerse

Bon alors si c'est comme ca ... c'est comme ca :)

J'avais effectivement lu le fonctionnement du digitalwrite() dans ce document : http://www.craslab.org/interaction/files/LivretArduinoCRAS.pdf (pour Pifff)

En tous cas merci pour vos réponses je vais pouvoir passé à la suite  :D

Serge

fdufnews

Quote
Bon alors si c'est comme ca ... c'est comme ca

Il y a quand même une raison à ça.
En raccordant l'interrupteur sur la masse, lorsqu'on déporte celui-ci loin de la carte, on est pas obligé de balader l'alimentation (ce qui se produit lorsque l'inter est raccordé au +5V). On évite ainsi les risques court-circuits sur l'alimentation.

Go Up