class Signal – externe I/O-Geräte steuern und abfragen

Die Signal-Klasse ist eine einfache Erweiterung der Pin-Klasse. Anders als Pin, das sich nur in den „absoluten“ Zuständen 0 und 1 befinden kann, kann ein Signal sich in den Zuständen „asserted“ (ein) oder „deasserted“ (aus) befinden und dabei invertiert (aktiv-low) sein oder nicht. Mit anderen Worten: Es fügt der Pin-Funktionalität Unterstützung für logische Invertierung hinzu. Was als einfache Ergänzung erscheinen mag, ist genau das, was nötig ist, um eine große Bandbreite einfacher Digitalgeräte auf eine über verschiedene Platinen hinweg portable Weise zu unterstützen – eines der wichtigsten Ziele von MicroPython. Unabhängig davon, ob verschiedene Benutzer eine aktiv-high- oder aktiv-low-LED, ein im Ruhezustand offenes oder geschlossenes Relais haben – Sie können eine einzige, ansehnliche Anwendung entwickeln, die mit jedem von ihnen funktioniert, und Unterschiede in der Hardwarekonfiguration in wenigen Zeilen in der Konfigurationsdatei Ihrer App erfassen.

Beispiel:

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

Im Folgenden ein Leitfaden, wann Signal gegenüber Pin verwendet werden sollte:

  • Verwenden Sie Signal: Wenn Sie einfache Ein-/Aus-Geräte (einschließlich Software-PWM!) wie LEDs, Mehrsegmentanzeigen, Relais oder Summer steuern oder einfache binäre Sensoren auslesen möchten, etwa im Ruhezustand offene oder geschlossene Taster, nach high oder low gezogen, Reed-Schalter, Feuchtigkeits-/Flammendetektoren usw. usf. Zusammengefasst: Wenn Sie ein echtes physisches Gerät/einen Sensor haben, das/der GPIO-Zugriff benötigt, sollten Sie wahrscheinlich ein Signal verwenden.

  • Verwenden Sie Pin: Wenn Sie ein höherwertiges Protokoll oder einen Bus implementieren, um mit komplexeren Geräten zu kommunizieren.

Die Trennung zwischen Pin und Signal ergibt sich aus den obigen Anwendungsfällen und der Architektur von MicroPython: Pin bietet den geringsten Overhead, was beim Bit-Banging von Protokollen wichtig sein kann. Signal hingegen fügt Pin zusätzliche Flexibilität hinzu, allerdings um den Preis eines geringen Overheads (viel kleiner, als wenn Sie die Unterschiede zwischen aktiv-high- und aktiv-low-Geräten manuell in Python implementieren würden!). Außerdem ist Pin ein Low-Level-Objekt, das für jede unterstützte Platine implementiert werden muss, während Signal ein High-Level-Objekt ist, das kostenlos verfügbar ist, sobald Pin implementiert ist.

Probieren Sie im Zweifelsfall Signal aus! Noch einmal: Es wird angeboten, um Entwicklern die Notwendigkeit zu ersparen, sich mit unspektakulären Unterschieden wie aktiv-low- gegenüber aktiv-high-Signalen zu befassen, und um anderen Benutzern zu ermöglichen, Ihre Anwendung zu teilen und zu genießen, anstatt frustriert zu sein, weil sie bei ihnen schlicht deshalb nicht funktioniert, weil ihre LEDs oder Relais auf eine etwas andere Weise verdrahtet sind.

Konstruktoren

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

Erzeugt ein Signal-Objekt. Es gibt zwei Möglichkeiten, es zu konstruieren:

  • Ein vorhandenes Pin-Objekt umschließen – universell, funktioniert auf jeder Platine.

  • Pin-Konstruktorargumente direkt übergeben – dieselben positionsbezogenen und Schlüsselwortargumente, die Pin akzeptiert, werden an einen intern erzeugten Pin weitergeleitet. Auf vielen, aber nicht allen Platinen verfügbar.

Argumente:

  • pin_obj – eine vorhandene Pin-Instanz, die umschlossen werden soll.

  • pin_args / pin_kwargs – die Argumente, die an den Pin-Konstruktor weitergeleitet werden, wenn der zugrunde liegende Pin inline konstruiert wird.

  • invert – bei True ist das Signal invertiert (aktiv-low).

Methoden

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

Diese Methode ermöglicht es, den Wert des Signals zu setzen und abzurufen, je nachdem, ob das Argument x angegeben wird oder nicht.

Wird das Argument weggelassen, ruft diese Methode den Signalpegel ab, wobei 1 bedeutet, dass das Signal asserted (aktiv) ist, und 0, dass das Signal inaktiv ist.

Wird das Argument angegeben, setzt diese Methode den Signalpegel. Das Argument x kann alles sein, was sich in einen booleschen Wert umwandeln lässt. Wandelt es sich in True um, ist das Signal aktiv, andernfalls ist es inaktiv.

Die Entsprechung zwischen dem aktiven Zustand des Signals und dem tatsächlichen Logikpegel am zugrunde liegenden Pin hängt davon ab, ob das Signal invertiert (aktiv-low) ist oder nicht. Bei einem nicht invertierten Signal entspricht der aktive Zustand der logischen 1 und der inaktive der logischen 0. Bei einem invertierten/aktiv-low-Signal entspricht der aktive Zustand der logischen 0, während der inaktive der logischen 1 entspricht.

on() None

Signal aktivieren.

off() None

Signal deaktivieren.