MicroPython:Библиотеки/pyb/Класс Pin: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
(Новая страница: «{{MicroPython/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[]</ref>= <syntaxhighlight lang="python"...»)
 
Нет описания правки
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


=<ref>[]</ref>=
=Класс Pin – управление I/O-контактами<ref>[http://docs.micropython.org/en/latest/library/pyb.Pin.html docs.micropython.org - class Pin – control I/O pins]</ref>=
 
'''Класс Pin''' – это базовый класс для управления I/O-контактами. В нем есть методы, чтобы задать режим работы контакта (входной, выходной и т.д.), а также методы, позволяющие задать и прочесть цифровой логический уровень контакта. Об управлении аналоговыми контактами читайте в статье о [[MicroPython:Библиотеки/pyb/Класс ADC|классе ADC]].
 
== Модель использования ==
 
Все контакты платы предварительно определены в pyb.Pin.board.Name:
 
<syntaxhighlight lang="python" enclose="div">
x1_pin = pyb.Pin.board.X1
 
g = pyb.Pin(pyb.Pin.board.X1, pyb.Pin.IN)
</syntaxhighlight>
 
Контакты CPU, соответствующие контактам платы, заданы в pyb.Pin.cpu.Name. Название CPU-контакта состоит из буквы порта, после которой идет номер контакта. На PYBv1.0 pyb.Pin.board.X1 и pyb.Pin.cpu.A0 – это один и тот же контакт.
 
Также можно использовать строки:
 
<syntaxhighlight lang="python" enclose="div">
g = pyb.Pin('X1', pyb.Pin.OUT_PP)
</syntaxhighlight>
 
Кроме того, пользователи могут задавать собственные названия контактов...
 
<syntaxhighlight lang="python" enclose="div">
MyMapperDict = { 'LeftMotorDir' : pyb.Pin.cpu.C12 }
pyb.Pin.dict(MyMapperDict)
g = pyb.Pin("LeftMotorDir", pyb.Pin.OUT_OD)
</syntaxhighlight>
 
...и запрашивать привязочные данные:
 
<syntaxhighlight lang="python" enclose="div">
pin = pyb.Pin("LeftMotorDir")
</syntaxhighlight>
 
Также пользователь может создать собственную привязочную функцию:
 
<syntaxhighlight lang="python" enclose="div">
def MyMapper(pin_name):
  if pin_name == "LeftMotorDir":
      return pyb.Pin.cpu.A0
 
pyb.Pin.mapper(MyMapper)
</syntaxhighlight>
 
Таким образом, если вызвать pyb.Pin("LeftMotorDir", pyb.Pin.OUT_PP), то контакт "LeftMotorDir" будет напрямую передан привязочной функции.
 
Итак, привязка номера обычного контакта к какому-то интересному названию осуществляется в следующем порядке:
# Напрямую указываем объект Pin.
# Создаем пользовательскую привязочную функцию.
# Выполняем пользовательскую привязку (нужно, чтобы объект можно было использовать в качестве ключа словаря).
# Задаем строку, соответствующую номеру платы.
# Задаем строку, соответствующую контакту/порту CPU.
 
Некоторую отладочную информацию о том, как объект привязан к контакту, можно узнать с помощью метода pyb.Pin.debug(True).
 
Если у контакта включен режим Pin.PULL_UP или Pin.PULL_DOWN, его резистор на 40 кОм будет притянут, соответственно, либо к 3.3 вольтам, либо к «земле» (за исключением контакта Y5, который оснащен резисторами на 11 кОм).
Теперь, когда на GPIO-контакте будет замечен задний фронт, это будет запускать функцию обратного вызова. Внимание: механические кнопки страдают так называемым «дребезгом» – их нажатие или отпускание может привести к нескольким ложным срабатываниям. Более подробно о дребезге, а также о том, как с ним справиться, читайте [http://www.eng.utah.edu/~cs5780/debouncing.pdf тут].
 
Все объекты Pin привязываются к GPIO-контактам через привязывающую функцию.
 
== Конструкторы ==
 
* Класс pyb.Pin(id, ...) – создает новый объект Pin, привязанный к идентификатору id. Если задать здесь дополнительные аргументы, они будут использованы для инициализации объекта Pin. Читайте о них в описании метода init().
 
== Методы класса ==
 
* Pin.debug([state]) – задает или считывает то, включен ли режим отладки или нет (чтобы включить отладку, задайте True, а чтобы выключить – False).
* Pin.dict([dict]) – задает или считывает словарь для привязки контактов.
* Pin.mapper([fun]) – задает или считывает привязочную функцию.
 
== Методы ==
 
* Pin.init(mode, pull=Pin.PULL_NONE, af=- 1) – инициализирует контакт:
o В аргументе mode может быть следующее:
 Pin.IN – делает контакт входящим.
 Pin.OUT_PP – делает контакт выходящим (обычный активный выход).
 Pin.OUT_OD – делает контакт выходящим (выход с открытым стоком).
 Pin.AF_PP – контакт будет выполнять альтернативную функцию (обычный активный выход).
 Pin.AF_OD – контакт будет выполнять альтернативную функцию (выход с открытым стоком).
 Pin.ANALOG – делает контакт аналоговым.
o В аргументе pull может быть следующее:
 Pin.PULL_NONE – без подтягивающих/стягивающих резисторов.
 Pin.PULL_UP – включает подтягивающий резистор.
 Pin.PULL_DOWN – включает стягивающий резистор.
Если задан режим Pin.AF_PP или Pin.AF_OD, то в аргументе af можно задать индекс или название одной из альтернативных функций, связанных с этим контактом.
Возвращает None.
* Pin.value([value]) – задает или считывает цифровой логический уровень контакта. Если не задать аргумент value, тот метод вернет «0» или «1» в зависимости от того, какой логический уровень в данный момент имеется на контакте. Если аргумент value будет задан, это задаст логический уровень на контакте. В value можно задать любое значение, которое можно преобразовать в булево значение. И если оно будет преобразовано в True, контакт получит высокий логический уровень, а если в False, то низкий.
* Pin.__str__() – возвращает строку, описывающую объект Pin.
* Pin.af() – возвращает альтернативную функцию контакта, заданную в данный момент. Возвращаемое целое число будет соответствовать одной из констант для аргумента af в методе init().
* Pin.af_list() – возвращает массив альтернативных функций, доступных на этом контакте.
* Pin.gpio() – возвращает базовый адрес GPIO-блока, связанного с контактом.
* Pin.mode() – возвращает режим, в котором в данный момент работает контакт. Возвращаемое целое число будет соответствовать одной из констант для аргумента mode в методе init().
* Pin.name() – считывает название контакта.
* Pin.names() – возвращает процессорное и платовое названия контакта.
* Pin.pin() – считывает номер контакта.
* Pin.port() – считывает порт контакта.
* Pin.pull() – возвращает резисторный режим, который в данный момент задан на контакте. Возвращаемое целое число будет соответствовать одной из констант для аргумента pull в методе init().
 
== Константы ==
 
* Pin.AF_OD – инициализирует контакт в режиме альтернативной функции (выход с активным стоком).
* Pin.AF_PP – инициализирует контакт в режиме альтернативной функции (обычный активный выход).
* Pin.ANALOG – инициализирует контакт в аналоговым режиме.
* Pin.IN – инициализирует контакт во входящем режиме.
* Pin.OUT_OD – инициализирует контакт в выходящем режиме (выход с открытым стоком).
* Pin.OUT_PP – инициализирует контакт в выходящем режиме (обычный активный выход).
* Pin.PULL_DOWN – включает на контакте стягивающий резистор.
* Pin.PULL_NONE – на контакте не будет включено ни подтягивающего, ни стягивающего резистора.
* Pin.PULL_UP – включает на контакте подтягивающий резистор.
 
== Класс PinAF – альтернативные функции контакта ==
 
В классе Pin реализована программная презентация физического контакта микропроцессора. Один контакт может выполнять несколько функций (GPIO, I2C SDA и т.д.) – их презентация реализуется с помощью класса PinAF.
 
Пример использования:
 
<syntaxhighlight lang="python" enclose="div">
x3 = pyb.Pin.board.X3
x3_af = x3.af_list()
</syntaxhighlight>
 
В x3_af теперь будет содержаться массив объектов PinAF, доступных на контакте X3.
 
На PyBoard в x3_af будет содержаться:
 
<syntaxhighlight lang="python" enclose="div">
[Pin.AF1_TIM2, Pin.AF2_TIM5, Pin.AF3_TIM9, Pin.AF7_USART2]
</syntaxhighlight>
 
Обычно каждый контакт самостоятельно настраивает свои альтернативные функции, но иногда одна и та же функция доступна на разных контактах, что вынуждает прибегнуть к использованию дополнительного кода.
 
Чтобы настроить X3 на использование TIM2_CH3, можно выполнить следующее:
 
<syntaxhighlight lang="python" enclose="div">
pin = pyb.Pin(pyb.Pin.board.X3, mode=pyb.Pin.AF_PP, af=pyb.Pin.AF1_TIM2)
</syntaxhighlight>
 
...или...
 
<syntaxhighlight lang="python" enclose="div">
pin = pyb.Pin(pyb.Pin.board.X3, mode=pyb.Pin.AF_PP, af=1)
</syntaxhighlight>
 
===Методы===
 
* pinaf.__str__() – возвращает строку, описывающую альтернативную функцию.
* pinaf.index() – возвращает индекс альтернативной функции.
* pinaf.name() – возвращает название альтернативной функции.
* pinaf.reg() – возвращает базовый регистр, связанный с периферийным устройством, которое использует эту альтернативную функцию. К примеру, если альтернативная функция – это TIM2_CH3, то эта функция вернет stm.TIM2.





Версия от 13:21, 10 октября 2020

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Класс Pin – управление I/O-контактами[1]

Класс Pin – это базовый класс для управления I/O-контактами. В нем есть методы, чтобы задать режим работы контакта (входной, выходной и т.д.), а также методы, позволяющие задать и прочесть цифровой логический уровень контакта. Об управлении аналоговыми контактами читайте в статье о классе ADC.

Модель использования

Все контакты платы предварительно определены в pyb.Pin.board.Name:

x1_pin = pyb.Pin.board.X1

g = pyb.Pin(pyb.Pin.board.X1, pyb.Pin.IN)

Контакты CPU, соответствующие контактам платы, заданы в pyb.Pin.cpu.Name. Название CPU-контакта состоит из буквы порта, после которой идет номер контакта. На PYBv1.0 pyb.Pin.board.X1 и pyb.Pin.cpu.A0 – это один и тот же контакт.

Также можно использовать строки:

g = pyb.Pin('X1', pyb.Pin.OUT_PP)

Кроме того, пользователи могут задавать собственные названия контактов...

MyMapperDict = { 'LeftMotorDir' : pyb.Pin.cpu.C12 }
pyb.Pin.dict(MyMapperDict)
g = pyb.Pin("LeftMotorDir", pyb.Pin.OUT_OD)

...и запрашивать привязочные данные:

pin = pyb.Pin("LeftMotorDir")

Также пользователь может создать собственную привязочную функцию:

def MyMapper(pin_name):
   if pin_name == "LeftMotorDir":
       return pyb.Pin.cpu.A0

pyb.Pin.mapper(MyMapper)

Таким образом, если вызвать pyb.Pin("LeftMotorDir", pyb.Pin.OUT_PP), то контакт "LeftMotorDir" будет напрямую передан привязочной функции.

Итак, привязка номера обычного контакта к какому-то интересному названию осуществляется в следующем порядке:

  1. Напрямую указываем объект Pin.
  2. Создаем пользовательскую привязочную функцию.
  3. Выполняем пользовательскую привязку (нужно, чтобы объект можно было использовать в качестве ключа словаря).
  4. Задаем строку, соответствующую номеру платы.
  5. Задаем строку, соответствующую контакту/порту CPU.

Некоторую отладочную информацию о том, как объект привязан к контакту, можно узнать с помощью метода pyb.Pin.debug(True).

Если у контакта включен режим Pin.PULL_UP или Pin.PULL_DOWN, его резистор на 40 кОм будет притянут, соответственно, либо к 3.3 вольтам, либо к «земле» (за исключением контакта Y5, который оснащен резисторами на 11 кОм). Теперь, когда на GPIO-контакте будет замечен задний фронт, это будет запускать функцию обратного вызова. Внимание: механические кнопки страдают так называемым «дребезгом» – их нажатие или отпускание может привести к нескольким ложным срабатываниям. Более подробно о дребезге, а также о том, как с ним справиться, читайте тут.

Все объекты Pin привязываются к GPIO-контактам через привязывающую функцию.

Конструкторы

  • Класс pyb.Pin(id, ...) – создает новый объект Pin, привязанный к идентификатору id. Если задать здесь дополнительные аргументы, они будут использованы для инициализации объекта Pin. Читайте о них в описании метода init().

Методы класса

  • Pin.debug([state]) – задает или считывает то, включен ли режим отладки или нет (чтобы включить отладку, задайте True, а чтобы выключить – False).
  • Pin.dict([dict]) – задает или считывает словарь для привязки контактов.
  • Pin.mapper([fun]) – задает или считывает привязочную функцию.

Методы

  • Pin.init(mode, pull=Pin.PULL_NONE, af=- 1) – инициализирует контакт:

o В аргументе mode может быть следующее:  Pin.IN – делает контакт входящим.  Pin.OUT_PP – делает контакт выходящим (обычный активный выход).  Pin.OUT_OD – делает контакт выходящим (выход с открытым стоком).  Pin.AF_PP – контакт будет выполнять альтернативную функцию (обычный активный выход).  Pin.AF_OD – контакт будет выполнять альтернативную функцию (выход с открытым стоком).  Pin.ANALOG – делает контакт аналоговым. o В аргументе pull может быть следующее:  Pin.PULL_NONE – без подтягивающих/стягивающих резисторов.  Pin.PULL_UP – включает подтягивающий резистор.  Pin.PULL_DOWN – включает стягивающий резистор. Если задан режим Pin.AF_PP или Pin.AF_OD, то в аргументе af можно задать индекс или название одной из альтернативных функций, связанных с этим контактом. Возвращает None.

  • Pin.value([value]) – задает или считывает цифровой логический уровень контакта. Если не задать аргумент value, тот метод вернет «0» или «1» в зависимости от того, какой логический уровень в данный момент имеется на контакте. Если аргумент value будет задан, это задаст логический уровень на контакте. В value можно задать любое значение, которое можно преобразовать в булево значение. И если оно будет преобразовано в True, контакт получит высокий логический уровень, а если в False, то низкий.
  • Pin.__str__() – возвращает строку, описывающую объект Pin.
  • Pin.af() – возвращает альтернативную функцию контакта, заданную в данный момент. Возвращаемое целое число будет соответствовать одной из констант для аргумента af в методе init().
  • Pin.af_list() – возвращает массив альтернативных функций, доступных на этом контакте.
  • Pin.gpio() – возвращает базовый адрес GPIO-блока, связанного с контактом.
  • Pin.mode() – возвращает режим, в котором в данный момент работает контакт. Возвращаемое целое число будет соответствовать одной из констант для аргумента mode в методе init().
  • Pin.name() – считывает название контакта.
  • Pin.names() – возвращает процессорное и платовое названия контакта.
  • Pin.pin() – считывает номер контакта.
  • Pin.port() – считывает порт контакта.
  • Pin.pull() – возвращает резисторный режим, который в данный момент задан на контакте. Возвращаемое целое число будет соответствовать одной из констант для аргумента pull в методе init().

Константы

  • Pin.AF_OD – инициализирует контакт в режиме альтернативной функции (выход с активным стоком).
  • Pin.AF_PP – инициализирует контакт в режиме альтернативной функции (обычный активный выход).
  • Pin.ANALOG – инициализирует контакт в аналоговым режиме.
  • Pin.IN – инициализирует контакт во входящем режиме.
  • Pin.OUT_OD – инициализирует контакт в выходящем режиме (выход с открытым стоком).
  • Pin.OUT_PP – инициализирует контакт в выходящем режиме (обычный активный выход).
  • Pin.PULL_DOWN – включает на контакте стягивающий резистор.
  • Pin.PULL_NONE – на контакте не будет включено ни подтягивающего, ни стягивающего резистора.
  • Pin.PULL_UP – включает на контакте подтягивающий резистор.

Класс PinAF – альтернативные функции контакта

В классе Pin реализована программная презентация физического контакта микропроцессора. Один контакт может выполнять несколько функций (GPIO, I2C SDA и т.д.) – их презентация реализуется с помощью класса PinAF.

Пример использования:

x3 = pyb.Pin.board.X3
x3_af = x3.af_list()

В x3_af теперь будет содержаться массив объектов PinAF, доступных на контакте X3.

На PyBoard в x3_af будет содержаться:

[Pin.AF1_TIM2, Pin.AF2_TIM5, Pin.AF3_TIM9, Pin.AF7_USART2]

Обычно каждый контакт самостоятельно настраивает свои альтернативные функции, но иногда одна и та же функция доступна на разных контактах, что вынуждает прибегнуть к использованию дополнительного кода.

Чтобы настроить X3 на использование TIM2_CH3, можно выполнить следующее:

pin = pyb.Pin(pyb.Pin.board.X3, mode=pyb.Pin.AF_PP, af=pyb.Pin.AF1_TIM2)

...или...

pin = pyb.Pin(pyb.Pin.board.X3, mode=pyb.Pin.AF_PP, af=1)

Методы

  • pinaf.__str__() – возвращает строку, описывающую альтернативную функцию.
  • pinaf.index() – возвращает индекс альтернативной функции.
  • pinaf.name() – возвращает название альтернативной функции.
  • pinaf.reg() – возвращает базовый регистр, связанный с периферийным устройством, которое использует эту альтернативную функцию. К примеру, если альтернативная функция – это TIM2_CH3, то эта функция вернет stm.TIM2.


<syntaxhighlight lang="python" enclose="div">

См.также

Внешние ссылки