class Signal – controlla e rileva dispositivi di I/O esterni

La classe Signal è una semplice estensione della classe Pin. A differenza di Pin, che può trovarsi solo negli stati «assoluti» 0 e 1, un Signal può trovarsi negli stati «asserito» (on) o «non asserito» (off), potendo essere invertito (attivo basso) oppure no. In altre parole, aggiunge il supporto all’inversione logica alle funzionalità di Pin. Sebbene possa sembrare una semplice aggiunta, è esattamente ciò che serve per supportare un’ampia gamma di semplici dispositivi digitali in modo portabile tra schede diverse, che è uno dei principali obiettivi di MicroPython. Indipendentemente dal fatto che diversi utenti abbiano un LED attivo alto o attivo basso, un relè normalmente aperto o normalmente chiuso, puoi sviluppare un’unica applicazione ben fatta che funziona con ciascuno di essi, racchiudendo le differenze di configurazione hardware in poche righe nel file di configurazione della tua app.

Esempio:

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()

Di seguito una guida su quando usare Signal rispetto a Pin:

  • Usa Signal: se vuoi controllare semplici dispositivi on/off (incluso il PWM software!) come LED, indicatori multi-segmento, relè, cicalini, oppure leggere semplici sensori binari, come pulsanti normalmente aperti o normalmente chiusi, con pull-up o pull-down, interruttori reed, rilevatori di umidità/fiamma, ecc. ecc. Riassumendo, se hai un dispositivo/sensore fisico reale che richiede l’accesso GPIO, probabilmente dovresti usare un Signal.

  • Usa Pin: se implementi un protocollo o un bus di livello superiore per comunicare con dispositivi più complessi.

La distinzione tra Pin e Signal deriva dai casi d’uso sopra descritti e dall’architettura di MicroPython: Pin offre l’overhead più basso, il che può essere importante quando si effettua il bit-banging dei protocolli. Ma Signal aggiunge ulteriore flessibilità rispetto a Pin, al costo di un overhead minimo (molto più piccolo rispetto a se implementassi manualmente in Python le differenze tra dispositivi attivi alti e attivi bassi!). Inoltre, Pin è un oggetto di basso livello che deve essere implementato per ogni scheda supportata, mentre Signal è un oggetto di alto livello che si ottiene gratuitamente una volta implementato Pin.

In caso di dubbio, prova Signal! Ancora una volta, è offerto per evitare agli sviluppatori la necessità di gestire differenze poco entusiasmanti come quelle tra segnali attivi bassi e attivi alti, e per consentire ad altri utenti di condividere e apprezzare la tua applicazione, invece di essere frustrati dal fatto che non funziona per loro semplicemente perché i loro LED o relè sono cablati in modo leggermente diverso.

Costruttori

class machine.Signal(pin_obj: Pin, *, invert: bool = False)
class machine.Signal(*pin_args: Any, invert: bool = False, **pin_kwargs: Any)

Crea un oggetto Signal. Ci sono due modi per costruirlo:

  • Avvolgere un oggetto Pin esistente – universale, funziona su qualsiasi scheda.

  • Passare direttamente gli argomenti del costruttore di Pin – gli stessi argomenti posizionali e a parola chiave accettati da Pin vengono inoltrati a un Pin creato internamente. Disponibile su molte schede, ma non tutte.

Argomenti:

  • pin_obj – un’istanza Pin esistente da avvolgere.

  • pin_args / pin_kwargs – gli argomenti da inoltrare al costruttore di Pin quando si costruisce in linea il pin sottostante.

  • invert – se True il segnale viene invertito (attivo basso).

Metodi

value(x: Any = None, /) int | None

Questo metodo consente di impostare e ottenere il valore del segnale, a seconda che l’argomento x sia fornito o meno.

Se l’argomento è omesso, questo metodo ottiene il livello del segnale: 1 significa che il segnale è asserito (attivo) e 0 che il segnale è inattivo.

Se l’argomento è fornito, questo metodo imposta il livello del segnale. L’argomento x può essere qualsiasi cosa convertibile in un booleano. Se si converte in True, il segnale è attivo, altrimenti è inattivo.

La corrispondenza tra segnale attivo e livello logico effettivo sul pin sottostante dipende dal fatto che il segnale sia invertito (attivo basso) oppure no. Per un segnale non invertito, lo stato attivo corrisponde al livello logico 1, quello inattivo al livello logico 0. Per un segnale invertito/attivo basso, lo stato attivo corrisponde al livello logico 0, mentre quello inattivo al livello logico 1.

on() None

Attiva il segnale.

off() None

Disattiva il segnale.