MicroPython:Библиотеки/machine/Класс Pin
Класс Pin – управление I/O-контактами[1]
Объект Pin используется для управления I/O-контактами (которые также называют GPIO-контактами – от англ. «general-purpose input/output», т.е. «интерфейс ввода/вывода общего назначения»). Объекты Pin часто привязаны к физическим контактам, которые могут управлять выходным напряжением и считывать входное напряжение. В классе Pin есть методы для того, чтобы задать режим работы контакта (IN, OUT и т.д.) и методы для чтения/записи цифрового значения. Для аналогового управления контактами используйте класс ADC.
Объект Pin конструируется при помощи идентификатора, который недвусмысленно указывает на определенный I/O-контакт. Допустимые формы идентификатора и физического контакта, к которому привязан этот идентификатор, зависят от используемого порта. Идентификатор можно задать с помощью целого числа, строки или кортежа с номерами порта и контакта.
Шаблон использования:
from machine import Pin
# Создаем выходной контакт на контакте #0.
p0 = Pin(0, Pin.OUT)
# Задаем значение LOW, а потом HIGH.
p0.value(0)
p0.value(1)
# Создаем входной контакт на контакте #2 (с подтягивающим резистором).
p2 = Pin(2, Pin.IN, Pin.PULL_UP)
# Считываем и печатаем значение контакта.
print(p2.value())
# Перенастраиваем контакт #0 в режим ввода данных.
p0.mode(p0.IN)
# Настраиваем функцию обратного вызова для IRQ.
p0.irq(lambda p:print(p))
Конструкторы
- Класс machine.Pin(id, mode=- 1, pull=- 1, *, value, drive, alt) – предоставляет доступ к периферийному контакту (GPIO-контакту), связанному с заданным идентификатором id. Если в конструкторе заданы дополнительные аргументы, то они тоже будут использованы при инициализации контакта. Все нетронутые настройки сохранят свои прежние значения.
В этом конструкторе есть следующие аргументы:
- id – это обязательный аргумент, и сюда можно вставить любой объект. Доступные типы значений: int (внутренний идентификатор контакта), str (название контакта) и кортеж (два элемента – порт и контакт).
- mode – здесь задается режим работы контакта. Доступные значения:
- Pin.IN – контакт будет входным. Если контакт будет восприниматься как выходной, он будет в высокоимпедансном состоянии.
- Pin.OUT – контакт будет работать в режиме (обычного) вывода данных.
- Pin.OPEN_DRAIN – контакт будет работать в режиме выхода с открытым стоком. Выход с открытым стоком работает следующим образом: если выходное значение – это «0», контакт останется активным и будет работать в режиме LOW; если выходное значение – это «1», контакт будет в высокоимпедансном состоянии. Этот режим реализован не во всех портах, а в некоторых портах он может работать только на некоторых контактах.
- Pin.ALT – контакт будет запускать альтернативную функцию (какую – зависит от используемого порта). Если порт будет работать в этом режиме, другие методы класса Pin, за исключением Pin.init(), использовать будет нельзя (если они все же будут вызваны, это может привести к неопределенному или зависящему от используемого порта результату). Этот режим реализован не на всех портах.
- Pin.ALT_OPEN_DRAIN – то же самое, что и Pin.ALT, но контакт также будет работать как выход с открытым стоком. Этот режим реализован не на всех портах.
- pull – этот аргумент задается, если к контакту подключен (слабый) подтягивающий резистор. Здесь могут быть следующие значения:
- None – нет ни подтягивающего, ни стягивающего резистора.
- Pin.PULL_UP – включен подтягивающий резистор.
- Pin.PULL_DOWN – включен стягивающий резистор.
- value – этот аргумент понадобится, только если контакт работает в режиме Pin.OUT или Pin.OPEN_DRAIN. В нем задается начальное выходное значение контакта. Если ничего в нем не задать, состояние контакта останется неизменным.
- drive – в этом аргументе задается выходная электрическая мощность контакта, и здесь могут быть следующие значения: Pin.LOW_POWER, Pin.MED_POWER или Pin.HIGH_POWER. Возможности управления электрической мощностью зависят от используемого порта. Этот аргумент реализован не на всех портах.
- alt – здесь задается альтернативная функция для контакта, и значения, которые она может принять, зависят от используемого порта. Этот аргумент нужен только для режимов Pin.ALT и Pin.ALT_OPEN_DRAIN, и его можно использовать, когда контакт поддерживает более одной альтернативной функции. Если поддерживается только одна альтернативная функция, этот аргумент не нужен. Этот аргумент реализован не на всех портах.
Выше уже говорилось, что класс Pin позволяет задать на контакте альтернативную функцию, но ничего не было сказано о дальнейших операциях с этим контактом. Контакт, настроенный в режим альтернативной функции, обычно не используется как GPIO-контакт, а управляется другими аппаратными периферийными компонентами. Единственная операция, которую разрешено использовать на этом контакте – это повторная инициализация, которая делается вызовом конструктора или метода Pin.init(). Если контакт, настроенный в режим альтернативной функции, повторно инициализирован в режиме Pin.IN, Pin.OUT или Pin.OPEN_DRAIN, альтернативная функция будет удалена с контакта.
Методы
- Pin.init(mode=- 1, pull=- 1, *, value, drive, alt) – повторно инициализирует контакт с помощью заданных параметров. Будут использованы только те аргументы, что были заданы, а те, что нет, сохранят свои прежние значения. Более подробно об аргументах читайте в описании Pin конструктора выше.
Возвращает None.
- Pin.value([x]) – задает и считывает значение контакта. То, какая именно операция будет выполняться, зависит от того, задан ли аргумент x или нет.
Если аргумента задано не будет, то этот метод прочтет логическое значение контакта и вернет «0» или «1» в зависимости от того, какой сигнал напряжения в данный момент присутствует на контакте – низкий или высокий. Поведение этого метода зависит от режима, в котором работает контакт:
- Pin.IN – метод вернет входное значение, которое в данный момент присутствует на контакте.
- Pin.OUT – поведение и возвращаемое значение не определены.
- Pin.OPEN_DRAIN – если на контакте «0», то поведение и возвращаемое значение метода не определены. Если на этом контакте «1», метод вернет входное значение, которое в данный момент присутствует на контакте.
Если аргумент будет задан, то его значение задаст логическое значение контакта. Значением в x может быть что угодно, что можно преобразовать в булево значение. Если преобразовать это значение в True, контакт получит значение «1», а если в False, то «0». Поведение этого метода зависит от режима, в котором работает контакт:
- Pin.IN – значение будет сохранено в выходной буфер контакта. Состояние контакта не изменится, он останется в высокоимпедансном состоянии. Сохраненное значение станет активным в момент, когда режим контакта сменится на Pin.OUT или Pin.OPEN_DRAIN.
- Pin.OUT – заданное значение будет сразу же записано в выходной буфер.
- Pin.OPEN_DRAIN – если значением будет «0», контакт будет переведен в режим низкого напряжения. В противном случае контакт будет переключен в высокоимпедансное состояние.
Если этот метод записывает значение, то вернет None.
- Pin.__call__([x]) – объекты Pin являются вызываемыми объектами. Метод __call__() – это своего рода срезание угла, позволяющее быстро прочесть или задать значение для контакта. Это эквивалент функции Pin.value([x]). Более подробно читайте в описании к функции Pin.value().
- Pin.on() – задает контакту значение «1».
- Pin.off() – задает контакту значение «0».
- Pin.mode([mode]) – задает или считывает режим, в котором работает контакт. Более подробно об аргументе mode читайте в описании конструктора Pin.
- Pin.pull([pull]) – задает или считывает режим работы с подтягивающими и стягивающими резисторами. Более подробно об аргументе pull читайте в описании конструктора Pin.
- Pin.drive([drive]) – задает или считывает выходную электрическую мощность контакта. Более подробно об аргументе drive читайте в описании конструктора Pin.
Этот метод поддерживается не на всех портах. Доступность: WiPy.
- Pin.irq(handler=None, trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, *, priority=1, wake=None, hard=False) – настраивает обработчик прерываний, который будет вызван при появлении сигнала запуска. Если контакт работает в режиме Pin.IN, то источником сигнала запуска будет служить внешнее значение контакта. Если контакт работает в режиме Pin.OUT, то источником сигнала запуска будет служить выходной буфер контакта. Но если контакт будет работать в режиме Pin.OPEN_DRAIN, то источником сигнала запуска будет служить выходной буфер (для «0») и внешнее значение контакта (для «1»).
Этот метод принимает следующие аргументы:
- handler – опциональная функция, вызываемая при срабатывании прерывания. Функция handler должна принимать лишь один аргумент, которым должен быть экземпляр класса Pin.
- trigger – здесь задается событие, из-за которого происходит прерывание. Возможные значения:
- Pin.IRQ_FALLING – прерывание на заднем фронте.
- Pin.IRQ_RISING – прерывание на переднем фронте.
- Pin.IRQ_LOW_LEVEL – прерывание на уровне LOW.
- Pin.IRQ_HIGH_LEVEL – прерывание на уровне HIGH.
Эти значения можно задать вместе по принципу логического ИЛИ, чтобы проверка могла выполняться по нескольким событиям сразу.
- priority – задает уровень приоритета прерывания. То, какие значения тут нужно использовать, зависит от используемого порта, но обычно чем выше значение, тем выше приоритет.
- wake – задает режим питания, при котором прерывание может пробудить систему. Допустимые значения: machine.IDLE, machine.SLEEP или machine.DEEPSLEEP. Эти значения можно задать вместе по принципу логического ИЛИ, чтобы проверка могла выполняться сразу по нескольким режимам питания.
- hard – если здесь будет стоять true, будет использовано аппаратное прерывание. Это снижает задержку между изменением контакта и вызовом функции обратного вызова. Аппаратные обработчики прерываний могут не выделять память; более подробно читайте в статье «Написание обработчиков прерываний». Этот аргумент поддерживается не на всех портах.
Этот метод возвращает объект функции обратного вызова.
Константы
Константы ниже используются для настройки объектов Pin. Не все эти константы поддерживаются всеми портами MicroPython.
- Pin.IN, Pin.OUT, Pin.OPEN_DRAIN, Pin.ALT и Pin.ALT_OPEN_DRAIN – режим контакта.
- Pin.PULL_UP, Pin.PULL_DOWN и Pin.PULL_HOLD – то, какой резистор используется: подтягивающий или стягивающий. Если резистора нет, используйте None.
- Pin.LOW_POWER, Pin.MED_POWER и Pin.HIGH_POWER – режим электрической мощности.
- Pin.IRQ_FALLING, Pin.IRQ_RISING, Pin.IRQ_LOW_LEVEL и Pin.IRQ_HIGH_LEVEL – тип IRQ-триггера.