Interruptions Arduino

Les interruptions

Ceci est un guide sur la mise en œuvre des interruptions pour votre code Arduino. Il existe de nombreuses bonnes informations sur les interruptions, mais ce guide fait partie d'une série sur le fonctionnement de votre Arduino avec une consommation d'énergie minime. Et nous voulons dire minuscule. Nous parlons d'années de fonctionnement en fonction de l'application…. Sur une pile bouton. C'est ce que vous devez savoir pour créer vos futurs projets intégrés ou Internet des objets. Franchement, il est ridicule de voir la quantité d'énergie qu'un Arduino stocke. En utilisant les différentes astuces de cette série de guides, vous pourrez réduire la consommation d'énergie de plus d'un facteur 1000! A l'air intéressant? Alors voici le guide pour vous! Si vous aimez ce guide, ou si vous voulez voir comment nous avons implémenté les interruptions dans notre propre projet, consultez notre site Web à:

//doteverything.co/

Pourquoi ai-je besoin d'interruptions?

La réponse est simple, vraiment. Vous avez besoin d'interruptions car sans interruptions, vous ne pouvez pas mettre votre Arduino en veille et vous attendre à ce qu'il se réveille à nouveau (en général. Il existe des moyens de sortir du sommeil sans interruption dans des situations limitées). Et si vous ne pouvez pas l'endormir, vous aurez une puissance dévorante comme un marathonien qui traverse la vallée de la mort au milieu de l'été qui boit de l'eau. Le mode veille consomme très, très peu d'énergie… mais il nécessite un effort particulier de configuration. La première chose que vous devez savoir est d'écrire votre code pour profiter des interruptions, puis vous pouvez utiliser les techniques les plus puissantes.

QU'EST-CE qu'une interruption?

Une interruption, c'est plusieurs choses. Mais à la base, c'est un morceau de code qui est appelé lorsqu'une action spéciale se produit. Quelle action spéciale? Fondamentalement, lorsqu'une certaine broche a sa tension modifiée. Sur le Duemilanove / UNO, il n'y a que 2 broches de ce type qui peuvent être qualifiées. Mais comme vous pouvez le voir, il s'agit d'une exigence très large. Vous pouvez utiliser n'importe quoi pour changer la tension sur ces broches. Il peut être saisi par l'utilisateur via un bouton, il peut s'agir d'un périphérique comme un capteur, il peut s'agir d'une autre puce électronique, il peut même s'agir d'une minuterie interne. La première chose que vous devez faire pour commencer à utiliser les interruptions est de comprendre comment votre application peut être convertie pour avoir un déclencheur électrique externe. Souvent, d'autres appareils que vous souhaitez interfacer avec votre Arduino utiliseront des interruptions pour attirer votre attention. Notre instruction précédente, Comment ajouter Bluetooth à votre projet Arduino, est un exemple parfait d'interfacer un périphérique externe de cette manière.

Ce guide vous montrera comment câbler un exemple de circuit pour déclencher des interruptions. Ensuite, nous fournirons un exemple de code. J'espère qu'après avoir vu comment cela se passera, vous serez dans le bon état d'esprit pour comprendre comment appliquer une interruption à votre projet.

Disons que je ne me soucie pas de la consommation d'énergie. Ai-je encore besoin d'interruptions?

Oui! Même si vous ne prévoyez pas de mettre le processeur en veille, vous devrez peut-être des interruptions! Les interruptions sont essentielles si vous avez une application dépendante du calendrier. Cela peut signifier que vous avez besoin qu'une action se produise toutes les x millisecondes, ou que vous ayez besoin qu'une action se produise immédiatement après qu'un événement externe se soit produit. Si vous connaissez les bases de la programmation Arduino, vous vous demandez peut-être pourquoi vous ne pouvez pas simplement utiliser une boucle while pour vérifier quand il est temps d'effectuer votre action. La solution typique est que votre boucle while "interroge" l'état de la broche aussi vite que possible. Cette méthode fonctionne souvent, mais n'est pas fiable. Que se passe-t-il si vous interrogez pour une pression sur un bouton, mais que le bouton est enfoncé et relâché avant que votre boucle while ne se remette à vérifier à nouveau l'état du bouton? Vous manquerez la pression sur le bouton. Que se passe-t-il si vous recherchez un événement très rapide, tel qu'un signal provenant d'un capteur? Vous devrez interroger à peu près constamment et votre programme ne peut rien faire d'autre de peur de manquer l'événement critique. Mais avec des interruptions, vous êtes garanti à 100% pour rattraper l'événement. L'utilisation d'une interruption vous évite également d'avoir à vérifier l'état, économisant constamment la puissance de calcul et permettant à votre boucle while d'accéder plus rapidement à ses autres tâches.

Étape 1: Aperçu du circuit

Voici le circuit que vous devez créer pour créer votre première interruption:

... Ou du moins c'est le circuit que vous DEVRIEZ construire. Heureusement, la plupart des cartes Arduino ont déjà la LED et la résistance intégrées, exactement dans cette configuration. Ils peuvent être activés dans le logiciel. Malheureusement, le simple fait d'utiliser la fonctionnalité intégrée ne vous montre pas tout ce qui se passe! Il vaut donc la peine d'étudier ce schéma et de comprendre ce qu'il fait. Le fait que ce circuit exact soit déjà intégré à Arduino devrait vous donner une indication majeure de son importance.

La partie la plus importante de ce circuit est la résistance 20k connectée à + 5V. C'est ce qu'on appelle une résistance de rappel. Si la résistance avait été connectée à GND au lieu de + 5V, elle serait appelée résistance de descente (Arduino n'a pas de résistances de descente intégrées, vous devez les ajouter en externe). La résistance de rappel maintient la broche à laquelle elle est associée à + 5V normalement. Donc, laissée seule, la broche lira toujours HIGH. Si vous connectez la broche directement à GND (par exemple, en fermant le bouton), la broche sera ramenée à 0 V et lira BAS. Si nous n'avions pas le pull-up, nous ne pourrions pas obtenir le bouton pour faire quelque chose de significatif. Toute broche Arduino peut être connectée à + 5 V en interne en spécifiant pinMode (broche #, INPUT_PULLUP). Notez que le pullup n'a de sens que lorsque la broche est configurée comme entrée. Pour plus d'informations sur les tractions, consultez la page DigitalPins.

L'INTERRUPT_PIN devrait aller à la broche 2 ou 3 de votre Arduino UNO (ou autre Arduino 328p). Pour les autres Arduinos, consultez cette page pour trouver une broche capable d'interruption. Pour notre exemple de code, nous allons le câbler à la broche 2. La LED connectée à ANY_PIN est un circuit simple. Arduino a déjà une LED connectée à la broche 13, nous allons donc l'utiliser, mais n'hésitez pas à modifier le circuit avec votre propre LED sur une broche différente. La LED Arduino a un «L» à côté.

Les boutons ont souvent 4 broches - généralement deux des broches sont simplement connectées en interne à l'autre broche du même côté du bouton. Si vous appuyez sur le bouton et que rien ne se passe, vérifiez que vous avez bien câblé votre circuit entre les broches qui se connectent lorsque vous appuyez sur le bouton, et non entre les broches qui sont toujours connectées.

Étape 2: câblage réel

Avec tout cela à l'esprit, si vous souhaitez utiliser les tractions internes Arduino et la LED intégrée, voici le circuit super simple que vous devez réellement câbler.

Étape 3: Le code

Il y a quelques points à souligner ici. Le plus intéressant est la ligne 10, où nous configurons l'interruption. attachInterrupt () prend 3 arguments. Le premier est le numéro d'interruption, pas le numéro de broche. Vous n'avez pas à vous en préoccuper, assurez-vous de toujours utiliser digitalPinToInterrupt (Pin #) et il sera traduit automatiquement. N'oubliez pas que seules certaines broches peuvent être transformées en broches d'interruption. Le deuxième argument est le nom de la fonction à laquelle vous voulez que votre code passe chaque fois que l'interruption est déclenchée. Vous pouvez voir comment cette fonction est définie à la ligne 21.

Le troisième argument de attachInterrupt () est, dans ce cas, le mot-clé FALLING. Cela signifie que l'interruption sera déclenchée lorsque la tension sur la broche 2 passera de HAUT à BAS. Vous pouvez également spécifier RISING, qui se déclenchera lorsque la tension passera de LOW à HIGH; ou vous pouvez utiliser CHANGE, qui se déclenchera lorsque la tension change dans les deux sens. Dans notre circuit, lorsque le bouton est enfoncé, la tension passera de haut en bas, et lorsque le bouton sera relâché, il passera de haut en bas. Nous ne voulons pas déclencher le code deux fois à chaque fois que le bouton est basculé, nous choisissons donc RISING ou FALLING. Votre application peut demander quelque chose de différent.

L'essayer

Si vous chargez le code, lancez le moniteur série et cliquez sur le bouton, vous remarquerez que la LED ne se comporte pas exactement comme prévu. Nous voulons que la LED passe de allumée à éteinte à chaque pression sur le bouton. Mais pour vous, il clignotera probablement plusieurs fois à chaque fois que vous appuierez sur le bouton. Cela se produit car les boutons ne sont pas parfaits. Votre doigt peut appuyer sur le bouton, mais si vous regardez le niveau microscopique, le bouton rebondit plusieurs fois sur les contacts avant de se fermer complètement. Chaque rebond déclenchera une interruption. Notre système est si précis et si sensible que nous avons effectivement introduit un nouveau problème! Pour résoudre ce problème, nous utilisons une routine connue sous le nom de anti-rebond pour rendre la détection d'interruption moins sensible.

Étape 4: Exemple

En voici une que j'ai préparée. Ce n'est pas parfait, il existe certainement de meilleures façons, mais cela devrait suffire pour vous aider à utiliser les boutons.

L'idée de base est d'enregistrer la dernière fois que le bouton a été enfoncé à l'aide de la fonction millis (). (La fonction millis () vous indique combien de millisecondes se sont écoulées depuis le début de l'exécution de l'esquisse). Si le déclencheur d'interruption précédent s'est produit moins de 200 millisecondes avant l'actuel, il est probable que le bouton rebondisse, donc aucune action n'est entreprise. Sinon, tout se passe normalement. Toutes les variables que vous avez l'intention de modifier dans une fonction d'interruption doivent être déclarées volatiles afin que l'interruption et la boucle principale ne soient jamais en désaccord sur la valeur.

Étape 5: Quelle est la prochaine étape?

C'est ça! Chaque fois que vous cliquez sur le bouton, la LED doit changer d'état. Vous avez maintenant une interruption de travail. A vous d'imaginer des moyens d'incorporer des interruptions dans votre projet. Comme vous pouvez le voir, les interruptions sont essentielles lorsque le timing et la puissance de calcul sont importants. Dans le prochain guide, nous verrons comment mettre l'ATMega328p en mode veille à très faible consommation, en nous appuyant sur les interruptions pour nous réveiller à nouveau. D'ici là, abonnez-vous à Instructables et consultez notre page produit sur www.doteverything.co. Nous construisons Dot, un appareil Internet des objets que nous espérons que vous trouverez cool et utile, et à travers cette série de guides, nous allons vous montrer exactement comment créer votre propre version du matériel!

Articles Connexes