Ligne 228 : |
Ligne 228 : |
| Cela arrive souvent avec les boutons mécaniques où le contact n'est pas franc mais passer pas une phase transitoire avec plusieurs rebond avant le contact définitif. | | Cela arrive souvent avec les boutons mécaniques où le contact n'est pas franc mais passer pas une phase transitoire avec plusieurs rebond avant le contact définitif. |
| | | |
− | [[Fichier:Switchbounce.jpg|360px]]<small><br />Exemple de contact parasite lors du relâchement d'un bouton.<br />Le même phénomène se produit lorsque le bouton est pressé.</small> | + | [[Fichier:Switchbounce.jpg|480px]]<small><br />Exemple de contact parasite lors du relâchement d'un bouton.<br />Le même phénomène se produit lorsque le bouton est pressé.</small> |
| | | |
| Ce sont ces rebonds qui déclenchent plusieurs fois l'interruption. | | Ce sont ces rebonds qui déclenchent plusieurs fois l'interruption. |
Ligne 238 : |
Ligne 238 : |
| | | |
| === déparasitage logiciel === | | === déparasitage logiciel === |
− | Si vous avez lisez l'état du bouton dans votre programme, vous pourrez utiliser une méthode de déparasitage logiciel comme celle-ci: | + | Si vous avez lisez l'état du bouton dans votre programme, vous pourrez utiliser une méthode de déparasitage logiciel comme celle-ci utilisé ci-dessous. |
| | | |
| + | <font color="red">Nous avons créé une classe {{fname|PullUpButton}} qui fait du déparasitage logiciel sur une entrée équipée d'un bouton avec résistance pull-up. Cette classe est stockée dans le fichier '''debounce.py'''</font> |
| | | |
| + | Vous pouvez télécharger le fichier '''debounce.py''' et le placer directement dans le répertoire {{fname|/flash/lib/}} de votre WiPy. |
| + | |
| + | {{download-box|Téléchargez debounce.py|http://df.mchobby.be/wipy/debounce.py}} |
| + | |
| + | [[Fichier:Hack-wipy-button-debounce.jpg|800px]] |
| + | |
| + | Voici comment exploiter la classe {{fname|PullUpButton}}, cet exemple attends que le bouton soit presser 5x pour sortir de la boucle de comptage. |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | from debounce import PullUpButton |
| + | import time |
| + | |
| + | btn = PullUpButton( 'GP8' ) |
| + | |
| + | counter=0 |
| + | while counter < 5: |
| + | print( 'presser le bouton svp' ) |
| + | while not btn.is_pressed(): |
| + | time.sleep_ms( 100 ) |
| + | counter=counter+1 |
| + | print( 'counter = %i' % counter ) |
| + | </syntaxhighlight> |
| + | |
| + | ce qui produit le résultat suivant après '''exactement''' 5 pressions physiques sur le bouton... les rebonds de contact ne viennent plus nous importuner. |
| + | |
| + | <nowiki>presser le bouton svp |
| + | counter = 1 |
| + | presser le bouton svp |
| + | counter = 2 |
| + | presser le bouton svp |
| + | counter = 3 |
| + | presser le bouton svp |
| + | counter = 4 |
| + | presser le bouton svp |
| + | counter = 5</nowiki> |
| + | |
| + | ==== Classe PullUpButton ==== |
| + | Pour les plus curieux, voici l'implémentation de la classe {{fname|PullUpButton}} que vous trouverez dans le fichier {{fname|debounce.py}}. |
| + | |
| + | Vous pouvez clairement y voir une seconde relecture de l'entrée après un délais de 10 millisecondes. C'est là qu'intervient le déparasitage logicielle de l'entrée. |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | from machine import Pin |
| + | import time |
| + | |
| + | class PullUpButton: |
| + | """ Classe pour gérer un bouton pull-up sur une broche X. |
| + | Détecte lorsque la broche passe à 0 """ |
| + | p = None # Pin object |
| + | state = None # Last known state |
| + | |
| + | def __init__( self, button_pin ): |
| + | self.p = Pin( button_pin, Pin.IN, pull=Pin.PULL_UP ) |
| + | self.state = self.p.value() |
| + | |
| + | def is_pressed(self): |
| + | """ vérifie si le bouton est pressé / détecte le changement |
| + | d'état. Ne sera signalé qu'une seule fois! """ |
| + | val = self.p.value() |
| + | result = False |
| + | if val != self.state: |
| + | # relecture dans 10 ms (deboucing) |
| + | time.sleep_ms( 10 ) |
| + | val2 = self.p.value() |
| + | if val == val2: # valeur stable :) |
| + | self.state = val |
| + | result = (val == 0) # Is pressed |
| + | return result |
| + | </syntaxhighlight> |
| | | |
| {{HACK-WIPY-TRAILER}} | | {{HACK-WIPY-TRAILER}} |