J'ai trouvé quelques informations dans le livre de Christian Tavernier - Arduino - Maitrisez sa programmation et ses cartes d'interface(shields) - p : 65 et je me suis dit qu'il serait bon de les partager. Si je dis des bêtises, ce qui ne manquera pas d'arriver, n'hésitez pas à me corriger.
La plupart du temps, si l'on veut tester l'état dun capteur, nous interrogeons l'entrée concernée au travers d'une boucle 'for', par exemple.
Cette manière de faire peut, être couteuse en énergie car le processeur boucle à toute vitesse dans une course folle, à ne rien faire. Et si l'on teste plusieurs capteurs, le problème est multiplié d'autant. De plus, la structure du programme n'est pas vraiment optimisée.
L'idée, qui ne date pas d'hier, c'est de faire en sorte que le capteur envoie un signal sur une entrée dédiée du processeur. Le processeur arrête net ce qu'il était en train de faire, exécute la fonction de linterruption, puis reprend sa tâche.
Facile à dire ! Et bien oui, et en plus, c'est facile à faire.
Voici un exemple très minimaliste ou le capteur, un simple interrupteur, allume ou éteint la Led notée L (située au milieu de votre Arduino Uno), à chaque fois que l'on appuie dessus. Pour information, cette Led est reliée à l'E/S 13 de lArduino.
Cette interrupteur, placé sur une BreadBoard, est relié à la masse au travers d'une résistance de 10k. Ainsi lorsque l'interrupteur est ouvert, l'entrée sera à 0.
Les entrées spécifiques aux interruptions sont numérotées de 0 à 5. Mais attention, ces chiffres ont une correspondance physique sur les entrées de l'Arduino différente des chiffres eux-mêmes.
Correspondance des numéros d'interruptions et des lignes d'E/S :
Arduino Uno et Nano :
- interruption 0 liée à l'entrée 2
- interruption 1 liée à l'entrée 3
Arduino Mega :
- interruption 0 liée à l'entrée 2
- interruption 1 liée à l'entrée 3
- interruption 2 liée à l'entrée 21
- interruption 3 liée à l'entrée 20
- interruption 4 liée à l'entrée 19
- interruption 5 liée à l'entrée 18
Comme vous pouvez le constater, le programme est simplissime. Néanmoins, voici quelques commentaires.
- Je commence par initialiser la sortie 13 correspondant à la Led L.
- Puis j'exécute la fonction 'attachInterrupt' qui possède 3 paramètres. Le premier est le numéro de l'interruption, ici 0. Donc l'interrupteur est relié à lentrée 2 de l'Arduino. Le deuxième paramètre est le nom de la fonction qui doit être exécutée lorsque survient l'interruption. Le troisième paramètre, 'RISING', indique que l'interruption fait passer l'entrée, du niveau bas au niveau haut. Il y a dautres possibilités.
- Comme vous pouvez le constater, la fonction loop() est vide.
- La fonction interrupteur() est celle que j'ai écrite et qui est donc exécutée lorsque j'appuie sur linterrupteur. Puis vient la variable 'etat' qui est initialisée à la valeur de la sortie 13. Puis, grosse astuce de programmeur, je lui applique un XOR 1. Cela permet de la passer alternativement de 0 à 1 et inversement à chaque exécution de la fonction. Ainsi, à la ligne suivante, la Led sallumera, puis séteindra, puis sallumera etc.
- Ici, la boucle 'for' sert de temporisation pour palier à l'effet rebond de linterrupteur. En effet, la fonction delay() ne peut être utilisée dans une fonction d'interruption, car elle-même consulte des interruptions (horloge).
Merci d'avance pour vos remarques.
// Arduino - Les interruptions void setup() { // utilisation de la led L au centre de carte - sortie numérique 13 pinMode(13, OUTPUT); // interruption 0 - entrée numérique 2 // fonction appelée 'interrupteur' // déclenchée par passage du niveau bas au niveau haut attachInterrupt(0, interrupteur, RISING); } void loop() {} // fonction vide void interrupteur() { // fonction appelée par l'interruption 0 byte etat= (digitalRead(13)^1); // va et vient, 0 XOR 1 = 1 ou 1 XOR 1 = 0 digitalWrite(13,etat); for (double i=1; i<=5000;i++); // temporisation }Interruptions_bb.jpg 80,73 Ko 14 téléchargement(s) Interruptions_schéma.jpg 28,88 Ko 14 téléchargement(s)