Académique Documents
Professionnel Documents
Culture Documents
2 Entrées Numériques
&
Interruption
objectifs:
Matériels utilisés :
Siwtch
Résistance 10K et 220
Led
4 fils MM
Le switch sera connecté en série avec une résistance au + 5 V comme sur le montage suivant :
Travail demandé :
1
Réaliser le montage suivant :
int state = 0 ;
constintledpin = 13 ;
constintinpin = 3 ;
voidloop(){
state=digitalRead(…….) ;
if(state==1)
digitalWrite(….,HIGH) ;
else
digitalWrite(…..,….) ;
2
2. Compiler le code, téléverser et observer
Il se passe le même phénomène lorsque l’utilisateur relâche le bouton. Ce genre d’effet n’est
pas désirable, car il peut engendrer des parasites au sein du programme (si vous voulez
détecter un appui, les rebonds vont vous en générer une dizaine en quelques millisecondes, ce
qui peut être très gênant dans le cas d’un compteur par exemple).
Solution logicielle :
3
Ouvrir l’exemple « Debounce.ino »
1. Expliquer par quel moyen ce code permet-il d’éliminer le problème des rebonds.
Il est très important que les ISR aient un temps d’exécution le plus court possible. On ne
fera donc aucun calcul compliqué et aucun appel à des fonctions longues comme un affichage
sur un écran LCD.
Source Rôle
INT0 Interruption externe sur la broche 2
INT1 Interruption externe sur la broche 3
PCINT0 Interruption externe sur les broches 8 à 13
PCINT1 Interruption externe sur les broches A0 à A5
PCINT3 Interruption externe sur les broches 0 à 7
4
Les interruptions externes INT0 et INT1
Ces deux interruptions sont les plus faciles à utiliser. INT0 correspond à la broche 2 des Arduinoa
base d’AVR et INT1 correspond à la broche 3. Pour accrocher une routine d’interruption à un état
ou un changement d’état de l’une de ces broches on va utiliser la
fonction attachInterrupt(...).
Cette fonction prend 3 arguments : le numéro d’interruption externe, la fonction à appeler quand
l’interruption survient et enfin la condition selon laquelle l’interruption survient. Son prototype est
le suivant :
attachInterrupt(numéro, ISR, mode);
ISR est la routine d’interruption qui sera appelée lorsque l’interruption surviendra. Cette
routine d’interruption est une fonction qui ne renvoit rien et qui ne prend aucun argument,
comme ceci :
voidmaRoutine() { ... }.
mode indique ce qui va provoquer l’interruption. Les valeurs possibles pour mode sont :
o LOW : l’interruption est déclenchée quand la broche concernée est LOW. Comme il s’agit
d’un état et non d’un événement, l’interruption sera déclenchée tant que la broche est LOW.
Par conséquent, dès que l’ISR aura terminé son exécution, elle la recommencera. Pendant ce
temps, loop() ne sera pas exécuté.
o CHANGE : l’interruption est déclenchée quand la broche concernée change d’état, c’est à
dire passe de LOW à HIGH ou bien de HIGH à LOW. Il s’agit d’un événement.
o RISING : l’interruption est déclenchée quand la broche concernée passe de LOW à HIGH.
Il s’agit également d’un événement.
o FALLING : l’interruption est déclenchée quand la broche concernée passe de HIGH à
LOW. Il s’agit encore d’un événement.
1. detachInterrupt(numero);
5
3. Modifier le code pour valider le fonctionnement souhaitée
Application :
1.1. Montage à faire
1.2.
Deux boutons et quatre LED – SchémaDeux boutons et quatre LED - Montage
Pour cet exercice, nous allons utiliser deux boutons et quatre LED de n’importe quelles couleurs.
Les deux boutons seront considérés actifs (appuyés) à l’état bas (0V) comme dans la partie
précédente. Ils seront connectés sur les broches 2 et 3 de l’Arduino.
Ensuite, les quatre LED seront connectées sur les broches 10 à 13 de l’Arduino.
6
Vous devrez utiliser une variable qui voit sa valeur augmenter ou diminuer entre 0 et 4 selon l’appui du
bouton d’incrémentation ou de décrémentation.
Vous pouvez maintenant vous lancer dans l’aventure. Ceux qui se sentent encore un peu mal à l’aise avec
la programmation peuvent poursuivre la lecture, qui leur expliquera pas à pas comment procéder pour
arriver arésultat final.
1.3. Correction
1.3.1. Initialisation
Pour commencer, on crée et on initialise toutes les variables dont on a besoin dans notre programme :
/* déclaration des constantes pour les noms des broches ; ceci selon le
schéma */
constintbtn_minus = 2;
constintbtn_plus = 3;
constint led_0 = 10;
constint led_1 = 11;
constint led_2 = 12;
constint led_3 = 13;
voidloop()
{
// les instructions de votre programme
}
7
1.3.2. Détection des différences appuyé/relâché
Afin de détecter un appui sur un bouton, nous devons comparer son état courant avec son état précédent.
C’est-à-dire qu’avant qu’il soit appuyé ou relâché, on lit son état et on l’inscrit dans une variable. Ensuite,
on relit si son état a changé. Si c’est le cas alors on incrémente la variable nombre_led . Pour faire cela,
on va utiliser une variable de plus par bouton :
voidloop()
{
// lecture de l'état du bouton d'incrémentation
etat_bouton = digitalRead(btn_plus);
8
// on lui passe en paramètre la valeur du nombre de LED à éclairer
affiche(nombre_led);
}
Nous avons terminé de créer le squelette du programme et la détection d’évènements, il ne reste plus qu’à
afficher le résultat du nombre !
1.3.4. L’affichage
Pour éviter de se compliquer la vie et d’alourdir le code, on va créer une fonction d’affichage. Celle dont je
viens de vous parler : affiche(intle_parametre) . Cette fonction reçoit un paramètre représentant
le nombre à afficher. À présent, nous devons allumer les LED selon la valeur reçue. On sait que l’on doit
afficher une LED lorsque l’on reçoit le nombre 1, deux LED lorsqu’on reçoit le nombre 2, …
voidaffiche(intvaleur_recue)
{
// on éteint toutes les LED
digitalWrite(led_0, HIGH);
digitalWrite(led_1, HIGH);
digitalWrite(led_2, HIGH);
digitalWrite(led_3, HIGH);
Donc, si la fonction reçoit le nombre 1, on allume la LED 1. Si elle reçoit le nombre 2, elle allume la LED
et 2. Si elle reçoit 3, elle allume la LED 1, 2 et 3. Enfin, si elle reçoit 4, alors elle allume toutes les LED. Le
code au grand complet :