class Signal – externe I/O-apparaten besturen en uitlezen¶
De Signal-klasse is een eenvoudige uitbreiding van de Pin-klasse. Anders dan Pin, die alleen in de “absolute” toestanden 0 en 1 kan zijn, kan een Signal in de toestand “asserted” (aan) of “deasserted” (uit) zijn, terwijl het al dan niet geïnverteerd (active-low) is. Met andere woorden, het voegt logische inversie-ondersteuning toe aan de Pin-functionaliteit. Hoewel dit een eenvoudige toevoeging lijkt, is het precies wat nodig is om een breed scala aan eenvoudige digitale apparaten te ondersteunen op een manier die draagbaar is tussen verschillende boards, wat een van de belangrijkste doelen van MicroPython is. Ongeacht of verschillende gebruikers een active-high of active-low LED hebben, een normaal open of normaal gesloten relais - je kunt één enkele, fraai ogende toepassing ontwikkelen die met elk daarvan werkt, en hardwareconfiguratieverschillen in een paar regels in het configuratiebestand van je app vastleggen.
Voorbeeld:
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()
Hieronder volgt de richtlijn voor wanneer Signal versus Pin gebruikt moet worden:
Gebruik Signal: Als je eenvoudige aan/uit-apparaten (inclusief software-PWM!) wilt besturen zoals LED’s, meervoudige segmentindicatoren, relais, zoemers, of eenvoudige binaire sensoren wilt uitlezen, zoals normaal open of normaal gesloten knoppen, opgetrokken naar hoog of laag, reedschakelaars, vocht-/vlamdetectoren, enz. enz. Samengevat, als je een echt fysiek apparaat/sensor hebt dat GPIO-toegang vereist, zou je waarschijnlijk een Signal moeten gebruiken.
Gebruik Pin: Als je een protocol of bus op een hoger niveau implementeert om met complexere apparaten te communiceren.
De scheiding tussen Pin en Signal komt voort uit de bovenstaande use cases en de architectuur van MicroPython: Pin biedt de laagste overhead, wat belangrijk kan zijn bij het bit-bangen van protocollen. Maar Signal voegt extra flexibiliteit toe bovenop Pin, ten koste van een geringe overhead (veel kleiner dan wanneer je de verschillen tussen active-high en active-low apparaten handmatig in Python zou implementeren!). Bovendien is Pin een laag-niveau object dat voor elk ondersteund board moet worden geïmplementeerd, terwijl Signal een hoog-niveau object is dat gratis komt zodra Pin is geïmplementeerd.
Twijfel je? Probeer Signal eens! Nogmaals, het wordt aangeboden om ontwikkelaars te besparen van de noodzaak om saaie verschillen zoals active-low versus active-high signalen af te handelen, en om andere gebruikers toe te staan je toepassing te delen en ervan te genieten, in plaats van gefrustreerd te raken door het feit dat het voor hen niet werkt, simpelweg omdat hun LED’s of relais op een iets andere manier zijn bedraad.
Constructors¶
- class machine.Signal(pin_obj: Pin, *, invert: bool = False)¶
- class machine.Signal(*pin_args: Any, invert: bool = False, **pin_kwargs: Any)
Maakt een Signal-object aan. Er zijn twee manieren om het te construeren:
Een bestaand Pin-object omhullen – universeel, werkt op elk board.
Pin-constructorargumenten rechtstreeks doorgeven – dezelfde positionele en sleutelwoordargumenten die door
Pinworden geaccepteerd, worden doorgestuurd naar een intern aangemaakte Pin. Beschikbaar op veel, maar niet alle boards.
Argumenten:
pin_obj– een bestaandePin-instantie om te omhullen.pin_args/pin_kwargs– de argumenten die aan dePin-constructor moeten worden doorgegeven bij het inline construeren van de onderliggende pin.invert– alsTruewordt het signaal geïnverteerd (active low).
Methods¶
- value(x: Any = None, /) int | None¶
Met deze methode kan de waarde van het signaal worden ingesteld en opgevraagd, afhankelijk van of het argument
xwordt opgegeven of niet.Als het argument wordt weggelaten, haalt deze methode het signaalniveau op, waarbij 1 betekent dat het signaal asserted is (actief) en 0 dat het signaal inactief is.
Als het argument wordt opgegeven, stelt deze methode het signaalniveau in. Het argument
xkan alles zijn dat naar een boolean wordt geconverteerd. Als het naarTrueconverteert, is het signaal actief, anders is het inactief.De overeenkomst tussen een actief signaal en het werkelijke logische niveau op de onderliggende pin hangt af van of het signaal geïnverteerd (active-low) is of niet. Voor een niet-geïnverteerd signaal komt de actieve status overeen met logische 1, inactief - met logische 0. Voor een geïnverteerd/active-low signaal komt de actieve status overeen met logische 0, terwijl inactief - met logische 1 overeenkomt.