Différences entre versions de « P2E-Digital-Input-FR »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
(35 versions intermédiaires par le même utilisateur non affichées)
Ligne 21 : Ligne 21 :
 
Dans cet exemple, nous allons utiliser la broche GP10 pour détecter la pression sur le bouton 1 (Btn1).
 
Dans cet exemple, nous allons utiliser la broche GP10 pour détecter la pression sur le bouton 1 (Btn1).
  
== Branchement simplifiée ==
+
=== Branchement simplifiée ===
  
Réaliser le branchement entre GP2 et le contact de la LED ROUGE.<br />La carte prend en charge les autres détails du raccordement.
+
Réaliser le branchement entre GP10 et le contact Btn1.<br />La carte prend en charge les autres détails du raccordement.
  
[[Fichier:P2E-digital-output.png|800px]]
+
Le bouton permet de raccorder la broche sur la masse lorsque celui-ci est pressé.
  
== Code ==
+
[[Fichier:P2E-digital-input.png|800px]]
 +
 
 +
=== Code ===
 
Le code ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE.
 
Le code ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE.
  
Cet exemple est également disponible dans le dépôt [https://github.com/mchobby/pico-2-explorer/tree/main/output-led Pico-2-Explorer/output-led/]
+
Cet exemple est également disponible dans le dépôt [https://github.com/mchobby/pico-2-explorer/tree/main/input-button Pico-2-Explorer/input-button/]
  
<syntaxhighlight lang="python" line>
+
<syntaxhighlight lang="python" line highlight="3,7">
 
from machine import Pin
 
from machine import Pin
 
import time
 
import time
p = Pin( 2, Pin.OUT )
+
p_in = Pin( 10, Pin.IN, Pin.PULL_UP )
  
# Allumer la LED
+
while True:
p.value( True )
+
    # lecture de l'état
time.sleep(1)
+
    v = p_in.value()
 +
   
 +
    if v==0:
 +
        print( 'PRESS' )
 +
    else:
 +
        print( '---' )
  
# Eteindre la LED
+
    time.sleep(1)
p.value( False )
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
Voici quelques explications:
 
Voici quelques explications:
 
* '''Ligne 1''': importer la classe {{fname|Pin}} depuis le module {{fname|machine}}. Cette classe permet de manipuler les broches du microcontrôleur.
 
* '''Ligne 1''': importer la classe {{fname|Pin}} depuis le module {{fname|machine}}. Cette classe permet de manipuler les broches du microcontrôleur.
* '''Ligne 3''': la variable {{fname|p}} contient une instance de la classe {{fname|Pin}}. Le premier paramètre est l'identification de la broche (2 pour GP2) et la constante '''Pin.OUT''' (OUT = sortie) configure la broche en sortie.
+
* '''Ligne 3''': la variable {{fname|p_in}} contient une instance de la classe {{fname|Pin}}. Le premier paramètre est l'identification de la broche (10 pour GP10) et la constante '''Pin.IN''' (IN = input) configure la broche en entrée. Le troisième paramètre {{fname|Pin.PULL_UP}} active la résistance pull-up interne de l'entrée.
* '''Ligne 6''': la méthode {{fname|value( val )}} permet de modifier l'état de la broche en fonction de la valeur du paramètre. Avec une paramètre {{fname|True}}, la broche est placée au niveau HAUT. La tension de la broche est de 3.3V, ce qui allume la LED.
+
* '''Ligne 5''': utilisation d'une boucle {{fname|while}} infinie pour répéter encore et encore le bloc de lignes de 6 à 14.
* '''Ligne 7''': l'appel de {{fname|time.sleep(1)}} crée une pause de 1 seconde.
+
* '''Ligne 7''': la méthode {{fname|value()}} sans paramètre permet de lire l'état de la broche. Cette méthode retournera 0 lorsque la broche est à l'état BAS et 1 lorsqu'elle est à l'état HAUT.
* '''Ligne 10''': l'appel de {{fname|pin.value( False )}} place la broche au niveau BAS. La tension de la broche est de 0V, la LED est donc éteinte.
+
* '''Lignes 9 à 12''': le contenu de la variable {{fname|v}} contiendra 0 si le bouton est pressé. Dans pareil cas, le message "PRESS" sera affiché dans la session REPL. Si le bouton est relâché alors des tirets seront affichés.
 +
* '''Ligne 14''': création d'une pose de 1 seconde entre deux lectures successives.
 +
 
 +
{{tmbox | text = Le lecteur attentif aura noté qu'il y a une forme de logique inversée. En effet, le bouton pressé retourne un état "False" tandis qu'un bouton relâché retourne un état "True". }}
  
== Un problème? ==
+
=== Un problème? ===
La LED ne s'allume pas ? Voici quelques pistes de recherche:
+
Pas de message PRESS affiché lorsque vous pressez le bouton ? Voici quelques pistes de recherche:
# Vérifier votre câblage. Etes-vous bien connecté sur la broche GP2 du microcontrôleur ?
+
# Avez-vous pressé le bouton suffisamment longtemps? l'état est lu toutes les secondes.
# Vérifier que le script Python manipule bien la broche 2.
+
# Vérifier votre câblage. Etes-vous bien connecté sur la broche GP10 du microcontrôleur ?
# Vérifier que la broche est bien commandée en sortie (Pin.OUT).
+
# Vérifier que le script Python lit bien l'état de la broche 10.
 +
# Vérifier que la résistance PULL-UP est bien activée sur la broche (avec {{fname|Pin.PULL_UP}}).
  
 
== Le défi ==
 
== Le défi ==
Branchez les LEDs Rouge, Orange, Verte respectivement sur les GPIOs 2, 3, 4.
+
Branchez la LEDs Rouge sur GP2 et le Bouton Btn1 sur GP10.
  
Créez ensuite un script pour allumer chaque LED à tour de rôle pendant une seconde, en commençant par la LED verte puis l'orange et finir par la rouge.
+
Allumer la LED lors le bouton est enfoncé, éteindre la LED lorsque le bouton est relâché.
  
 
== Encore plus ==
 
== Encore plus ==
  
Si vous voulez savoir comment
+
En apprendre plus sur le fonctionnement du bouton poussoir.
 
 
=== A propos de la LED ===
 
 
 
Une LED est comme une diode, elle ne laisse passer le courant que dans un seul sens (du "+" vers le "-"). Sa particularité est de produire de la lumière lorsqu'un courant la traverse.
 
  
Si la LED est branchée à l'envers alors elle se trouve dans le sens bloquant et ne produira aucune lumière (il suffit de la retourner pour inverser le plus et le moins).
+
=== A propos du bouton ===
  
Pour vous aider à raccorder une LED:
+
Les boutons poussoirs sont équipés de 4 pattes. Elles vont donc par paires.
* Une LED dispose d'une broche PLUS longue et d'une broche courte. La broche la '''PLUS''' longue va au '''POSITIF'''.
 
* Il manque également de la matière sur l'un des côté de la LED. La où il y a de la matière en '''MOINS''' c'est la borne '''NEGATIVE'''.  
 
  
[[Fichier:Led-Polarite.jpg|80px]]
+
Une astuce pratique pour ne jamais rater un raccordement avec un bouton consiste a utiliser les pattes diamétralement opposée.
  
=== Brancher une LED ===
+
[[Fichier:Btn-Howto-Wire.png|640px]]
{{tmbox | text = Lorsque vous utilisez une des LEDs présentes sur le Pico-2-Explorer, la LED, la résistance et la masse sont déjà pré-cablés sur la carte.}}
 
  
Pour qu'une LED s'allume, il faut une tension sur la broche positive de la LED et une possibilité pour ce courant de retourner vers la masse (GND).
+
=== Brancher un bouton ===
 +
{{tmbox | text = Lorsque vous utilisez l'un des boutons présentes sur le Pico-2-Explorer, le bouton, est déjà pré-câblé à la masse et la résistance Pull-up de la broche doit impérativement être activée.}}
  
La différence de tension aux bornes de la LED doit être supérieure à un minimum donnée dépendant du type de LED (de l'ordre de 1.5 à 1.8V). Cette tension s'appelle "Tension directe" (Vf), elle est mentionnée dans la fiche technique.
+
[[Fichier:P2E-input-button-wiring.png|360px]]
  
Autre point important, une LED à '''absolument besoin d'une résistance''' pour limiter le courant qui la traverse... sinon ce courant tendra vers l'infini et détruira la LED et la broche du microcontrôleur. Pour un système 3.3V cette résistance est de 470 Ohms.
+
Dans le graphique ci-dessus, une résistance est dessinée dans le Pico entre la broche GPx et la broche 3V3. Il s'agit de la résistance Pull-UP interne (~100 KOhms) du microcontrôleur qui est activable avec le 3ieme paramètre {{fname|Pin.PULL_UP}}.
  
Voici à quoi ressemble le schéma électrique
+
Le rôle de cette résistance est de tirer le potentiel de la broche vers 3.3V. Par conséquent, si le bouton n'est pas enfoncé (son contact est ouvert), la est amenée/tirée au potentiel de 3.3V par la résistance. L'instruction {{fname|p_in.value()}} retourne 1 puisque c'est un niveau HAUT.
  
[[Fichier:P2E-output-led-wiring.png]]
+
Si le bouton est pressé alors la broche est mise en contact directement avec la masse. Le potentiel de la broche est donc de 0V et {{fname|p_in.value()}} retourne 0 puisque c'est un niveau BAS.
  
Schéma que l'on peut reporter sur un breadboard comme ceci et qui produira exactement le même résultat que la LED présente sur le Pico-2-Explorer.
+
Avec ce que nous connaissons maintenant, il est possible de brancher directement un bouton en réalisant les connexions suivantes:
  
[[Fichier:P2E-output-led-wiring-2.png|800px]]
+
[[Fichier:P2E-input-button-wiring-2.png|800px]]
  
 
== Trucs et astuces ==
 
== Trucs et astuces ==
Voici quelques informations complémentaires concernant la manipulation de broches configurées en sortie.
+
Voici quelques informations complémentaires concernant la manipulation de broches configurées en entrée.
 
 
=== lire l'état de la broche ===
 
  
Il est très facile de connaître l'état actuel de la broche en appelant la méthode {{fname|value()}} sans paramètre.
+
=== Utiliser Signal ===
  
La fonction retourne alors:
+
{{fname|Signal}} est une classe qui permet d'inverser l'état d'un signal. Cela permet d'utiliser un bouton et de revenir dans une logique positive (obtenir état HAUT/vrai lorsque le bouton est pressé).
* '''1''' pour un niveau HAUT (3V3)
 
* '''0''' pour un niveau BAS (0V)
 
  
<syntaxhighlight lang="python" line highlight="9">
+
<syntaxhighlight lang="python" line highlight="4,8,9">
from machine import Pin
+
from machine import Pin, Signal
 
import time
 
import time
p = Pin( 2, Pin.OUT )
+
p_in = Pin( 10, Pin.IN, Pin.PULL_UP )
 +
s_in = Signal( p_in, invert=True )
  
# Allumer la LED
+
while True:
p.value( True )
+
    # lecture de l'état
 +
    v = s_in.value()
 +
    print( 'PRESS' if v else '---' )
  
# Obtenir l'état de la broche
+
    time.sleep(1)
val = p.value()
 
print( val )
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
Le script affiche toujours "PRESS" lorsque le bouton est pressé mais cette fois, le test est en logique positive! v est vrai (1) lorsque le bouton est pressé.
  
 
Voici quelques explications:
 
Voici quelques explications:
* '''Ligne 9''': lorsque la méthode {{fname|value()}} est appelée sans paramètre, celle-ci retourne une valeur correspondant à l'état "actuel" de la broche.
+
* '''Ligne 4''': utilisation de la classe {{fname|Signal}} en passant l'instance de la broche {{fname|p_in}} en paramètre. Enfin, le deuxième paramètre {{invert=True}} permet d'inverser la logique de {{fname|p_in}}.
* '''Ligne 10''': l'instruction {{fname|print(val)}} affiche la valeur précédemment collectée à la ligne précédente. Cette valeur est '''1''' puisque la broche est à l'état haut.
+
* '''Ligne 8''': l'appel {{fname|s_in.value()}} effectue la lecture de la broche {{fname|p_in.value()}} et inverse le résultat. Par conséquent v contient 1 lorsque le bouton est pressé.
 
+
* '''Ligne 9''': utilisation d'une [https://book.pythontips.com/en/latest/ternary_operators.html expression ternaire] (PythonTips.com) qui affiche "PRESS" si l'expression {{fname|v}} est évaluée a True (ce qui est le cas si {{fname|v}} contient la valeur 1).
=== Inverser l'état de la broche ===
 
La méthode {{fname|toggle()}} permet d'inverser facilement l'état d'une broche configurée en sortie.
 
 
 
<syntaxhighlight lang="python" line highlight="12,16">
 
from machine import Pin
 
import time
 
p = Pin( 2, Pin.OUT )
 
 
 
# Allumer la LED
 
p.value( True )
 
 
 
time.sleep(1)
 
 
 
# Inverser l'état de la broche
 
# Donc, éteindre la LED
 
p.toggle()
 
 
 
# Inverser encore une fois l'état de la broche
 
# Donc, allumer la LED
 
p.toggle()
 
</syntaxhighlight>
 
 
 
=== Utiliser une valeur numérique ===
 
La méthode {{fname|value( val )}} peut également recevoir une valeur numérique en paramètre.  
 
* La valeur 0 placera la broche au niveau BAS (0V)
 
* La valeur 1 placera la broche au niveau HAUT (3.3V)
 
* Toutes valeur supérieure à 0 (ou évaluée comme vraie) placera la broche au niveau HAUT (3.3V).
 
 
 
Il est donc possible d'utiliser le résultat d'une fonction utilisateur pour fixer l'état de la broche. Cela s'avérera fort utile lors de la création de scripts plus complexes.
 
 
 
<syntaxhighlight lang="python" line highlight="6,10">
 
from machine import Pin
 
import time
 
p = Pin( 2, Pin.OUT )
 
 
 
# Allumer la LED
 
p.value( 1 )
 
time.sleep(1)
 
 
 
# Eteindre la LED
 
p.value( 0 )
 
</syntaxhighlight>
 
 
 
=== Méthodes on() et off() ===
 
 
 
La méthode {{fname|on()}} permet de placer une broche au niveau HAUT (3.3V) tandis que la méthode {{fname|off()}} place la broche au niveau BAS (0V).
 
 
 
Utiliser les méthodes {{fname|on()}} et {{fname|off()}} permettent d'améliorer la lisibilité du script.
 
 
 
<syntaxhighlight lang="python" line highlight="6,10">
 
from machine import Pin
 
import time
 
p = Pin( 2, Pin.OUT )
 
 
 
# Allumer la LED
 
p.on()
 
time.sleep(1)
 
  
# Eteindre la LED
 
p.off()
 
</syntaxhighlight>
 
  
 
{{P2E-TRAILER}}
 
{{P2E-TRAILER}}

Version actuelle datée du 27 octobre 2024 à 23:03

Introduction

Une broche de microcontrôleur présente généralement plusieurs fonctions qui permettent de l'utiliser de façon différentes.

La seconde fonction utile est l'entrée numérique aussi dit "digital input" en anglais.

Dans ce mode de fonctionnement de la broche, le microcontrôleur est capable de détecter le niveau logique HAUT (3.3V) ou BAS (0V) qui y est présent.

  • Si la tension est fixée à 3,3V (> 2.3V) alors le niveau logique retourné est HAUT.
  • Si la tension est fixée à 0V (< 0.8V)A alors le niveau logique retourné est BAS.

Grâce à cela, il est possible de lire l'état d'un composant comme un bouton poussoir, un interrupteur, un contact de passage ou l'état renvoyé par un élément électronique.

Note: une broche configurée en entrée présente un très grande impédance (grande résistance interne) de sorte que la capture de la tension logique ne perturbe en rien le circuit mesuré (puisqu'aucun courant n'entre ou ne sort d'une broche en lecture).

En Python, l'état HAUT correspond à une valeur 1 et l'état BAS correspond à une valeur 0.

Cas pratique

Dans cet exemple, nous allons utiliser la broche GP10 pour détecter la pression sur le bouton 1 (Btn1).

Branchement simplifiée

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é.

P2E-digital-input.png

Code

Le code ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE.

Cet exemple est également disponible dans le dépôt Pico-2-Explorer/input-button/

 1 from machine import Pin
 2 import time
 3 p_in = Pin( 10, Pin.IN, Pin.PULL_UP )
 4 
 5 while True:
 6     # lecture de l'état
 7     v = p_in.value()
 8     
 9     if v==0:
10         print( 'PRESS' )
11     else:
12         print( '---' )
13 
14     time.sleep(1)

Voici quelques explications:

  • Ligne 1: importer la classe Pin depuis le module machine. Cette classe permet de manipuler les broches du microcontrôleur.
  • Ligne 3: la variable p_in contient une instance de la classe Pin. Le premier paramètre est l'identification de la broche (10 pour GP10) et la constante Pin.IN (IN = input) configure la broche en entrée. Le troisième paramètre Pin.PULL_UP active la résistance pull-up interne de l'entrée.
  • Ligne 5: utilisation d'une boucle while infinie pour répéter encore et encore le bloc de lignes de 6 à 14.
  • Ligne 7: la méthode value() sans paramètre permet de lire l'état de la broche. Cette méthode retournera 0 lorsque la broche est à l'état BAS et 1 lorsqu'elle est à l'état HAUT.
  • Lignes 9 à 12: le contenu de la variable v contiendra 0 si le bouton est pressé. Dans pareil cas, le message "PRESS" sera affiché dans la session REPL. Si le bouton est relâché alors des tirets seront affichés.
  • Ligne 14: création d'une pose de 1 seconde entre deux lectures successives.

Un problème?

Pas de message PRESS affiché lorsque vous pressez le bouton ? Voici quelques pistes de recherche:

  1. Avez-vous pressé le bouton suffisamment longtemps? l'état est lu toutes les secondes.
  2. Vérifier votre câblage. Etes-vous bien connecté sur la broche GP10 du microcontrôleur ?
  3. Vérifier que le script Python lit bien l'état de la broche 10.
  4. Vérifier que la résistance PULL-UP est bien activée sur la broche (avec Pin.PULL_UP).

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é.

Encore plus

En apprendre plus sur le fonctionnement du bouton poussoir.

A propos du bouton

Les boutons poussoirs sont équipés de 4 pattes. Elles vont donc par paires.

Une astuce pratique pour ne jamais rater un raccordement avec un bouton consiste a utiliser les pattes diamétralement opposée.

Btn-Howto-Wire.png

Brancher un bouton

P2E-input-button-wiring.png

Dans le graphique ci-dessus, une résistance est dessinée dans le Pico entre la broche GPx et la broche 3V3. Il s'agit de la résistance Pull-UP interne (~100 KOhms) du microcontrôleur qui est activable avec le 3ieme paramètre Pin.PULL_UP.

Le rôle de cette résistance est de tirer le potentiel de la broche vers 3.3V. Par conséquent, si le bouton n'est pas enfoncé (son contact est ouvert), la est amenée/tirée au potentiel de 3.3V par la résistance. L'instruction p_in.value() retourne 1 puisque c'est un niveau HAUT.

Si le bouton est pressé alors la broche est mise en contact directement avec la masse. Le potentiel de la broche est donc de 0V et p_in.value() retourne 0 puisque c'est un niveau BAS.

Avec ce que nous connaissons maintenant, il est possible de brancher directement un bouton en réalisant les connexions suivantes:

P2E-input-button-wiring-2.png

Trucs et astuces

Voici quelques informations complémentaires concernant la manipulation de broches configurées en entrée.

Utiliser Signal

Signal est une classe qui permet d'inverser l'état d'un signal. Cela permet d'utiliser un bouton et de revenir dans une logique positive (obtenir état HAUT/vrai lorsque le bouton est pressé).

 1 from machine import Pin, Signal
 2 import time
 3 p_in = Pin( 10, Pin.IN, Pin.PULL_UP )
 4 s_in = Signal( p_in, invert=True )
 5 
 6 while True:
 7     # lecture de l'état
 8     v = s_in.value()
 9     print( 'PRESS' if v else '---' )
10 
11     time.sleep(1)

Le script affiche toujours "PRESS" lorsque le bouton est pressé mais cette fois, le test est en logique positive! v est vrai (1) lorsque le bouton est pressé.

Voici quelques explications:

  • Ligne 4: utilisation de la classe Signal en passant l'instance de la broche p_in en paramètre. Enfin, le deuxième paramètre Modèle:Invert=True permet d'inverser la logique de p_in.
  • Ligne 8: l'appel s_in.value() effectue la lecture de la broche p_in.value() et inverse le résultat. Par conséquent v contient 1 lorsque le bouton est pressé.
  • Ligne 9: utilisation d'une expression ternaire (PythonTips.com) qui affiche "PRESS" si l'expression v est évaluée a True (ce qui est le cas si v contient la valeur 1).


Modèle:P2E-TRAILER