Введение #
Для взаимодействия с физическими контактами на гребенке GPIO библиотека RepkaPi.GPIO предоставляет четыре различных схемы адресации. Выбор конкретной схемы осуществляется единожды за сеанс работы с помощью функции GPIO.setmode() и определяет, как именно программа будет идентифицировать целевой пин.
Понимание этих схем является фундаментальным для корректной работы с аппаратным обеспечением.
Режимы нумерации #
GPIO.BOARD: Физическая нумерация
-
Определение: Данный режим является прямой проекцией нумерации контактов на 40-пиновой гребенке. Пины именуются целыми числами от 1 до 40 в соответствии с их физическим положением.
-
Принцип работы: Библиотека использует внутреннюю таблицу соответствия (
BOARD_TO_BCM), чтобы преобразовать физический номер пина в его системный номер, который используется ядром Linux. -
Пример:
import RepkaPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) # Мы обращаемся к контакту, который является 7-й физической ножкой на плате. # Библиотека сама определит, что это системный GPIO7 (PA7). led_pin = 7 GPIO.setup(led_pin, GPIO.OUT)
GPIO.BCM: Нумерация по номеру канала SoC
-
Определение: Этот режим использует нумерацию, основанную на номере канала GPIO непосредственно в однокристальной системе (SoC). Название
BCMисторически унаследовано от процессоров Broadcom в Raspberry Pi, но в контексте Repka Pi и других плат оно означает системный номер GPIO, используемый вsysfs. -
Принцип работы: В этом режиме передаваемое значение напрямую соответствует номеру GPIO в
/sys/class/gpio. Этот подход абстрагирует программу от физического расположения пина, привязывая ее к функции чипа. -
Пример:
import RepkaPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) # Мы обращаемся к системному каналу GPIO4. На плате Repka Pi 3 # он физически выведен на 8-й контакт гребенки. tx_pin = 4 GPIO.setup(tx_pin, GPIO.OUT)
Архитектурная адресация (SUNXI и SOC)
Эти два режима являются самым низкоуровневым способом адресации и основаны на архитектуре процессоров Allwinner, где все пины сгруппированы в порты. Каждый порт обозначается латинской буквой (A, B, C, D...) и содержит определенное количество пинов (например, PA0, PA1... PL7).
Принцип вычисления системного номера
Системный номер GPIO (используемый в sysfs и режиме BCM) не является произвольным. Он вычисляется по строгой формуле, основанной на номере порта и номере пина внутри порта:
Системный_номер = (Номер_порта * 32) + Номер_пина_в_порту
В библиотеке RepkaPi.GPIO буквенным портам соответствуют числовые константы, которые по сути являются множителями:
PA-> 0 (A- 1-я буква алфавита,(1-1)*32=0)PB-> 32 (B- 2-я буква,(2-1)*32=32)PC-> 64 (C- 3-я буква,(3-1)*32=64)PD-> 96- ...и так далее.
Для портов, идущих после PI, PJ, PK (которые отсутствуют в архитектуре Allwinner), используются напрямую заданные константы, например:
PL-> 352
Таким образом, для пина PL7 системный номер будет вычислен как: 352 (база порта L) + 7 (номер пина) = 359.
Реализация в режимах
-
GPIO.SUNXIВ этом режиме вы передаете имя пина в виде строки. Библиотека сама разбирает эту строку, определяет порт и номер пина, а затем выполняет вычисление. Пример:import RepkaPi.GPIO as GPIO GPIO.setmode(GPIO.SUNXI) # Передаем "PL7". Библиотека вычислит 352 + 7 = 359. led_pin = "PL7" GPIO.setup(led_pin, GPIO.OUT) -
GPIO.SOCВ этом режиме вы выполняете вычисление самостоятельно, используя предопределенные константы. Пример:import RepkaPi.GPIO as GPIO GPIO.setmode(GPIO.SOC) # Мы сами вычисляем адрес: GPIO.PL (352) + 7 = 359 led_pin = GPIO.PL + 7 GPIO.setup(led_pin, GPIO.OUT)
Сводка и сценарии использования #
| Режим | Формат значения | Механизм | Сценарий использования |
|---|---|---|---|
GPIO.BOARD |
Целое число (1-40) |
Прямая нумерация контактов. | Физическое прототипирование, образовательные цели. |
GPIO.BCM |
Целое число |
Системный номер GPIO (sysfs). |
Написание переносимого ПО, работа с существующими скриптами. |
GPIO.SUNXI |
Строка ("PL7") |
Архитектурное имя пина. | Работа с технической документацией на SoC, повышение читаемости кода. |
GPIO.SOC |
Выражение (GPIO.PL+7) |
Архитектурное имя (вычисляемое). | Программная генерация пинов, работа с портами целиком. |