Signal osztály – külső I/O eszközök vezérlése és érzékelése

A Signal osztály a Pin osztály egyszerű kiterjesztése. A Pin osztállyal ellentétben, amely csak „abszolút” 0 és 1 állapotban lehet, a Signal lehet „érvényesített” (bekapcsolt) vagy „érvénytelenített” (kikapcsolt) állapotban, miközben lehet invertált (aktív alacsony) vagy sem. Más szóval logikai inverziós támogatást ad a Pin funkcionalitásához. Bár ez egyszerű kiegészítésnek tűnhet, pontosan ez kell ahhoz, hogy az egyszerű digitális eszközök széles skáláját a különböző lapok között hordozható módon támogassuk, ami a MicroPython egyik fő célja. Függetlenül attól, hogy a különböző felhasználóknak aktív magas vagy aktív alacsony LED-jük, alaphelyzetben nyitott vagy alaphelyzetben zárt relé-jük van – kifejleszthetsz egyetlen, szépen kinéző alkalmazást, amely mindegyikkel működik, és a hardverkonfiguráció különbségeit néhány sorban rögzítheted az alkalmazásod konfigurációs fájljában.

Példa:

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

A következő útmutató segít eldönteni, mikor érdemes a Signal-t és mikor a Pin-t használni:

  • Használj Signal-t: Ha egyszerű be/ki (beleértve a szoftveres PWM-et is!) eszközöket akarsz vezérelni, mint LED-ek, többszegmenses kijelzők, relék, hangjelzők, vagy egyszerű bináris érzékelőket akarsz olvasni, mint alaphelyzetben nyitott vagy alaphelyzetben zárt gombok, magasra vagy alacsonyra húzva, Reed-kapcsolók, nedvesség-/lángérzékelők stb. Összefoglalva, ha van egy valódi fizikai eszközöd/érzékelőd, amely GPIO hozzáférést igényel, valószínűleg Signal-t kellene használnod.

  • Használj Pin-t: Ha magasabb szintű protokollt vagy buszt valósítasz meg összetettebb eszközökkel való kommunikációhoz.

A Pin és a Signal közötti felosztás a fenti felhasználási esetekből és a MicroPython architektúrájából ered: a Pin kínálja a legkisebb többletterhelést, ami fontos lehet bit-banging protokollok esetén. A Signal viszont további rugalmasságot ad a Pin tetejére, csekély többletterhelés árán (sokkal kisebb, mintha az aktív magas vs aktív alacsony eszközök különbségeit kézzel valósítanád meg Pythonban!). Ezenkívül a Pin egy alacsony szintű objektum, amelyet minden támogatott laphoz meg kell valósítani, míg a Signal egy magas szintű objektum, amely ingyen jár, amint a Pin meg van valósítva.

Ha kétségeid vannak, próbáld ki a Signal-t! Ismételten, azért kínáljuk, hogy megkímélje a fejlesztőket az olyan unalmas különbségek kezelésétől, mint az aktív alacsony vs aktív magas jelek, és lehetővé tegye más felhasználók számára, hogy megosszák és élvezzék az alkalmazásodat, ahelyett, hogy frusztrálná őket, hogy egyszerűen azért nem működik nekik, mert a LED-jeik vagy reléik kissé másképp vannak bekötve.

Konstruktorok

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

Létrehoz egy Signal objektumot. Kétféleképpen hozható létre:

  • Egy meglévő Pin objektum becsomagolása – univerzális, bármely lapon működik.

  • Pin konstruktor argumentumok közvetlen átadása – a Pin által elfogadott ugyanazon pozicionális és kulcsszavas argumentumok továbbításra kerülnek egy belsőleg létrehozott Pin objektumnak. Sok, de nem minden lapon elérhető.

Argumentumok:

  • pin_obj – egy meglévő Pin példány a becsomagoláshoz.

  • pin_args / pin_kwargs – a Pin konstruktornak továbbítandó argumentumok a mögöttes láb helyben történő létrehozásakor.

  • invert – ha True, a jel invertált (aktív alacsony).

Metódusok

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

Ez a metódus lehetővé teszi a jel értékének beállítását és lekérését, attól függően, hogy az x argumentumot megadod-e vagy sem.

Ha az argumentum hiányzik, akkor ez a metódus lekéri a jelszintet, ahol az 1 azt jelenti, hogy a jel érvényesített (aktív), a 0 pedig azt, hogy a jel inaktív.

Ha az argumentumot megadod, akkor ez a metódus beállítja a jelszintet. Az x argumentum bármi lehet, ami logikai értékké konvertálható. Ha True értékké konvertálódik, a jel aktív, egyébként inaktív.

A jel aktív állapota és a mögöttes lábon lévő tényleges logikai szint közötti megfelelés attól függ, hogy a jel invertált-e (aktív alacsony) vagy sem. Nem invertált jel esetén az aktív állapot a logikai 1-nek, az inaktív a logikai 0-nak felel meg. Invertált/aktív alacsony jel esetén az aktív állapot a logikai 0-nak felel meg, míg az inaktív a logikai 1-nek.

on() None

Aktiválja a jelet.

off() None

Deaktiválja a jelet.