class Signal – controlează și detectează dispozitive I/O externe

Clasa Signal este o extensie simplă a clasei Pin. Spre deosebire de Pin, care poate fi doar în stările „absolute” 0 și 1, un Signal poate fi în starea „activată” (on) sau „dezactivată” (off), putând fi totodată inversat (active-low) sau nu. Cu alte cuvinte, adaugă suport pentru inversare logică funcționalității Pin. Deși ar putea părea o completare simplă, este exact ceea ce este necesar pentru a suporta o gamă largă de dispozitive digitale simple într-un mod portabil între diferite plăci, ceea ce reprezintă unul dintre obiectivele majore ale MicroPython. Indiferent dacă diferiți utilizatori au un LED active-high sau active-low, un releu normal deschis sau normal închis - puteți dezvolta o singură aplicație, arătând bine, care funcționează cu fiecare dintre ele, și puteți captura diferențele de configurare hardware în câteva linii din fișierul de configurare al aplicației.

Exemplu:

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

Următorul ghid arată când ar trebui folosit Signal față de Pin:

  • Folosiți Signal: Dacă doriți să controlați dispozitive simple de tip on/off (inclusiv PWM software!) precum LED-uri, indicatoare cu mai multe segmente, relee, buzzere, sau să citiți senzori binari simpli, precum butoane normal deschise sau normal închise, conectate la nivel înalt sau jos, comutatoare Reed, detectoare de umiditate/flacără etc. Pe scurt, dacă aveți un dispozitiv/senzor fizic real care necesită acces GPIO, probabil ar trebui să folosiți un Signal.

  • Folosiți Pin: Dacă implementați un protocol sau o magistrală de nivel superior pentru a comunica cu dispozitive mai complexe.

Separarea dintre Pin și Signal provine din cazurile de utilizare de mai sus și din arhitectura MicroPython: Pin oferă cea mai mică supraîncărcare, ceea ce poate fi important la protocoalele de tip bit-banging. Dar Signal adaugă flexibilitate suplimentară peste Pin, cu prețul unei supraîncărcări minore (mult mai mică decât dacă ați implementa manual în Python diferențele dintre dispozitivele active-high și active-low!). De asemenea, Pin este un obiect de nivel scăzut care trebuie implementat pentru fiecare placă suportată, în timp ce Signal este un obiect de nivel înalt care vine gratuit odată ce Pin este implementat.

Dacă aveți dubii, încercați Signal! Încă o dată, este oferit pentru a scuti dezvoltatorii de nevoia de a gestiona diferențe neinteresante precum semnalele active-low față de active-high și pentru a permite altor utilizatori să partajeze și să se bucure de aplicația dvs., în loc să fie frustrați de faptul că nu funcționează pentru ei pur și simplu pentru că LED-urile sau releele lor sunt cablate într-un mod ușor diferit.

Constructori

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

Creează un obiect Signal. Există două moduri de a-l construi:

  • Încapsularea unui obiect Pin existent – universal, funcționează pe orice placă.

  • Transmiterea directă a argumentelor constructorului Pin – aceleași argumente poziționale și de tip cuvânt-cheie acceptate de Pin sunt transmise unui Pin creat intern. Disponibil pe multe plăci, dar nu pe toate.

Argumente:

  • pin_obj – o instanță Pin existentă pentru a fi încapsulată.

  • pin_args / pin_kwargs – argumentele de transmis către constructorul Pin la construirea în linie a pinului subiacent.

  • invert – dacă este True, semnalul este inversat (active low).

Metode

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

Această metodă permite setarea și obținerea valorii semnalului, în funcție de faptul dacă argumentul x este furnizat sau nu.

Dacă argumentul este omis, atunci această metodă obține nivelul semnalului, 1 însemnând că semnalul este activat (activ), iar 0 - semnal inactiv.

Dacă argumentul este furnizat, atunci această metodă setează nivelul semnalului. Argumentul x poate fi orice se convertește la o valoare booleană. Dacă se convertește la True, semnalul este activ, altfel este inactiv.

Corespondența dintre faptul că semnalul este activ și nivelul logic efectiv de pe pinul subiacent depinde de faptul dacă semnalul este inversat (active-low) sau nu. Pentru un semnal neinversat, starea activă corespunde valorii logice 1, iar cea inactivă - valorii logice 0. Pentru un semnal inversat/active-low, starea activă corespunde valorii logice 0, în timp ce cea inactivă - valorii logice 1.

on() None

Activează semnalul.

off() None

Dezactivează semnalul.