клас Signal – керування та зчитування зовнішніх пристроїв введення/виведення

Клас Signal – це просте розширення класу Pin. На відміну від Pin, який може перебувати лише у «абсолютних» станах 0 і 1, 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, сигнал інвертовано (активний низький рівень).

Методи

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

Цей метод дозволяє встановити та отримати значення сигналу залежно від того, чи вказаний аргумент x.

Якщо аргумент опущено, метод отримує рівень сигналу: 1 означає, що сигнал активований (активний), 0 – сигнал неактивний.

Якщо аргумент вказано, метод встановлює рівень сигналу. Аргумент x може бути будь-яким значенням, що перетворюється на булеве. Якщо воно перетворюється на True, сигнал активний, в іншому випадку – неактивний.

Відповідність між активним станом сигналу та фактичним логічним рівнем на базовому виводі залежить від того, чи інвертований сигнал (активний низький рівень). Для неінвертованого сигналу активний стан відповідає логічній 1, неактивний – логічному 0. Для інвертованого/активного-низького сигналу активний стан відповідає логічному 0, тоді як неактивний – логічній 1.

on() None

Активує сигнал.

off() None

Деактивує сигнал.