klasa Signal – sterowanie i odczyt zewnętrznych urządzeń I/O

Klasa Signal jest prostym rozszerzeniem klasy Pin. W przeciwieństwie do Pin, który może znajdować się tylko w „absolutnych” stanach 0 i 1, Signal może znajdować się w stanach „aktywowanym” (włączonym) lub „dezaktywowanym” (wyłączonym), będąc przy tym odwróconym (aktywny stanem niskim) lub nie. Innymi słowy, dodaje obsługę logicznej inwersji do funkcjonalności Pin. Choć może się to wydawać prostym dodatkiem, jest to dokładnie to, czego potrzeba do obsługi szerokiej gamy prostych urządzeń cyfrowych w sposób przenośny między różnymi płytkami, co jest jednym z głównych celów MicroPython. Niezależnie od tego, czy różni użytkownicy mają diodę LED aktywną stanem wysokim czy niskim, przekaźnik normalnie otwarty czy normalnie zamknięty – możesz stworzyć jedną, elegancko wyglądającą aplikację, która działa z każdym z nich, i ująć różnice w konfiguracji sprzętowej w kilku liniach w pliku konfiguracyjnym aplikacji.

Przykład:

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

Poniżej znajduje się wskazówka, kiedy należy używać Signal, a kiedy Pin:

  • Użyj Signal: Jeśli chcesz sterować prostymi urządzeniami typu włącz/wyłącz (w tym programowym PWM!), takimi jak diody LED, wielosegmentowe wskaźniki, przekaźniki, brzęczyki, lub odczytywać proste czujniki binarne, takie jak przyciski normalnie otwarte lub normalnie zamknięte, podciągnięte do stanu wysokiego lub niskiego, kontaktrony, detektory wilgoci/płomienia itd. itp. Podsumowując, jeśli masz prawdziwe fizyczne urządzenie/czujnik wymagające dostępu do GPIO, prawdopodobnie powinieneś użyć Signal.

  • Użyj Pin: Jeśli implementujesz protokół lub magistralę wyższego poziomu do komunikacji z bardziej złożonymi urządzeniami.

Podział na Pin i Signal wynika z powyższych przypadków użycia oraz architektury MicroPython: Pin oferuje najniższy narzut, co może być ważne przy protokołach realizowanych metodą bit-bangingu. Natomiast Signal dodaje dodatkową elastyczność ponad Pin, kosztem niewielkiego narzutu (znacznie mniejszego niż gdybyś ręcznie zaimplementował różnice między urządzeniem aktywnym stanem wysokim a niskim w Pythonie!). Ponadto Pin jest obiektem niskopoziomowym, który musi być zaimplementowany dla każdej obsługiwanej płytki, podczas gdy Signal jest obiektem wysokopoziomowym, który jest dostępny za darmo, gdy tylko Pin zostanie zaimplementowany.

W razie wątpliwości wypróbuj Signal! Po raz kolejny, jest on oferowany, aby uchronić programistów przed koniecznością obsługi nudnych różnic, takich jak sygnały aktywne stanem niskim a wysokim, i pozwolić innym użytkownikom dzielić się Twoją aplikacją i cieszyć się nią, zamiast frustrować się tym, że nie działa u nich tylko dlatego, że ich diody LED lub przekaźniki są okablowane w nieco inny sposób.

Konstruktory

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

Tworzy obiekt Signal. Istnieją dwa sposoby jego skonstruowania:

  • Opakuj istniejący obiekt Pin – uniwersalne, działa na każdej płytce.

  • Przekaż argumenty konstruktora Pin bezpośrednio – te same argumenty pozycyjne i nazwane akceptowane przez Pin są przekazywane do wewnętrznie utworzonego obiektu Pin. Dostępne na wielu, ale nie na wszystkich płytkach.

Argumenty:

  • pin_obj – istniejąca instancja Pin do opakowania.

  • pin_args / pin_kwargs – argumenty przekazywane do konstruktora Pin podczas wbudowanego tworzenia bazowego pinu.

  • invert – jeśli True, sygnał jest odwrócony (aktywny stanem niskim).

Metody

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

Ta metoda pozwala ustawić i odczytać wartość sygnału, w zależności od tego, czy argument x jest podany, czy nie.

Jeśli argument zostanie pominięty, metoda odczytuje poziom sygnału, gdzie 1 oznacza, że sygnał jest aktywowany (aktywny), a 0 – sygnał nieaktywny.

Jeśli argument zostanie podany, metoda ustawia poziom sygnału. Argument x może być czymkolwiek, co konwertuje się na wartość logiczną. Jeśli konwertuje się na True, sygnał jest aktywny, w przeciwnym razie jest nieaktywny.

Zależność między aktywnością sygnału a rzeczywistym poziomem logicznym na bazowym pinie zależy od tego, czy sygnał jest odwrócony (aktywny stanem niskim), czy nie. Dla sygnału nieodwróconego stan aktywny odpowiada logicznej 1, a nieaktywny – logicznemu 0. Dla sygnału odwróconego/aktywnego stanem niskim stan aktywny odpowiada logicznemu 0, a nieaktywny – logicznej 1.

on() None

Aktywuje sygnał.

off() None

Dezaktywuje sygnał.