3.4. Выводы и периферийные устройства

Вывод – это простейшее периферийное устройство на MCU: одиночный провод, соединяющий чип с внешним миром. Любое взаимодействие с реальной аппаратурой – управление светодиодом, чтение состояния переключателя, измерение напряжения, отправка байтов по последовательной линии – в конечном счёте проходит через один или несколько выводов.

3.4.1. Режимы выводов

Прежде чем вывод начнёт приносить пользу, он настраивается в один из нескольких режимов:

  • Pin.IN – вход. Вывод наблюдает за напряжением, приложенным к нему извне, и сообщает его как 0 (низкий) или 1 (высокий).

  • Pin.OUT – выход. Вывод сам задаёт на себе либо напряжение питания (1), либо землю (0), так что внешние компоненты видят это напряжение.

  • Pin.OPEN_DRAIN – выход, который может только подтягивать линию к низкому уровню. Чтобы перейти в высокий уровень, вывод отпускает линию (переходит в плавающее состояние), и внешний подтягивающий резистор поднимает линию. Используется для общих шин, где несколько устройств могут задавать одну и ту же линию.

Для входов можно дополнительно включить внутренний подтягивающий резистор, который гарантирует определённый уровень, когда вывод ничем извне не задаётся:

  • Pin.PULL_UP – слабая подтяжка к шине питания.

  • Pin.PULL_DOWN – слабая подтяжка к земле.

Конструктор принимает id, mode и pull в качестве позиционных аргументов:

from machine import Pin

led    = Pin("P0", Pin.OUT)
button = Pin("P1", Pin.IN, Pin.PULL_UP)

3.4.2. Альтернативные функции

У большинства выводов помимо роли GPIO есть альтернативная функция. Одна физическая контактная площадка на чипе может быть:

  • Цифровым входом или выходом (machine.Pin).

  • Входом ADC, измеряющим напряжение (machine.ADC).

  • Выходом PWM, выдающим прямоугольный сигнал (machine.PWM).

  • Линией TX или RX интерфейса UART (machine.UART).

Другие периферийные устройства (дополнительные последовательные шины, таймеры и так далее) также занимают конкретные выводы; разработчик чипа подключает каждый аппаратный блок к фиксированному набору площадок. ADC дискретизирует только те выводы, что подключены к его мультиплексору; UART передаёт по тому единственному выводу, к которому подключён его сигнал TX.

Примечание

Камеры OpenMV маркируют выводы внешнего разъёма как P0P9 (немного варьируется в зависимости от платы). То, какой вывод несёт какую альтернативную функцию, зависит от платы; см. таблицу в кратком справочнике OpenMV Cam.

3.4.3. Различия между платами

Несколько деталей варьируются в зависимости от платы, и их всегда следует сверять с кратким справочником, а не предполагать по другой плате:

  • Допустимое напряжение. У некоторых камер есть выводы ввода-вывода, толерантные к 5 В (сигнал 5 В можно подавать напрямую без повреждений); другие работают со своим вводом-выводом на 3,3 В или 1,8 В и требуют преобразователь уровней для любого сигнала выше этого значения. Подключение источника 5 В к нетолерантному выводу может повредить чип.

  • Опорное напряжение ADC. Напряжение, которое ADC считает полной шкалой, зависит от напряжения питания ввода-вывода платы. read_u16() всегда возвращает 0..65535, но напряжение, которое представляет 65535, – это то, каково опорное напряжение платы.

  • Нагрузочная способность. Вывод GPIO может выдавать или принимать ограниченный ток – обычно десятки миллиампер. Достаточно для небольшого светодиода через резистор; недостаточно для двигателя, зуммера или любой индуктивной нагрузки. Для чего-либо более мощного используйте внешний драйвер (транзистор, MOSFET, H-мост).

Краткий справочник OpenMV Cam приводит точные значения для каждой платы.