classe Signal – controlar e detectar dispositivos de E/S externos¶
A classe Signal é uma extensão simples da classe Pin. Diferentemente do Pin, que pode estar apenas nos estados “absolutos” 0 e 1, um Signal pode estar nos estados “afirmado” (on) ou “negado” (off), podendo ainda ser invertido (ativo-baixo) ou não. Em outras palavras, ela adiciona suporte a inversão lógica à funcionalidade do Pin. Embora isso possa parecer uma adição simples, é exatamente o que se precisa para suportar uma ampla gama de dispositivos digitais simples de uma maneira portável entre diferentes placas, o que é um dos principais objetivos do MicroPython. Independentemente de diferentes usuários terem um LED ativo-alto ou ativo-baixo, um relé normalmente aberto ou normalmente fechado - você pode desenvolver uma única aplicação, com boa aparência, que funcione com cada um deles, e capturar as diferenças de configuração de hardware em poucas linhas no arquivo de configuração do seu aplicativo.
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()
A seguir está o guia de quando Signal vs Pin deve ser usado:
Use Signal: Se você quer controlar dispositivos simples liga/desliga (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, puxados para alto ou baixo, chaves Reed, detectores de umidade/chama, etc. etc. Resumindo, se você tem um dispositivo/sensor físico real que requer acesso a GPIO, você provavelmente deve usar um Signal.
Use Pin: Se você implementa um protocolo ou barramento de nível mais alto para se comunicar com dispositivos mais complexos.
A divisão entre Pin e Signal vem dos casos de uso acima e da arquitetura do MicroPython: o Pin oferece a menor sobrecarga, o que pode ser importante ao fazer bit-banging de protocolos. Mas o Signal adiciona flexibilidade adicional sobre o Pin, ao custo de uma sobrecarga menor (muito menor do que se você implementasse as diferenças entre dispositivo ativo-alto vs ativo-baixo em Python manualmente!). Além disso, o Pin é um objeto de baixo nível que precisa ser implementado para cada placa suportada, enquanto o Signal é um objeto de alto nível que vem de graça assim que o Pin é implementado.
Em caso de dúvida, experimente o Signal! Mais uma vez, ele é oferecido para poupar os desenvolvedores da necessidade de lidar com diferenças sem graça como sinais ativo-baixo vs ativo-alto, e permitir que outros usuários compartilhem e aproveitem sua aplicação, em vez de ficarem frustrados pelo fato de ela não funcionar para eles simplesmente porque seus LEDs ou relés estão conectados de uma maneira 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. Há duas maneiras de construí-lo:
Envolver um objeto Pin existente – universal, funciona em qualquer placa.
Passar argumentos do construtor de Pin diretamente – os mesmos argumentos posicionais e nomeados aceitos por
Pinsão encaminhados para um Pin criado internamente. Disponível em muitas, mas não em todas as placas.
Argumentos:
pin_obj– uma instânciaPinexistente a ser envolvida.pin_args/pin_kwargs– os argumentos a serem encaminhados para o construtorPinao construir o pino subjacente em linha.invert– seTrueo 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
xser fornecido ou não.Se o argumento for omitido, então este método obtém o nível do sinal, sendo 1 que o sinal está afirmado (ativo) e 0 que o sinal está inativo.
Se o argumento for fornecido, então este método define o nível do sinal. O argumento
xpode ser qualquer coisa que se converta em booleano. Se ele se converter emTrue, o sinal fica ativo, caso contrário fica 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 lógico 1, e o inativo ao lógico 0. Para um sinal invertido/ativo-baixo, o estado ativo corresponde ao lógico 0, enquanto o inativo ao lógico 1.