classe Signal – controlo e leitura de dispositivos de E/S externos

A classe Signal é uma extensão simples da classe Pin. Ao contrário de Pin, que só pode estar nos estados «absolutos» 0 e 1, um Signal pode estar nos estados «ativado» (on) ou «desativado» (off), podendo ser invertido (ativo-baixo) ou não. Por outras palavras, acrescenta suporte de inversão lógica à funcionalidade de Pin. Embora possa parecer uma adição simples, é exatamente o que é necessário para suportar uma ampla gama de dispositivos digitais simples de forma portável entre diferentes placas, o que é um dos principais objetivos do MicroPython. Independentemente de os diferentes utilizadores terem um LED ativo-alto ou ativo-baixo, um relé normalmente aberto ou normalmente fechado – pode desenvolver uma única aplicação com boa apresentação que funciona com cada um deles, e capturar as diferenças de configuração de hardware em poucas linhas no ficheiro de configuração da sua aplicação.

Exemplo:

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

Em seguida, encontra-se o guia sobre quando usar Signal vs Pin:

  • Use Signal: se quiser controlar dispositivos simples de ligar/desligar (incluindo PWM por software!) como LEDs, indicadores de múltiplos segmentos, relés, buzzers, ou ler sensores binários simples, como botões normalmente abertos ou normalmente fechados, com pull-up ou pull-down, interruptores Reed, detetores de humidade/chama, etc. Em suma, se tiver um dispositivo/sensor físico real que requer acesso GPIO, provavelmente deve usar Signal.

  • Use Pin: se implementar um protocolo ou barramento de nível superior para comunicar com dispositivos mais complexos.

A separação entre Pin e Signal resulta dos casos de uso acima e da arquitetura do MicroPython: Pin oferece a menor sobrecarga possível, o que pode ser importante no bit-banging de protocolos. Mas Signal acrescenta flexibilidade adicional sobre Pin, ao custo de uma sobrecarga mínima (muito menor do que se implementasse manualmente em Python as diferenças entre dispositivos ativo-alto e ativo-baixo!). Além disso, Pin é um objeto de baixo nível que precisa de ser implementado para cada placa suportada, enquanto Signal é um objeto de alto nível que fica disponível gratuitamente assim que Pin estiver implementado.

Em caso de dúvida, experimente Signal! Uma vez mais, é oferecido para poupar aos programadores a necessidade de lidar com diferenças pouco interessantes como sinais ativo-baixo vs ativo-alto, e permitir que outros utilizadores partilhem e desfrutem da sua aplicação, em vez de ficarem frustrados pelo facto de ela não funcionar porque os seus LEDs ou relés estão ligados de forma ligeiramente diferente.

Construtores

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

Cria um objeto Signal. Existem duas formas de o construir:

  • Envolver um objeto Pin existente – universal, funciona em qualquer placa.

  • Passar argumentos do construtor de Pin diretamente – os mesmos argumentos posicionais e de palavra-chave aceites por Pin são encaminhados para um Pin criado internamente. Disponível em muitas, mas não todas, as placas.

Argumentos:

  • pin_obj – uma instância Pin existente para envolver.

  • pin_args / pin_kwargs – os argumentos a encaminhar para o construtor Pin ao construir o pino subjacente de forma inline.

  • invert – se True, o sinal é invertido (ativo-baixo).

Métodos

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

Este método permite definir e obter o valor do sinal, dependendo de o argumento x ser ou não fornecido.

Se o argumento for omitido, este método obtém o nível do sinal, sendo 1 a indicação de que o sinal está ativado (ativo) e 0 de que está inativo.

Se o argumento for fornecido, este método define o nível do sinal. O argumento x pode ser qualquer coisa que se converta num booleano. Se se converter em True, o sinal está ativo; caso contrário, está inativo.

A correspondência entre o sinal estar ativo e o nível lógico real no pino subjacente depende de o sinal ser invertido (ativo-baixo) ou não. Para um sinal não invertido, o estado ativo corresponde ao nível lógico 1 e o inativo ao nível lógico 0. Para um sinal invertido/ativo-baixo, o estado ativo corresponde ao nível lógico 0, enquanto o inativo corresponde ao nível lógico 1.

on() None

Ativa o sinal.

off() None

Desativa o sinal.