třída Signal – ovládání a snímání externích I/O zařízení

Třída Signal je jednoduché rozšíření třídy Pin. Na rozdíl od Pin, který může být pouze v „absolutních“ stavech 0 a 1, může být Signal ve stavu „asserted“ (zapnuto) nebo „deasserted“ (vypnuto), přičemž může být invertovaný (aktivní v nule) nebo ne. Jinými slovy přidává k funkčnosti Pin podporu logické inverze. Ačkoli se to může zdát jako jednoduché doplnění, je to přesně to, co je potřeba pro podporu široké škály jednoduchých digitálních zařízení způsobem přenositelným napříč různými deskami, což je jeden z hlavních cílů MicroPython. Bez ohledu na to, zda mají různí uživatelé LED aktivní ve vysoké nebo nízké úrovni, relé normálně otevřené nebo normálně zavřené - můžete vyvinout jedinou, hezky vypadající aplikaci, která funguje s každým z nich, a zachytit rozdíly v hardwarové konfiguraci v několika řádcích v konfiguračním souboru vaší aplikace.

Příklad:

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

Následuje návod, kdy by se mělo použít Signal versus Pin:

  • Použijte Signal: Pokud chcete ovládat jednoduchá zařízení typu zapnuto/vypnuto (včetně softwarového PWM!) jako LED, vícesegmentové indikátory, relé, bzučáky, nebo číst jednoduché binární senzory, jako jsou tlačítka normálně otevřená nebo normálně zavřená, připojená k vysoké nebo nízké úrovni, jazýčková relé, detektory vlhkosti/plamene atd. atd. Shrnuto, pokud máte skutečné fyzické zařízení/senzor vyžadující přístup ke GPIO, pravděpodobně byste měli použít Signal.

  • Použijte Pin: Pokud implementujete protokol nebo sběrnici vyšší úrovně pro komunikaci se složitějšími zařízeními.

Rozdělení mezi Pin a Signal vychází z výše uvedených případů použití a architektury MicroPython: Pin nabízí nejnižší režii, což může být důležité při bit-bangingu protokolů. Ale Signal přidává nad Pin dodatečnou flexibilitu, za cenu menší režie (mnohem menší, než kdybyste rozdíly mezi zařízeními aktivními ve vysoké a nízké úrovni implementovali v Pythonu ručně!). Pin je navíc nízkoúrovňový objekt, který musí být implementován pro každou podporovanou desku, zatímco Signal je vysokoúrovňový objekt, který je k dispozici zdarma, jakmile je Pin implementován.

Pokud si nejste jisti, vyzkoušejte Signal! Znovu opakujeme, je nabízen, aby ušetřil vývojářům nutnost řešit nezáživné rozdíly jako signály aktivní v nízké versus vysoké úrovni a umožnil dalším uživatelům sdílet a užít si vaši aplikaci, místo aby byli frustrováni tím, že jim nefunguje jen proto, že jejich LED nebo relé jsou zapojeny mírně odlišným způsobem.

Konstruktory

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

Vytvoří objekt Signal. Existují dva způsoby, jak jej zkonstruovat:

  • Obalit existující objekt Pin – univerzální, funguje na libovolné desce.

  • Předat argumenty konstruktoru Pin přímo – stejné poziční a klíčové argumenty akceptované třídou Pin jsou předány interně vytvořenému objektu Pin. Dostupné na mnoha, ale ne na všech deskách.

Argumenty:

  • pin_obj – existující instance Pin, kterou chcete obalit.

  • pin_args / pin_kwargs – argumenty předávané konstruktoru Pin při inline vytváření základního pinu.

  • invert – pokud True, je signál invertovaný (aktivní v nízké úrovni).

Metody

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

Tato metoda umožňuje nastavit a získat hodnotu signálu v závislosti na tom, zda je nebo není zadán argument x.

Pokud je argument vynechán, pak tato metoda získá úroveň signálu, kde 1 znamená, že signál je asserted (aktivní) a 0 - signál neaktivní.

Pokud je argument zadán, pak tato metoda nastaví úroveň signálu. Argument x může být cokoli, co se převede na boolean. Pokud se převede na True, je signál aktivní, jinak je neaktivní.

Vztah mezi tím, že je signál aktivní, a skutečnou logickou úrovní na základním pinu závisí na tom, zda je signál invertovaný (aktivní v nízké úrovni) nebo ne. Pro neinvertovaný signál odpovídá aktivní stav logické 1, neaktivní - logické 0. Pro invertovaný signál aktivní v nízké úrovni odpovídá aktivní stav logické 0, zatímco neaktivní - logické 1.

on() None

Aktivuje signál.

off() None

Deaktivuje signál.