Activité : double boutons
Vous répondrez aux questions sur un document texte (MS Word ou LibreOffice Writer), à envoyer au professeur.
La présentation doit être claire, concise, soignée, et comporter des captures d’écran et/ou photos pertinentes.
Le résultat final devra faire l’objet d’une courte vidéo, à envoyer au professeur également.
Prérequis : réaliser l’activité Commuter avec un bouton poussoir.
Objectif :
Dans le cours sur les fonctions logiques, et plus particulièrement à propos des chronogrammes, nous avons énoncé la règle suivante :
Deux entrées physiquement indépendantes ne peuvent pas changer simultanément.

Ceci est physiquement impossible !!!
L’objectif de cette activité est de réaliser un montage et un programme avec 2 boutons afin de démonter qu’il existe toujours un délai entre les 2 événements d’appui sur ces boutons.
L’écart de temps entre les deux appuis sera affiché dans le moniteur série, en microsecondes.
Ressources :
Matériel nécessaire :
- 2 boutons poussoir

- une LED verte et sa résistance associée

Travail demandé
On se propose de réaliser un programme qui mesure le temps écoulé entre deux appuis sur les boutons A et B (quel que soit l’ordre chronologique). Voici comment il doit fonctionner :
- Dans la fonction
setup, on initialise le port série et on configure les ports, - on lance une fonction
attente(voir plus loin) pour attacher des interruptions aux boutons. - dans la boucle principale
loop:- on affiche l’état du dispositif par une LED (allumée = « prêt »)
- si une mesure est prête (
fini == true) :- on affiche le résultat,
- on met en pause le dispositif via la fonction
attente:- désactivation des interruptions,
- pause de 1 seconde,
- réactivation des interruptions.
Dans chacune des ISR :
- si le bouton est le premier des 2 qui a été pressé (
pret == true) :- on mémorise le nom de ce bouton
- on démarre le chronomètre
- si le bouton est le deuxième à avoir été pressé :
- on mémorise l’écart entre les 2 instants (variable
premier) - on déclare qu’une mesure est prête (
fini = true)
- on mémorise l’écart entre les 2 instants (variable
- Créer un nouveau skecth avec le code suivant (c’est une ébauche !) :
int pin_LED = 13; // port numérique associé à la LED intégrée
int pin_buttonA = 2; // port numérique lié au bouton poussoir A
int pin_buttonB = 3; // port numérique lié au bouton poussoir B
volatile unsigned long t0 = 0; //
volatile unsigned long dt = 0; // écart de temps entre les 2 boutons (micro secondes)
volatile char premier = ' '; // premier bouton pressé
volatile bool pret = false; // le dispositif est prêt
volatile bool fini = false; // la mesure est terminée
void setup() {
Serial.begin(115200);
pinMode(pin_LED, OUTPUT); // réglage du port de la LED en mode SORTIE
pinMode(pin_buttonA, INPUT_PULLUP);
pinMode(pin_buttonB, INPUT_PULLUP);
attente();
}
void loop() {
digitalWrite(pin_LED, pret);
if (fini) { // la mesure est terminée
Serial.print(premier);
Serial.print(' ');
Serial.println(dt);
attente();
fini = false;
}
}
/* Mise en pause du dispositif pendant 1 seconde */
void attente() {
detachInterrupt(0); // 0 = interruption liée au port 2
detachInterrupt(1); // 1 = interruption liée au port 3
delay(1000);
attachInterrupt(...);
attachInterrupt(...);
pret = true;
}
void boutonA() {
if (pret) {
t0 = micros(); // début chronomètre
pret = false;
premier = 'A';
} else {
dt = micros() - t0; // fin chronomètre
...
}
}
void boutonB() {
if (pret) {
t0 = micros(); // début chronomètre
pret = false;
premier = 'B';
} else {
dt = micros() - t0; // fin chronomètre
...
}
}
...) afin qu’il répondre au comportement attendu.
