class Signal – controlar y detectar dispositivos de E/S externos¶
La clase Signal es una extensión simple de la clase Pin. A diferencia de Pin, que solo puede estar en los estados «absolutos» 0 y 1, una Signal puede estar en estado «afirmado» (encendido) o «desafirmado» (apagado), pudiendo además estar invertida (activa en bajo) o no. En otras palabras, añade soporte de inversión lógica a la funcionalidad de Pin. Aunque esto pueda parecer una adición simple, es exactamente lo que se necesita para dar soporte a una amplia gama de dispositivos digitales sencillos de una forma portable entre distintas placas, lo cual es uno de los principales objetivos de MicroPython. Independientemente de si distintos usuarios tienen un LED activo en alto o activo en bajo, un relé normalmente abierto o normalmente cerrado, puede desarrollar una única aplicación de aspecto cuidado que funcione con cada uno de ellos, y capturar las diferencias de configuración de hardware en unas pocas líneas del archivo de configuración de su aplicación.
Ejemplo:
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()
La siguiente es la guía sobre cuándo debe usarse Signal frente a Pin:
Use Signal: si desea controlar dispositivos sencillos de encendido/apagado (¡incluido el PWM por software!) como LEDs, indicadores multisegmento, relés, zumbadores, o leer sensores binarios sencillos, como botones normalmente abiertos o normalmente cerrados, conectados a alto o a bajo, interruptores Reed, detectores de humedad/llama, etc. etc. En resumen, si tiene un dispositivo/sensor físico real que requiere acceso GPIO, probablemente debería usar una Signal.
Use Pin: si implementa un protocolo o bus de nivel superior para comunicarse con dispositivos más complejos.
La división entre Pin y Signal proviene de los casos de uso anteriores y de la arquitectura de MicroPython: Pin ofrece la menor sobrecarga, lo que puede ser importante al implementar protocolos por bit-banging. Pero Signal añade flexibilidad adicional sobre Pin, a costa de una sobrecarga menor (¡mucho menor que si implementara las diferencias entre dispositivos activos en alto y activos en bajo manualmente en Python!). Además, Pin es un objeto de bajo nivel que debe implementarse para cada placa compatible, mientras que Signal es un objeto de alto nivel que se obtiene gratis una vez implementado Pin.
Si tiene dudas, ¡pruebe Signal! Una vez más, se ofrece para ahorrar a los desarrolladores la necesidad de gestionar diferencias poco emocionantes como las señales activas en bajo frente a las activas en alto, y permitir que otros usuarios compartan y disfruten de su aplicación, en lugar de frustrarse por el hecho de que no funcione para ellos simplemente porque sus LEDs o relés están cableados de una forma ligeramente distinta.
Constructores¶
- class machine.Signal(pin_obj: Pin, *, invert: bool = False)¶
- class machine.Signal(*pin_args: Any, invert: bool = False, **pin_kwargs: Any)
Crea un objeto Signal. Hay dos formas de construirlo:
Envolver un objeto Pin existente – universal, funciona en cualquier placa.
Pasar directamente los argumentos del constructor de Pin – los mismos argumentos posicionales y de palabra clave que acepta
Pinse reenvían a un Pin creado internamente. Disponible en muchas placas, pero no en todas.
Argumentos:
pin_obj– una instanciaPinexistente que se va a envolver.pin_args/pin_kwargs– los argumentos que se reenviarán al constructor dePinal construir el pin subyacente en línea.invert– si esTrue, la señal se invierte (activa en bajo).
Métodos¶
- value(x: Any = None, /) int | None¶
Este método permite establecer y obtener el valor de la señal, según se proporcione o no el argumento
x.Si se omite el argumento, este método obtiene el nivel de la señal: 1 significa que la señal está afirmada (activa) y 0 que la señal está inactiva.
Si se proporciona el argumento, este método establece el nivel de la señal. El argumento
xpuede ser cualquier cosa que se convierta en un booleano. Si se convierte enTrue, la señal está activa; de lo contrario, está inactiva.La correspondencia entre que la señal esté activa y el nivel lógico real en el pin subyacente depende de si la señal está invertida (activa en bajo) o no. Para una señal no invertida, el estado activo corresponde al 1 lógico, y el inactivo al 0 lógico. Para una señal invertida/activa en bajo, el estado activo corresponde al 0 lógico, mientras que el inactivo corresponde al 1 lógico.