class Signal – contrôler et détecter des périphériques d’E/S externes¶
La classe Signal est une simple extension de la classe Pin. Contrairement à Pin, qui ne peut être que dans les états « absolus » 0 et 1, un Signal peut être dans les états « affirmé » (activé) ou « désaffirmé » (désactivé), tout en étant inversé (actif au niveau bas) ou non. Autrement dit, elle ajoute la prise en charge de l’inversion logique aux fonctionnalités de Pin. Bien que cela puisse sembler un ajout simple, c’est exactement ce qu’il faut pour prendre en charge une vaste gamme de périphériques numériques simples de manière portable entre différentes cartes, ce qui est l’un des objectifs majeurs de MicroPython. Que les différents utilisateurs disposent d’une LED active au niveau haut ou au niveau bas, d’un relais normalement ouvert ou normalement fermé, vous pouvez développer une application unique et élégante qui fonctionne avec chacun d’eux, et capturer les différences de configuration matérielle en quelques lignes dans le fichier de configuration de votre application.
Exemple
from machine import Pin, Signal
# Suppose you have an active-high LED on pin 0
led1_pin = Pin(0, Pin.OUT)
# ... and active-low LED on pin 1
led2_pin = Pin(1, Pin.OUT)
# Now to light up both of them using Pin class, you'll need to set
# them to different values
led1_pin.value(1)
led2_pin.value(0)
# Signal class allows to abstract away active-high/active-low
# difference
led1 = Signal(led1_pin, invert=False)
led2 = Signal(led2_pin, invert=True)
# Now lighting up them looks the same
led1.value(1)
led2.value(1)
# Even better:
led1.on()
led2.on()
Voici le guide indiquant quand utiliser Signal plutôt que Pin :
Utilisez Signal : si vous voulez contrôler des périphériques marche/arrêt simples (y compris le PWM logiciel !) tels que des LED, des indicateurs multi-segments, des relais, des avertisseurs sonores, ou lire des capteurs binaires simples, comme des boutons normalement ouverts ou normalement fermés, tirés au niveau haut ou bas, des interrupteurs Reed, des détecteurs d’humidité/de flamme, etc. En résumé, si vous avez un véritable périphérique/capteur physique nécessitant un accès GPIO, vous devriez probablement utiliser un Signal.
Utilisez Pin : si vous implémentez un protocole ou un bus de plus haut niveau pour communiquer avec des périphériques plus complexes.
La séparation entre Pin et Signal découle des cas d’usage ci-dessus et de l’architecture de MicroPython : Pin offre la surcharge la plus faible, ce qui peut être important lors du bit-banging de protocoles. Mais Signal ajoute une flexibilité supplémentaire par-dessus Pin, au prix d’une surcharge mineure (bien plus faible que si vous implémentiez manuellement en Python les différences entre périphériques actifs au niveau haut et au niveau bas !). De plus, Pin est un objet de bas niveau qui doit être implémenté pour chaque carte prise en charge, tandis que Signal est un objet de haut niveau qui est fourni gratuitement dès que Pin est implémenté.
En cas de doute, essayez Signal ! Encore une fois, il est proposé pour épargner aux développeurs la gestion de différences sans intérêt comme les signaux actifs au niveau bas ou au niveau haut, et pour permettre à d’autres utilisateurs de partager et d’apprécier votre application, plutôt que d’être frustrés par le fait qu’elle ne fonctionne pas chez eux simplement parce que leurs LED ou relais sont câblés d’une manière légèrement différente.
Constructeurs¶
- class machine.Signal(pin_obj: Pin, *, invert: bool = False)¶
- class machine.Signal(*pin_args: Any, invert: bool = False, **pin_kwargs: Any)
Crée un objet Signal. Il y a deux façons de le construire :
Envelopper un objet Pin existant – universel, fonctionne sur n’importe quelle carte.
Passer directement les arguments du constructeur Pin – les mêmes arguments positionnels et nommés acceptés par
Pinsont transmis à un Pin créé en interne. Disponible sur de nombreuses cartes, mais pas toutes.
Arguments :
pin_obj– une instancePinexistante à envelopper.pin_args/pin_kwargs– les arguments à transmettre au constructeurPinlors de la construction en ligne de la broche sous-jacente.invert– siTrue, le signal est inversé (actif au niveau bas).
Méthodes¶
- value(x: Any = None, /) int | None¶
Cette méthode permet de définir et de lire la valeur du signal, selon que l’argument
xest fourni ou non.Si l’argument est omis, cette méthode lit le niveau du signal, 1 signifiant que le signal est affirmé (actif) et 0 que le signal est inactif.
Si l’argument est fourni, cette méthode définit le niveau du signal. L’argument
xpeut être tout ce qui se convertit en booléen. S’il se convertit enTrue, le signal est actif, sinon il est inactif.La correspondance entre le signal actif et le niveau logique réel sur la broche sous-jacente dépend du fait que le signal soit inversé (actif au niveau bas) ou non. Pour un signal non inversé, l’état actif correspond au niveau logique 1 et l’état inactif au niveau logique 0. Pour un signal inversé/actif au niveau bas, l’état actif correspond au niveau logique 0, tandis que l’état inactif correspond au niveau logique 1.