Différences entre versions de « P2E-Input-DEBOUNCE-FR »
Ligne 40 : | Ligne 40 : | ||
<syntaxhighlight lang="python" line highlight="3,7"> | <syntaxhighlight lang="python" line highlight="3,7"> | ||
− | + | from machine import Pin | |
+ | |||
+ | last_counter = 0 | ||
+ | counter = 0 | ||
+ | |||
+ | p_in = Pin( 10, Pin.IN, Pin.PULL_UP ) | ||
+ | last_state = p_in.value() | ||
+ | while True: | ||
+ | # lecture de l'état | ||
+ | state = p_in.value() | ||
+ | if state!=last_state: | ||
+ | # raising edge | ||
+ | if state != 0: | ||
+ | counter += 1 | ||
+ | last_state = state | ||
+ | continue | ||
+ | |||
+ | if counter != last_counter: | ||
+ | print( counter ) | ||
+ | last_counter = counter | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Version du 1 février 2025 à 00:09
Introduction
Dans le tutoriel sur les entrées numériques nous avons vu comment détecter la pression d'un bouton.
Ce que ce tutoriel ne nous à pas enseigné, c'est qu'un bouton ne dispose pas de contacts parfait!
Le contact n'est donc pas instantané et présente une série de "rebonds" comme l'indique la capture ci-dessous.
Cet période transitoire dure, tout au plus, 10 millisecondes! Cependant, étant donné la rapidité des microcontrôleurs actuels, 10 millisecondes représente une réelle éternité.
Ainsi, un microcontrôleur sera capable, durant cette période transitoire, de détecter plusieurs pressions sur le bouton.
Ce comportement peu avoir des impacts négatifs sur un projet:
- démarrage/arrêt par à-coups, ce qui peut être néfaste aussi bien électriquement que mécaniquement.
- incrémenter/décrémenter un compteur de consigne de plusieurs unités en une seule pression.
- créer des comportements intempestifs et inattendus dans le logiciel.
Ce tutoriel démontrera l'impact des rebonds sur un compteur puis présentera une solution de déparasitage logiciel.
Cas pratique
L'exemple ci-dessous utilise le bouton Btn 1 pour incrémenter un compteur et en afficher la valeur dans la session REPL à l'aide de la fonction print().
Branchement simplifié
Réaliser le branchement entre GP10 et le contact Btn1.
La carte prend en charge les autres détails du raccordement.
Le bouton permet de raccorder la broche sur la masse lorsque celui-ci est pressé.
Code sans déparasitage
Le code ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE.
En pressant le bouton, on pourra remarquer que, de temps à autre, le bouton incrémente plusieurs fois le compteur.
Cet exemple est également disponible dans le dépôt sous le nom nodebounce.py .
1 from machine import Pin
2
3 last_counter = 0
4 counter = 0
5
6 p_in = Pin( 10, Pin.IN, Pin.PULL_UP )
7 last_state = p_in.value()
8 while True:
9 # lecture de l'état
10 state = p_in.value()
11 if state!=last_state:
12 # raising edge
13 if state != 0:
14 counter += 1
15 last_state = state
16 continue
17
18 if counter != last_counter:
19 print( counter )
20 last_counter = counter
Voici quelques explications:
- Ligne 1: importer l
Un problème?
Pas de message PRESS affiché lorsque vous pressez le bouton ? Voici quelques pistes de recherche:
- Avez-vou
Le défi
Branchez la LEDs Rouge sur GP2 et le Bouton Btn1 sur GP10.
Allumer la LED lors le bouton est enfoncé, éteindre la LED lorsque le bouton est relâché.
Traduction augmentée réalisée par Meurisse. D pour shop.MCHobby.be - Licence CC-BY-SA.