Header Ads Widget

Actu

6/recent/ticker-posts

Les interruptions sur arduino : le guide ultime.

À la fin de ce tutoriel, vous saurez comment crée des interruptions sur la quasi-totalité des broches de l'arduino. Cela marchera sur la plupart des arduino excepté les arduino à base d'ATMega 32u4. Nous pouvons citer comme exemple la Leonardo. La plupart se pose la question de savoir ce que c'est une interruption.


Alors, qu'est ce qu'une interruption ?


Une Interruption est un événement que déclenche le microcontrôleur pour exécuter un sous programme. Il peut être déclenché de plusieurs façons et pour plusieurs raisons. Imaginer une situation, selon laquelle vous devez gérer la domotique d'une maison. Un capteur d'emprunte à l'entrée et un capteur de mouvement au salon par exemple.


En ce moment où l'emprunte est scanner, si un individu se déplace au salon, alors aucune alarme ne pourra retentir. Le micro-contrôleur exécute les instructions de façon séquentielle donc ne peut pas exécuter deux instructions au même moment.


C'est pour cette raison que les interruptions ont été crée. En ce moment où le scanner d'emprunte exécute sa tâche, s'il y a mouvement dans le salon, alors il interrompt le scannair et active l'alarme.

Vous pouvez mettre plusieurs capteurs en interruption. Dans ce cas, on peut avoir deux interruptions au même moment. Ces interruptions ont également été gérées avec des priorités.


Ceci est un des exemples illustrateurs de l'utilisation des interruptions, vous pouvez mettre les interruptions en application dans de nombreux systèmes. Toutefois, il existe plusieurs types d'interruption à savoir les interruptions externes et ceux liées au timers.



Les interruptions externes sont liées à l'utilisation des broches de l'arduino. Les interruptions liées au timers utilisent des compteurs internes à l'arduino qui permet de compter le temps. Il faut noter que les interruptions externes sont prioritaires aux interruptions liées au timers.


Les interruptions externes INT0 et INT1.

Dans les cartes arduino Uno et nano, les interruptions matérielles sur les broches 2 et 3 sont prioritaires. Contrairement à la méga, les numéros 0 à 5 sont possibles et corresponde à l'ordre respectif des broches 21, 20, 19, 18, 2 et 3. Le déclenchement d'une interruption est efficace, selon plusieurs cas de figure.


  • FALLING: Passage de l'état haut à l'état bas (détection d'un front descendent).
  • RASING: Détection du front montant (Passage de l'état bas à l'état haut).
  • LOW: Détection d'un passage à état bas de la broche.
  • CHANGE: Lorsque la broche change d'état.

La fonction qui permet de mettre en œuvre ces interruptions est: 


attachInterrupt(Numero, fonction, mode);

Détaille des arguments de la fonction.

1.     Numéro: C'est à cet endroit que l'on place le numéro de la broche qui détectera l'interruption. Le 0 sera pour la broche 2 et le 1 serais pour la broche 3 sur la carte.

2.     FonctionIci ont écrit le nom de la fonction que l'on aimerait appeler lorsque l'interruption se produit.

3.     Le mode: C'est l’événement déclencheur de la fonction d'interruption (FALLING, RASING, LOW, CHANGE).

Soit une fonction appelée Reaction(), pour l'exécuter en interruption, il faut que la broche deux de l'arduino puise être à l'état haut. La fonction va s'écrire de la façon suivante:


 attachInterrupt(0, Reaction, RASING);

Il faut noter que la fonction Reaction() ne doit pas avoir d'argument et ne retourne pas de résultat.


Il est également bien de savoir que les interruptions mettent en pause le programme et une mauvaise programmation peut détruire les variables.

Les fonctions Delay() et millis() ne doivent pas être introduite dans la fonction d'interruption. Lorsque celle-ci est appelé, le programme s'arrête complètement et stoppé donc les fonctions qui gèrent le temps.


Il est important de savoir qu'il existe un temps entre l'éventement et le déclenchement de l'interruption qui est de 3µs.


Lorsqu'on attache une interruption, on peut également la détacher avec une autre fonction nommée:


detachInterrupt (numéro)

Ici l'argument numéro est le numéro de la broche sur laquelle on veut détacher l'interruption. Sur arduino Uno et Nano, c'est 0 et 1, tendis que sur l'arduino méga, c'est de 0 à 5.


Deux broches externes d'une interruption ne permettent pas de mettre en œuvre un système de grande taille. Heureusement, toutes les broches de l'arduino peuvent être misse en interruption.

Les interruptions sur les broches numérique PCINT0, PCINT1 et PCINT2.

La possibilité de ressource est moindre ici par rapport aux interruptions vues précédemment. Le PCINT0 correspond aux broches 8 à 13, le PCINT1 aux broches analogiques A0 à A5 et PCINT3 aux broches 0 à 7.


On peut donc constater que les broches 2 et 3 sont partagés entre PCINT3, INT0 et INT1. Il serait donc absurde que l'on puisse bénéficier de ces deux modes d'interruptions au même moment.


Comme nous l'avons précisé précédemment, la richesse qu'offre les interruptions INTx n'est pas la même que celle offerte par PCINTx. Par exemple, le seul mode d'interruption c'est sur le changement d'état; soit LOW vert HIGH ou HIGH vert LOW.


A cet effet, il existe une bibliothèque pour la gestion de ceux-ci de façon plus simple. Dans la rédaction de votre programme, vous pouvez choisir définir une fonction pour chaque pin mis en interruption grâce à cette bibliothèque.

La bibliothèque PinChangeInt

Pour entrée en possession de la bibliothèque PinChangeInt, vous pouvez télécharger sur le lien suivant: PinChangeInt. Après l'avoir téléchargé, vous devez l'installer la bibliothèque. Pour l'installer, vous devez décompresser le dossier et l'insérer le contenu dans le dossier arduino de votre ordinateur situé dans Document.


Dans le dossier arduino précédent, vous y trouvez le dossier libraires, c'est à l'intérieur que vous allez insérer toutes vos bibliothèques. Vous devez redémarrer le logiciel arduino à présent pour qu'il prenne en compte la nouvelle bibliothèque.


La bibliothèque que nous venons d'installer fournit la fonction suivante:


PCintPort::attachInterrupt(NuméroPin, fonction, mode);

Nous constatons que les fonctions attachInterrupt() et detachInterrupt() qui s'applique sur INT0 et INT1 prenne en premier lieu comme paramètre le numéro de l'interruption.


Tendis que la fonction PCintPort::attachInterrupt(); prend comme premier argument le numéro du pin sur lequel il fait référence.


Il est important de savoir que la fonction PCintPort::detachInterrupt(); prend un seul argument et celui du pin auquel il fait référence.

Mise en oeuvre d'une interruption avec Arduino UNO

Nous avons assez effectué de théorie jusqu'à pressent et il est temps de voir comment cela pourrait être mis en pratique. Nous allons réaliser un montage avec les boutons poussoir qui seront considérés comme des capteurs. Nous utilisons les boutons poussoir qui sont normalement fermés.


Lorsque nous étudions le bouton poussoir, ont constate qu'en maintenant appuyer sur ce dernier, il laisse passer le courant dans le circuit. Lorsqu'il est relâché, le circuit ce comporte comme un circuit ouvert. En ce moment ou ont fait action sur le bouton, des rebonds sont effectués au niveau du contact. 


La vitesse d'exécution des instructions par seconde de l'arduino Uno par exemple est 16 000 000 instructions par seconde, donc au moment de lecture de l'interruption, il le fera plusieurs fois. Pour résoudre ce problème, plusieurs méthodes sont employées.


La première méthode est matérielle et fait intervenir un condensateur branché en parallèle avec le bouton poussoir. Si le capteur est branché en pull-up, alors initialement il est chargé et se décharge lors de l'action sur le bouton poussoir. Et en ce moment, les rebonds sont absorbés par le condensateur.


S'il est branché en pull dow, initialement le condensateur serait déchargé, il va se charger lors de l'action sur le bouton poussoir et absorbera les rebonds. La valeur du condensateur qui est généralement utilisé est de 10 nf.


La deuxième méthode consiste à effectuer une temporisation après avoir déclenché l'événement. Cette méthode est la plus complexe et la plus efficace car elle simplifie le câblage de la carte électronique. Elle est également facile à mettre en œuvre lorsque le principe a été bien appréhendé.

Schémas de câblages

Les figures suivantes présentes les câblages que vous pouvez tester avec votre plaque à essai.


Câblage avec rebond amortie par condensateur

Câblage avec rebond amortie par le programme

Programmation des interruptions

Dans un premier temps, intéressons nous au câblage sur lequel les rebonds sont gérés par les condensateurs. Dans sont programme, il n'y à pas une fonction de gestion de délais après avoir détecté une interruption.



On constate que les fonctions f1, f2 et f3 sont appelés lorsque une interruption survient respectivement sur les boutons B1, B2 et B3.


Le câblage le plus simple fait intervenir la gestion du temps. Le code suivant est celui de ce câblage.




C'est ainsi que ce tutoriel touche à sa fin. Pour tout autres problèmes éventuel, poser les en commentaire.


Enregistrer un commentaire

1 Commentaires

  1. Bonsoir. suis dans le domaine mais je voudrais plus améliorer ma capacité avec vous. merci.

    RépondreSupprimer

Laissez un avis.