Go Down

Topic: comment demarrer programme avec bouton poussoir (Read 4361 times) previous topic - next topic

Coco62131

Bonjour amis de l'arduino

je suis novice dans ce domaine ,mais je suis en train de faire un robot à partir d'un arduino UNO et je souhaiterai de mettre un bouton poussoir pour démarrer ou stopper le programme.
Sauf que je ne sais pas comment faire ce code si quelqu'un pourrait m'éclairer sur ce point.
merci d'avance

maxpeigne

Code: [Select]
void setup() {
  pinMode(2, INPUT_PULLUP);
}

void loop() {
  while(!digitalRead(2))
  {
     /* Ton programme */
  }


Et tu branches ton bouton en 2.

Si tu as d'autres question n'hésites pas.

68tjs


bricoleau

Dans le cas d'un robot, bloquer le programme ne mettra pas forcément à l'arrêt les systèmes électriques autour de l'arduino.

Oui tu peux faire avec un bouton poussoir, mais il te faut aussi coder des fonctions qui permettent d'arrêter /démarrer proprement tous les systèmes.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

Coco62131

merci pour vos réponse cela ma fortement aider

Arkhyne

Bonjour à tous,

J'annonce je suis suis un gros débutant, j'espère avoir une réponse pédagogique sur mon problème.
Je cherche à lancer un programme en appuyant sur un bouton. car quand je connecte l'Arduino il fait ça vie tout seul. J aimerai lui dire là, maintenant, tu lances la Loop à l'aide d'un bouton.
J'ai essayé le code de maxpeigne plus haut mais cela ne fonctionne pas. quand je lance mon programme se met en route directement.
.

L'INSTALLATION :
 J'utilise 1 moteur avec un mosfet L298N, avec une alim 12v. et j'ai un bouton poussoirs.Tout semble relié correctement. le programme lance bien le moteur.
Pour le bouton je pars du 5v arduino, ensuite R de 10k , je vais sur pin 2 et sur bouton (bouton protégé par condensateur 10uF et enfin sur le ground.
Shema inspiré. j ai utilisé les pin 10-8-9 pour mon moteur. ci dessous.
https://user.oc-static.com/files/355001_356000/355252.png

PROGRAMME
J'ai essayé d'autre solution voici la dernière :
Etant mauvais, je me suis servis de plusieurs tuto pour assembler ce code. Dons celui d'Eskimon.
A la fin pour couper le programme j'ai cracké sur le delay...

Code: [Select]
int enA = 10;                   // crée une variable de type "int", nommée "enA" et attachée à la Broche 10, qui permet de gérer la vitesse du moteur.
int in1 = 9;                    // crée une variable de type "int", nommée "in1" et attachée à la Broche 9, qui permet de gérer le sens de rotation.
int in2 = 8;                    // crée une variable de type "int", nommée "in2" et attachée à la Broche 8, qui permet de gérer l'autre sens de rotation.
const int bouton = 2;           // un bouton sur la broche 2
int etatBouton;                 // variable qui enregistre l'état du bouton

void setup() {              // Void Setup ------------------------------------------------------------------------------------------------------------------------------------------
pinMode(2, INPUT);
pinMode(enA, OUTPUT);         // indique que la broche de la variable "enA" donc ici la PIN 10, est une sortie.
  pinMode(in1, OUTPUT);         // indique que la broche de la variable "in1" donc ici la PIN 9, est une sortie.
  pinMode(in2, OUTPUT);         // indique que la broche de la variable "in2" donc ici la PIN 8, est une sortie.
pinMode(bouton, INPUT);
etatBouton= HIGH;
}


void loop() {               // Void Loop -------------------------------------------------------------------------------------------------------------------------------------------
 
etatBouton = digitalRead(bouton); // Rappel : bouton = 2

    if (etatBouton == HIGH) // test si le bouton a un niveau logique HAUT
    {
  digitalWrite(in1,HIGH);      // envoie l'électricité dans la broche in1 (donc la PIN 9)ce qui fait donc tourner le moteur dans le sens de rotation de in1.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur peut donc continuer à tourner dans le sens de in1.
  analogWrite(enA,200);        // défini la vitesse du moteur, ici 200 sur un maximum de 255 (échélle comprise entre 0 et 255, car cela correspond à 8 bits soit 1 octet).
  delay(2500);                 // créer un delais de 5 secondes, donc le moteur tourne pendant 5 secondes.

  digitalWrite(in1,LOW);       // en mettant la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  delay(1000);                 // créer un delais où le moteur ne tourne pas pendant 2 secondes.
 
  digitalWrite(in1,LOW);       // met la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur ne tourne pas dans le sens de in1.
  digitalWrite(in2,HIGH);      // envoie l'électricité dans la broche in2 (donc la PIN 8)ce qui fait donc tourner le moteur dans le sens de rotation de in2.
  analogWrite(enA,70);        // défini la vitesse du moteur, ici 200 sur un maximum de 255 (échélle comprise entre 0 et 255, car cela correspond à 8 bits soit 1 octet).
  delay(2500);                 // créer un delais de 5 secondes, donc le moteur tourne pendant 5 secondes.

  digitalWrite(in1,LOW);       // en mettant la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  delay(1000);                 // créer un delais où le moteur ne tourne pas pendant 2 secondes.
}
else  // test si le bouton a un niveau logique différent de HAUT (donc BAS)
    delay(100000000000000000000000);
}


J'espère avoir de l'aide,

Merci 'avance Duocalment.

lesept

C'est normal, voici une version qui devrait marcher:

Code: [Select]
void setup() {
 pinMode (2, INPUT_PULLUP);
 while (digitalRead(2)); // On ne fait rien tant que le bouton n'est pas appuyé
}

void loop() {
     /* Ton programme */
 }

Le bouton doit être branché comme ceci : GND -- Bouton -- pin D2
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Arzou

, ensuite R de 10k , je vais sur pin 2 et sur bouton (bouton protégé par condensateur 10uF et enfin sur le ground.

Le condensateur de 10uf(micro farad) c'est ce que tu as mis? Si oui, cest trop important.. faut baisser a quelques centaines de  nano farad. Avec 10 micro farad, le temps de réaction de l'entrée  pourrais passer de quelque micro secondes a... quelques secondes ou plus..

Arkhyne

Bonjour merci pour vos réponses,

Le condensateur de 10uf(micro farad) c'est ce que tu as mis?
Erreur de frappe j'ai mi du 10nf. condensateur céramique.

C'est normal, voici une version qui devrait marcher:

Code: [Select]
void setup() {
 pinMode (2, INPUT_PULLUP);
 while (digitalRead(2)); // On ne fait rien tant que le bouton n'est pas appuyé
}

void loop() {
     /* Ton programme */
 }

J'ai testé ça dans le setup , rien ne fonctionne. aucune réaction du bouton.
Au sujet du bouton je suis étonné de ton branchement.

-programmez-vos-premiers-montages-avec-arduino/3285224-le-bouton-poussoir#/id/r-3285216]branché comme ceci[/url] : GND -- Bouton -- pin D2
Il n'y à pas de 5v ? Comment je justifie l'etat LOW ou HIGH de ma pin2 dans ce cas?

Je ne trouve toujours pas de solution ,
si jamais vous avez des pistes.

Duinocalement.

kamill

Il n'y à pas de 5v ? Comment je justifie l'etat LOW ou HIGH de ma pin2 dans ce cas?
Bonjour,

Comme ça
Code: [Select]
pinMode (2, INPUT_PULLUP);
Ça active une résistance de pullup interne (entre la pin et le 5V).

Arkhyne

Bonjour,

Comme ça
Code: [Select]
pinMode (2, INPUT_PULLUP);
Ça active une résistance de pullup interne (entre la pin et le 5V).
ok merci, il me reste à comprendre ce qui ne va pas dans le programme.

Arkhyne

J'ai donc changé ma connexion bouton en suivant vos conseil, j'ai également changé le code.
Malheureusement j'en suis toujours au même point.
Si quelqu'un se sent jeter un œil sur ce code, pour voir l'erreur.

Code: [Select]
int enA = 10;                   // crée une variable de type "int", nommée "enA" et attachée à la Broche 10, qui permet de gérer la vitesse du moteur.
int in1 = 9;                    // crée une variable de type "int", nommée "in1" et attachée à la Broche 9, qui permet de gérer le sens de rotation.
int in2 = 8;                    // crée une variable de type "int", nommée "in2" et attachée à la Broche 8, qui permet de gérer l'autre sens de rotation.
int bouton = 2;                 // crée une variable D2,démarrage programe.

void setup() {              // Void Setup ------------------------------------------------------------------------------------------------------------------------------------------
  pinMode(enA, OUTPUT);         // indique que la broche de la variable "enA" donc ici la PIN 10, est une sortie.
  pinMode(in1, OUTPUT);         // indique que la broche de la variable "in1" donc ici la PIN 9, est une sortie.
  pinMode(in2, OUTPUT);         // indique que la broche de la variable "in2" donc ici la PIN 8, est une sortie.
  pinMode (bouton, INPUT_PULLUP);
  while (digitalRead(bouton));       // On ne fait rien tant que le bouton n'est pas appuyé
}


void loop() {               // Void Loop -------------------------------------------------------------------------------------------------------------------------------------------
  digitalWrite(in1,HIGH);      // envoie l'électricité dans la broche in1 (donc la PIN 9)ce qui fait donc tourner le moteur dans le sens de rotation de in1.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur peut donc continuer à tourner dans le sens de in1.
  analogWrite(enA,200);        // défini la vitesse du moteur, ici 200 sur un maximum de 255 (échélle comprise entre 0 et 255, car cela correspond à 8 bits soit 1 octet).
  delay(2000);                 // créer un delais de 5 secondes, donc le moteur tourne pendant 5 secondes.

  digitalWrite(in1,LOW);       // en mettant la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  delay(1000);                 // créer un delais où le moteur ne tourne pas pendant 2 secondes.
 
  digitalWrite(in1,LOW);       // met la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur ne tourne pas dans le sens de in1.
  digitalWrite(in2,HIGH);      // envoie l'électricité dans la broche in2 (donc la PIN 8)ce qui fait donc tourner le moteur dans le sens de rotation de in2.
  analogWrite(enA,200);        // défini la vitesse du moteur, ici 200 sur un maximum de 255 (échélle comprise entre 0 et 255, car cela correspond à 8 bits soit 1 octet).
  delay(2000);                 // créer un delais de 5 secondes, donc le moteur tourne pendant 5 secondes.

  digitalWrite(in1,LOW);       // en mettant la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  delay(1000);                 // créer un delais où le moteur ne tourne pas pendant 2 secondes.
 
}


Merci d'avance,

Duinocalement.

kamill

Vérifies que ton bouton est bien cablé.

Affiches son état sur le moniteur série avec ce petit programme
Code: [Select]
const byte pinBouton=2;

void setup()
{
  Serial.begin(115200);
  pinMode(pinBouton,INPUT_PULLUP);
}

void loop()
{
  Serial.println(digitalRead(pinBouton));
  delay(300);
}

Arkhyne

Effectivement Kamill, j'avais un faux contact avec mon condensateur céramique, la vérification ma permit de voir un problème de câblage.
Jusqu'ici vous m'avez été d'une grande aide et je vous en remercie chaleureusement.

Dernière question à ce sujet, si je veus maintenant éteindre le programme avec le même bouton ?

Duinocalement.

lesept

Ça dépend ce que veut dire éteindre le programme. Un programme ne s'éteint pas...

Si tu veux éteindre l'arduino, il faut le mettre en veille ou couper l'alimentation. Si tu veux stopper l'exécution du programme, tu peux faire dans la loop

if (! digitalRead (bouton)) while () ;

Il se mettra dans une boucle infinie au moindre appui sur le bouton
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up