MicroPython-Hack-button

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Introduction

Le pyboard dispose de 2 petits boutons, libellés USR et RST. Le bouton RST (reset) est un bouton de réinitialisation matérieln, s'il est prssé alors la carte pyboard redémarre entièrement (équivalent d'une mise hors tension suivit d'une remise sous tension).

Le bouton USR (user, soit utilisateur) est un bouton destiné à votre usage personnel. Il est contrôlé par l'intermédiaire de l'objet Switch. Ecrivez le code suivant pour créer un objet Switch:

>>> sw = pyb.Switch()

Souvenez-vous qu'il faut taper import pyb si vous obteniez une erreur vous informant que le nom pyb n'existe pas.

Grâce à l'objet switch vous pouvez obtenir le statut du bouton:

>>> sw()
False

Qui affiche False si le bouton n'est pas pressé ou True si le bouton est pressé. Essayez de maintenir le bouton enfoncé pendant l'exécution de la commande ci-dessus.

Callback bouton

Qu'est-ce qu'un callback?

En informatique, une fonction de rappel (callback en anglais) ou fonction de post-traitement est une fonction qui est passée en argument à une autre fonction. Cette dernière peut alors faire usage de cette fonction de rappel comme de n'importe quelle autre fonction, alors qu'elle ne la connaît pas par avance.
Source: Fonction de rappel sur Wikipedia

L'objet switch

switch est un terme anglais signifiant "bouton" ou "interrupteur".

Nous disions donc que le switch est un objet vraiment très simple mais il dispose également d'une fonctionnalité avancée: la fonction sw.callback(). La fonction callback permet de mettre en place quelque-chose à exécuter lorsque le bouton est pressé (et utilise une interruption). Le mieux, c'est de partir de l'exemple ci-dessus pour comprendre comment les interruptions fonctionnent.

Essayez d'exécuter le code suivant sur l'invite de commande:

>>> sw.callback(lambda:print('bouton enfonce!'))

Qui informe le bouton qu'il doit imprimer un message 'bouton enfonce!' à chaque fois que le bouton est enfoncé. Faites un essai: pressez le bouton USR et regardez le message qui apparait sur la sortie de votre PC.

Notez que cet affichage interrompera tout ce que vous tapez. Ceci est un exemple de routine d'interruption qui s'exécute de façon asynchrone.

Un autre exemple à essayer:

>>> sw.callback(lambda:pyb.LED(1).toggle())

Dans cet exemple, le callback inverse (toggle) l'état de la LED rouge à chaque fois que le bouton est pressé. Et cela fonctionnera aussi pendant qu'un autre code s'exécute.

Pour désactiver le callback du bouton, il suffit de passer None comme fonction callback:

>>> sw.callback(None)

Vous pouvez passer n'importe quelle fonction (qui prend 0 arguments) en tant que fonction callback pour le switch. Ci-dessus, nous utilisons la fonctionnalité lambda (expression lambda) de Python, cela permet de créer une fonction anonyme (sans nom) à la volée. Mais vous pourriez également faire ceci:

>>> def f():
...   pyb.LED(1).toggle()
...
>>> sw.callback(f)

Ce bout de code crée une fonction appelée f et l'utilise somme fonction callback pour le switch. Vous pouvez utiliser cette methode lorsque le code de la fonction de rappel est plus compliqué que ce que autorise les expressions lambda.

Une fonction callback ne peut pas allouer de la mémoire (par exemple elles ne peuvent pas créer de tuple ou de liste). Une fonction callback doit rester relativement simple. Si vous avez besoin de créer une liste, assurez-vous de l'avoir déjà créée dans votre programme et stockée dans une variable globale (or make it local and close over it).

Si vous avez besoin de réaliser des calculs longs et compliqués, alors utilisez un flag (variable drapeau) qui sera activée par le callback. Laisser alors votre programme principale réaliser la tâche compliquée lorsque le flag est activé (par le callback).

Les interruptions: détails techniques

Let’s step through the details of what is happening with the switch callback. When you register a function with sw.callback(), the switch sets up an external interrupt trigger (falling edge) on the pin that the switch is connected to. This means that the microcontroller will listen on the pin for any changes, and the following will occur:

  1. When the switch is pressed a change occurs on the pin (the pin goes from low to high), and the microcontroller registers this change.
  2. The microcontroller finishes executing the current machine instruction, stops execution, and saves its current state (pushes the registers on the stack). This has the effect of pausing any code, for example your running Python script.
  3. The microcontroller starts executing the special interrupt handler associated with the switch’s external trigger. This interrupt handler get the function that you registered with sw.callback() and executes it.
  4. Your callback function is executed until it finishes, returning control to the switch interrupt handler.
  5. The switch interrupt handler returns, and the microcontroller is notified that the interrupt has been dealt with.
  6. The microcontroller restores the state that it saved in step 2.
  7. Execution continues of the code that was running at the beginning. Apart from the pause, this code does not notice that it was interrupted.

The above sequence of events gets a bit more complicated when multiple interrupts occur at the same time. In that case, the interrupt with the highest priority goes first, then the others in order of their priority. The switch interrupt is set at the lowest priority.



Source: The Switch, callbacks and interrupts écrit par/written by Damien P.George

Traduit par Meurisse D. pour MCHobby.be - Translated by Meurisse D. for MCHobby.be

Traduit avec l'autorisation de micropython.org - Translated with the authorisation of micropython.org

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.