MicroPython:Платы/ESP8266/Руководство по MicroPython для ESP8266/GPIO-контакты

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

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


GPIO-контакты[1]

Ваша плата подключается к «внешнему миру» и управляет другими компонентами при помощи GPIO-контактов. Вы можете использовать не все контакты, в большинстве случаев вам доступны лишь 0, 2, 4, 5, 12, 13, 14, 15 и 16 контакты.

Эти контакты доступны в модуле machine, так что сначала убедитесь, что вы его импортировали. Затем вы можете создать контакт, используя:

>>> pin = machine.Pin(0)

Здесь «0» – это контакт, к которому вы хотите получить доступ. Обычно вам также нужно задать, выходным он будет или входным, что делается при его создании. Чтобы сделать входной контакт, используйте:

>>> pin = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)

В последнем параметре можно указать PULL_UP или None – он отвечает за то, будет ли включен подтягивающий резистор или нет. Если не указывать этот параметр, по умолчанию в том параметре будет задано None (т.е. подтягивающий резистор будет выключен). Контакт GPIO16 нельзя переключить в режим подтягивающего резистора.

Чтобы прочитать значение контакта, используйте:

>>> pin.value()
0

Контакт может вернуть «0» или «1» – в зависимости от того, к чему подключен. Чтобы создать выходной контакт, используйте:

>>> pin = machine.Pin(0, machine.Pin.OUT)

Затем можно задать его значение. Вот первый способ:

>>> pin.value(0)
>>> pin.value(1)

А вот второй:

>>> pin.off()
>>> pin.on()

Внешние прерывания

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

Давайте сначала зададим функцию обратного вызова, в которой будет всего один аргумент – контакт, запускающий эту функцию. Задача этой функции будет лишь в печати названия контакта и уведомления о том, что его значение изменилось:

>>> def callback(p):
...     print('значение изменилось', p)

Затем мы создадим два контакта, сделав их входными:

>>> from machine import Pin
>>> p0 = Pin(0, Pin.IN)
>>> p2 = Pin(2, Pin.IN)

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

>>> p0.irq(trigger=Pin.IRQ_FALLING, handler=callback)
>>> p2.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=callback)

Таким образом, контакт 0 будет срабатывать только по заднему фронту (т.е. когда значение сменится с «1» на «0»), а контакт 2 будет срабатывать и по заднему, и по переднему фронту (т.е. и при изменении с «1» на «0», и при изменении с «0» на «1»). Введя этот код, попробуйте применить к контактам 0 и 2 высокое и низкое напряжение, чтобы увидеть, как срабатывает заданное вами прерывание.

При обнаружении заданного события прерывание сработает и прервет любой код, работающий в данный момент (даже код Python). То есть функционал ваших функций обратного вызова ограничен (например, они не могут занимать память), поэтому они должны быть максимально короткими и простыми.

См.также

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