class Signal -- 控制和感测外部 I/O 设备¶
Signal 类是 Pin 类的一个简单扩展。与只能处于“绝对”的 0 和 1 状态的 Pin 不同,Signal 可以处于“置位”(开)或“撤销置位”(关)状态,同时可以是反相的(低电平有效)或非反相的。换句话说,它为 Pin 的功能添加了逻辑反相支持。这看似只是一个简单的补充,但它恰恰是以跨不同开发板可移植的方式支持各种简单数字设备所需要的,而这正是 MicroPython 的主要目标之一。无论不同用户使用的是高电平有效还是低电平有效的 LED,是常开还是常闭的继电器 —— 你都可以开发出一个单一、外观优雅、能与它们各自配合工作的应用,并在应用配置文件中用寥寥数行捕获硬件配置上的差异。
示例:
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()
以下是何时应使用 Signal 还是 Pin 的指南:
使用 Signal:如果你想控制简单的开/关设备(包括软件 PWM!),例如 LED、多段指示器、继电器、蜂鸣器,或读取简单的二进制传感器,例如常开或常闭按钮、上拉或下拉、干簧管开关、湿度/火焰探测器等等。总而言之,如果你有一个需要 GPIO 访问的真实物理设备/传感器,你很可能应该使用 Signal。
使用 Pin:如果你要实现更高层的协议或总线,以与更复杂的设备通信。
Pin 和 Signal 之间的划分源于上述用例以及 MicroPython 的架构:Pin 提供最低的开销,这在位操作协议时可能很重要。但 Signal 在 Pin 之上增加了额外的灵活性,代价是少量开销(远小于你在 Python 中手动实现高电平有效与低电平有效设备差异时的开销!)。此外,Pin 是一个底层对象,需要为每个支持的开发板实现,而 Signal 是一个高层对象,一旦实现了 Pin 便可免费获得。
如有疑问,不妨试试 Signal!再次强调,它的目的是让开发者免于处理诸如低电平有效与高电平有效信号之类乏味的差异,并让其他用户能够分享和享用你的应用,而不会仅仅因为他们的 LED 或继电器接线方式略有不同而感到沮丧、应用无法工作。
构造函数¶
- class machine.Signal(pin_obj: Pin, *, invert: bool = False)¶
- class machine.Signal(*pin_args: Any, invert: bool = False, **pin_kwargs: Any)
创建一个 Signal 对象。有两种构造方式:
包装一个现有的 Pin 对象 —— 通用,适用于任何开发板。
直接传递 Pin 构造函数参数 ——
Pin接受的相同位置参数和关键字参数会被转发给一个内部创建的 Pin。在许多但并非所有开发板上可用。
参数:
pin_obj—— 要包装的现有Pin实例。pin_args/pin_kwargs—— 在内联构造底层引脚时转发给Pin构造函数的参数。invert—— 如果为True,则信号被反相(低电平有效)。
方法¶