Différences entre versions de « MicroPython-Hack-button »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
Ligne 78 : Ligne 78 :
  
 
=== Brancher ===
 
=== Brancher ===
 +
 +
[[Fichier:Micro-Python-Hack-Btn-00.jpg|480px]]
  
 
=== Le code ===
 
=== Le code ===

Version du 16 mars 2015 à 16:35


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

Abordons ensemble les détails de ce qui se passe avec la fonction de rappel (callback) du switch. Lorsque vous enregistrez une fonction avec sw.callback(), l'objet switch configure le déclenchement d'une interruption (falling edge sur le flanc descendant du signal) sur la broche à laquelle est attaché le bouton utilisateur. Cela signifie que le microcontroleur surveillera les changements d'état de la broche, et voici ce qu'il se passe:

  1. Lorsque le bouton (switch) est pressé, il y a un changement de signal sur la broche (la broche passe du niveau BAS au niveau HAUT) et le microcontroleur détecte ce changement.
  2. Le microcontroleur termine l'exécution de l'instruction machine en cours, stop l'exécution du programme et sauve son état actuel (pousse l'état des registres sur la pile). Cela à pour éffet de suspendre l'exécution de votre code (par exemple for example your running Python script.
  3. Le microcontroleur commence à exécuter le code de gestion de l’interruption (cela s'appelle "interrupt handler") associé avec le bouton poussoir. Le code de gestion de l'interruption retrouve la fonction que vous avez enregistré à l'aide sw.callback() et l'exécute.
  4. La fonction de rappel (callback) est exécutée jusqu'à sa fin, puis retourne le contrôle de l'exécution au code de gestion de l'interruption (interrupt handler).
  5. Le code de gestion de l'interruption termine son exécution et le microcontrôleur est notifié qu'il à a traité l'interruption.
  6. Le microcontroleur restaure l'état sauvé à l'étape 2.
  7. Le code qui était en cours d'exécution au moment de l'interruption reprend son court. A part "la pause" le programme est incapable de savoir qu'il y a eu une interruption.

La séquence d'événement décrite ci-dessus est un peu plus compliqué lorsque plusieurs interruptions arrivent en même temps. Dans ce cas, l'interruption avec la plus haute priorité est exécutée d'abord, puis les autres dans leur ordre de priorité. L'interruption du bouton (switch) est configuré avec la priorité la plus basse.

Brancher un bouton

Brancher

Micro-Python-Hack-Btn-00.jpg

Le code

Le petit bout de code ci-dessous surveille l'état de la broche Y10. Lorsque le bouton est enfoncé, la broche passe au niveau bas (ramené à la masse, donc la valeur 0) et le programme inverse l'état de la LED rouge de la carte.

import pyb
# Configure la broche en entree avec PULL_UP interne
# La Pull_up ramène automatiquement le potentiel de la
# broche au niveau haut.
btn = pyb.Pin( 'Y10', pyb.Pin.PULL_UP )

# boucle infinie
while True:
   # lorsque le bouton est enfonce le potentiel de
   # la broche est forcé a la masse (niveau bas)
   if btn.value() == 0:
      # changer l'état de la LED 1 (rouge)
      pyb.LED(1).toggle()
   pyb.delay( 500 )

Plus d'information

Nous aurons l'occasion de revenir plus en détails sur la commande des broches dans un autre tutoriel. En attendant, vous trouverez d'autres informations dans la documentation de Micro Python



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.