MicroPython-Hack-deparasitage

De MCHobby - Wiki
Aller à : navigation, rechercher

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.

Une broche utilisée comme entrée pour lire un bouton poussoir ou un interrupteur mécanique peut recevoir beaucoup de parasites. En effet, durant un très court laps de temps, juste avant le contact franc, le signal peut rapidement passer de niveau haut à bas et inversement.

Switchbounce.jpg

Ce "bruit" peut être éliminé en utilisant une capacité (un circuit de déparasitage... debouncing circuit en anglais).

Ce "bruit" peut également être éliminé en utilisant une simple fonction qui s'assure que la valeur de la broche est bien stable.

Attendre que la valeur change

C'est justement ce que fait la fonction ci-dessous. Elle prend la valeur actuelle de la broche puis attend que la valeur change et s'assure que la valeur reste stable pendant 20ms.


Le code s'utilise avec le montage suivant.

MicroPython-Hack-deboucing.jpg
Made with - réalisé avec - Fritzing fritzing.org

La nouvelle valeur doit être stable pendant un temps continu de 20ms puis enregistre le modification d'état. Vous pouvez ajuster le temps (par exemple, à 50ms) si le bruit est important.

import pyb

def wait_pin_change(pin):
    # attendre que la broche change de valeur
    cur_value = pin.value()
    # Elle doit être stable pendant un temps continu de 20ms
    active = 0
    while active < 20:
        if pin.value() != cur_value:
            active += 1
        else:
            active = 0
        pyb.delay(1)

Vous pouvez l'utiliser comme ceci:

import pyb

pin_x1 = pyb.Pin('X1', pyb.Pin.IN, pyb.Pin.PULL_DOWN)
while True:
    wait_pin_change(pin_x1)
    pyb.LED(4).toggle()

Au passage, vous noterez que la broches est configurée en PULL_DOWN, ce qui signifie que le niveau reste à LOW/BAS aussi longtemps qu'une intervention extérieur ne place pas le potentiel de la broche au niveau HIGH/HAUT.

A la méthode Arduino

Si vous êtes bien attentif au point précédent, votre programme est arrêté aussi longtemps que l'utilisateur ne presse pas le bouton.

Si cela conviendra à certaines utilisation, ce ne sera pas le cas de la plupart des programmes qui cycles en vérifiant régulièrement l'état des boutons pour savoir ce que le programme doit faire.

Il y a toujours le concept de callback abordé dans ce tutoriel mais vous pouvez toujours utiliser une méthode largement utilisée sur les Arduino.

Sur les Arduino, nous faisons du pooling dans le boucle principale. Les entrées sont lues, puis le soft attend 10ms et relis l'entrée. Si l'état est identique dans les deux cas, l'on considère cet état comme le nouvel état de l'entrée.

En reprenant le montage précédent, nous allons créer un bouton à deux états qui contrôle la LED(2) (presser une fois pour allumer, une autre fois pour éteindre).

MicroPython-Hack-deboucing.jpg
Made with - réalisé avec - Fritzing fritzing.org

Le programme suivant faut la peine d'être étudié attentivement, son fonctionnement pourra se montrer utile dans bien des situations.

# main.py -- put your code here!

import pyb
pin_x1 = pyb.Pin('X1', pyb.Pin.IN, pyb.Pin.PULL_DOWN)
current_state = 0 # dernier état connu de la broche X1
bascule = 0 # Variable qui change d etat a chaque fois que l'on pousse le bouton 

while True:
    # lecture des entrees
    val1 = pin_x1.value()

    # déparasitage logiciel
    pyb.delay(10) # Attendre 10 millisecondes

    # relecture des entrées
    val2 = pin_x1.value()

    # Si val1=Val2 --> Etat Stable
    if val1 == val2:
        # Si valeur lue différente de l'état connu
        if val1 != current_state:
          # On memorise l'etat du bouton comme etat connu
          current_state = val1
          # Bien entendu, le programme ne doit agir que lorsque le bouton
          # est enfoncé (par lorsqu'il est relaché)
          if val1 == 1:
              # On inverse l'état de la "bascule" 
              bascule = 0 if bascule == 1 else 1
              print( 'bascule after %i' % bascule )
              # Apliquer l'etat de la bascule sur la LED(2)
              if bascule == 1:
                  pyb.LED(2).on()
              else:
                  pyb.LED(2).off()
 
    # exécuter le reste du programme 

Déparasitage Matériel

Vous pouvez utiliser une capacité de 10nF en parallèle avec votre bouton pour éliminer une bonne partie des parasites.

Vous pouvez vous inspirer des explications et montages de notre tutoriel bouton pour Arduino. N'oubliez pas d'utiliser une tension de 3.3 Volts pour votre PyBoard ;-)



Source: Debouncing a pin input é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.