Как стать автором
Обновить

Знакомимся с RepkaPi.GPIO SysFS. Установка и управление GPIO через Python 3. Теоретические основы работы GPIO портов

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров3.3K

Содержание

  1. Введение

  2. Установка и первичная настройка

  3. Константы библиотеки

  4. Методы библиотеки

  5. Начало работы с библиотекой

    1. Информация о библиотеки и плате

    2. Режим работы пинов

      1. Режим установки состояния (OUTPUT)

      2. Режим чтения состояния (INPUT)

    3. Чтение и установка состояний

  6. Заключение

Введение

Начнем знакомство с подключаемой библиотекой RepkaPi.GPIO, данная библиотека написана на Python 3 и для управления GPIO использует методы, реализованные через SysFS. Подробней про SysFS можно прочитать на wikipedia.

Данная библиотека была максимально поддерживает обратную совместимость с библиотекой RPI.GPIO для Raspberry Pi чтобы обеспечить быстрый перенос Ваших скриптов.

Постоянный адрес библиотеки на gitflic.ru: https://gitflic.ru/project/repka_pi/repkapigpiofs.

Установка и первичная настройка

Первым делом устанавливаем необходимые пакеты.

Обновим индекс пакетов

sudo apt-get update

Установим необходимые пакеты

sudo apt-get install python3-dev python3-setuptools git

Клонируем репозиторий

git clone https://gitflic.ru/project/repka_pi/repkapigpiofs.git

Переходим в полученную папку

cd repkapigpiofs

* Вы также можете скачать архивом с gitflic и распаковать в удобном месте.

Перед тем как установить модуль давайте рассмотрим возможную его настройку. Модуль имеет две константы, данные константы находятся в файле RepkaPi/constants.py

  • GPIO.DEFAULTBOARD - позволяет указать модель Repka Pi на которой будет использоваться модуль. По умолчанию значение None. При этом значение необходимо определять плату при работе с библиотекой. На данный момент возможно установить значение GPIO.REPKAPI3 или 1, это будет означать что библиотека работает на Repka Pi 3 и в дальнейшем при работе с библиотекой указывать версию платы не обязательно.

  • GPIO.AUTODETECT - автоматическое определение модели Repka Pi. Принимает логическое значение True/False, по умолчанию установлена в True. Если установлено True то GPIO.DEFAULTBOARD игнорируется.

Установка библиотеки

sudo python3 setup.py install

При успешной установки библиотеки будет такая концовка вывода

Без root-доступа

Если вы хотите использовать библиотеку как пользователь без полномочий root, вам необходимо сначала настроить правило UDEV, чтобы предоставить вам разрешения. Это можно сделать следующим образом:

Создаем группу gpio

sudo groupadd gpio

Добавляем вашего пользователя в группу gpio

sudo usermod -aG gpio <ваш пользователь>

Создаем правило для udev при загрузке системы

sudo nano /etc/udev/rules.d/99-gpio.rules

В открывшейся файл вставляем следующее

KERNEL=="gpio\*", MODE:="0660", GROUP:="gpio" 

KERNEL=="pwm*", MODE:="0660", GROUP:="gpio" 

KERNEL=="gpiochip*", MODE:="0660", GROUP:="gpio" 

SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/gpio && chmod -R 777 /sys/class/gpio && chown -R root:gpio /sys/class/gpio/* && chmod -R 777 /sys/class/gpio/* && chown -R root:gpio /sys/devices/platform/soc/*.pinctrl/gpio && chmod -R 777 /sys/devices/platform/soc/*.pinctrl/gpio'" SUBSYSTEM=="pwm*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/pwm && chmod -R 777 /sys/class/pwm && chown -R root:gpio /sys/class/pwm/* && chmod -R 777 /sys/class/pwm/* && chown -R root:gpio /sys/class/pwm/pwmchip0/* && chmod -R 777 /sys/class/pwm/pwmchip0/* && chown -R root:gpio /sys/devices/platform/soc/*.pwm/pwm && chmod -R 777 /sys/devices/platform/soc/*.pwm/pwm '"

Нажмите ctrl-x, Y и ENTER, чтобы сохранить и закрыть файл.

Перезагружаем систему

sudo reboot

Константы библиотеки

Рассмотрим какие константы имеет библиотека и могут использоваться при работе. В статье мы их рассмотрим подробней.

Информационные

  • GPIO.RPI_INFO - информация об устройстве

  • GPIO.VERSION - информация о версии библиотеки

Модели Repka Pi (board)

  • GPIO.REPKAPI3 - Repka Pi 3

Режимы нумерация пинов (mode)

  • GPIO.BOARD - 10 - физическая нумерация по порядку от 1 до 40

  • GPIO.BCM - 11 - нумерация по Raspberry Pi 3B для обратной совместимости скриптов, в новых скриптах использовать не рекомендуем

  • GPIO.SUNXI - 12 - по строковому обозначенею SUNXI “PA0…, PC…, PL…”

  • GPIO.SOC - 13 - по числовому адресу в SOC, применяется в SysFS, рекомендовано к использованию

  • GPIO.SYSFS - альяс для GPIO.SOC

Значения SUNXI

  • GPIO.PA - 0

  • GPIO.PC - 64

  • GPIO.PD - 96

  • GPIO.PE - 128

  • GPIO.PF - 160

  • GPIO.PG - 192

  • GPIO.PL - 352

Режимы работы пина

  • GPIO.IN - 1 - режим INPUT - чтение состояния

  • GPIO.OUT - 0 - режим OUTPUT - установка состояния

Состояние пина

  • GPIO.HIGH - 1 - высокий уровень, логическая единица

  • GPIO.LOW - 0 - низкий уровень, логический ноль

Подтяжка пина

  • GPIO.PUD_OFF - не подтягивается

  • GPIO.PUD_DOWN - пин через внутренний резистор будет подключен к 0 (GND)

  • GPIO.PUD_UP - пин через внутренний резистор будет подключен к +3.3В

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

Событийные

  • GPIO.RISING - изменение сигнала с LOW на HIGH

  • GPIO.FALLING - изменение сигнала с HIGH на LOW

  • GPIO.BOTH - изменение сигнала в любом направление

Методы библиотеки

Информационные

  • GPIO.getboardmodel() - получает установленную модель Repka Pi

  • GPIO.getmode() - возвращает номер режима нумерации пинов

Установочные

  • GPIO.setboard() - установка модели Repka Pi, принимает значение

    • board - GPIO.REPKAPI3

  • GPIO.setmode() - установка режима нумерации пинов, принимает значение

    • mode - GPIO.BOARD, GPIO.BCM, GPIO.SUNXI или GPIO.SOC

  • GPIO.setwarnings() - управление предупреждениями, принимает логическое значение True/False

Работа с GPIO

  • GPIO.setup() - инициализация пина, принимает значения

    • channel - номер пина в соответствие с установленным режимом нумерации,

    • direction - устанавливаем GPIO пин как вход или выход (использовать только GPIO.IN или GPIO.OUT)

    • initial - (опционально) установка начального значения пина (GPIO.LOW (0) или GPIO.HIGH (1),

    • pull_up_down - (опционально) подтяжка к +3,3В (GPIO.PUD_UP), к 0 (GPIO.PUD_DOWN) или не установлен (GPIO.PUD_OFF).

      Внимание: Подтяжка в данной версии библиотеки не работает, но описание сохранено для обратной совместимости

  • GPIO.input() - получение состояние пина, принимает значение

    • channel - номер пина в соответствие с установленным режимом нумерации, возвращает значение GPIO.LOW (0) или GPIO.HIGH (1)

  • GPIO.output() - устанавливает состояние пина, принимает значения

    • channel - номер пина в соответствие с установленным режимом нумерации,

    • state - состояние пина GPIO.LOW (0) или GPIO.HIGH (1)

  • GPIO.cleanup() - возвращаем пины в исходное состояние, принимает значение

    • channel - номер пина в соответствие с установленным режимом нумерации или None (значение по умолчанию) чтобы сбросить все инициализированные пины

В следующих статьях рассмотрим остальные методы библиотеки.

Начало работы с библиотекой

Первым делом нам необходимо подключить библиотеку RepkaPi.GPIO в вашем скрипте

import RepkaPi.GPIO as GPIO

Если при установке вы не указали GPIO.DEFAULTBOARD и GPIO.AUTODETECT установили в False то необходимо установить модель Repka Pi, это можно сделать следующей функцией

GPIO.setboard(GPIO.REPKAPI3)

GPIO.REPKAPI3 - означает что библиотека используется на Repka Pi 3. На данный момент единственная модель.

Указываем какой мы режим хотим использовать

GPIO.setmode(GPIO.SOC)

Выше в разделе “Константы библиотеки” были перечислены все константы, давайте теперь разберем подробней чем они отличаются.

BOARD - обращение по порядковому номеру пина на плате, если хотим обратиться к пину под №7, то при обращении нужно писать тоже 7

SUNXI -  Обращение по строковому параметру в схеме распиновки, если мы используем этот режим, то обращение к пину 7 будет как строковое значение “PA7

Данный способ будет более понятным, но тоже при работе использует дополнительные операции.

SOC и SYSFS - числовая адресация по SOC и SYSFS т.е. если обратить внимание на распиновку как официальную, так и на представленную в статье, то увидите соответствующий столбец.

Если вы захотите обратиться к пину под номером 18, то вам нужно будет указать его номер SOC/SysFS равный 355, также вы можете вычислить данное число по SUNX (P обозначает Pin ее мы пропускаем. Формула вычисления, (порядковый номер латинской буква (L) - 1) 32 + номер после латинской буква (3), то получим (12-1) 32+3=355).

Данный способ является предпочтительным т.к. не выполняются дополнительные операции приведения. Также для удобства в библиотеке есть следующие константы.

PA - 0, PC - 64, PD - 96, PE - 128, PF - 160, PG - 192, PL - 352 и обращение к 18 пину PL3 будет уже следующим GPIO.PL + 3.

BCM - эта схема создана для совместимости с обращением по BCM процессорам которые устанавливаются в основном в Raspberry Pi. Если мы посмотрим на схему Raspberry Pi то к примеру на 7 пине у него находится GPIO4.

Обращение происходит по номеру GPIO т.е. 4, дальше скрипт приведет данное значение к соответствующему значению к Repka Pi, т.е. по SOC это будет 7 или PA7 по SUNXI

Рассматривать в рамках статьи этот способ не будем, при разработке на Repka Pi он не пригодится.

Если не разобрались, то не переживайте мы еще будем возвращаться к этой части в примерах, и возможно не раз.

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

Информация о библиотеки и плате

В библиотеке есть две константы и один метод чтобы получить информацию о плате и библиотеке.

Получить выбранную модель платы

GPIO.getboardmodel()

Данный метод вернет нам

Repka Pi 3

* при появление новых версий и по мере их добавления в библиотеку возможны и другие ответы.

Версия библиотеки

GPIO.VERSION

Вернется версия 0.1.2, это версия на момент написания статьи.

Информация об устройстве

GPIO.RPI_INFO

Вернет объект свойств

{'P1_REVISION': 3, 'TYPE': 'Repka Pi 3', 'MANUFACTURER': 'ИНТЕЛЛЕКТ', 'RAM': '1GB', 'REVISION': '', 'PROCESSOR': 'Allwinner H5'}

Данная информация соответствует структуре аналогичной константы в RPI.GPIO для Raspberry Pi.

Для получения конкретного свойства можно, обратившись к нему напрямую:

GPIO.RPI_INFO['MANUFACTURER']

Вернет значение

ИНТЕЛЛЕКТ
GPIO.RPI_INFO['PROCESSOR']

Вернет значение

Allwinner H5

Узнать, какой режим установлен

GPIO.getmode()

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

Режим работы пинов

После рассмотрения основных базовых действий можно переходит к установке режима работы пина. Рассмотрим все возможные обращения на примере 18 пина

Пин может принимать 2 варианта - INPUT (режим чтения состояния) и OUTPUT (режим установки состояния).

Для установки состояния используем метод GPIO.setup(channel, direction, initial=None, pull_up_down=None)

  • channel - номер пина в соответствие с установленным режимом нумерации,

  • direction - устанавливаем GPIO пин как вход или выход (использовать только GPIO.IN или GPIO.OUT)

  • initial - (опционально) установка начального значения пина (GPIO.LOW (0) или GPIO.HIGH (1),

  • pull_up_down - (опционально) подтяжка к +3,3В (GPIO.PUD_UP), к 0 (GPIO.PUD_DOWN) или не установлен (GPIO.PUD_OFF)

Режим установки состояния (OUTPUT)

В режиме GPIO.BOARD

GPIO.setup(18, GPIO.OUT)

В режиме GPIO.SUNXI

GPIO.setup("PL3", GPIO.OUT)

В режиме GPIO.SOC/GPIO.SYSFS

GPIO.setup(355, GPIO.OUT)

или

GPIO.setup(GPIO.PL+3, GPIO.OUT)

Далее будем рассматривать только в режиме GPIO.SOC/GPIO.SYSFS

Вы также можете настроить сразу несколько пинов в одном вызове используя списки (list)

GPIO.setup([GPIO.PL+3, GPIO.PA+10], GPIO.OUT)

или кортежи (tuple)

GPIO.setup((GPIO.PL+3, GPIO.PA+10), GPIO.OUT)

Для пина в режиме OUT можно установить начальное значение при помощи свойства initial.

Инициализируем пин в режиме OUTPUT со значением логическая единица GPIO.HIGH

GPIO.setup(355, GPIO.OUT, initial=GPIO.HIGH)

Инициализируем пин в режиме OUTPUT со значением логическая ноль GPIO.LOW

GPIO.setup(pin, GPIO.OUT, initial=GPIO.LOW)

Режим чтения состояния (INPUT)

В режиме GPIO.SOC/GPIO.SYSFS

GPIO.setup(GPIO.PL+3, GPIO.IN)

Вы также можете настроить сразу несколько пинов в одном вызове используя списки (list)

GPIO.setup([GPIO.PL+3, GPIO.PA+10], GPIO.IN)

или кортежи (tuple)

GPIO.setup((GPIO.PL+3, GPIO.PA+10), GPIO.IN)

При инициализации пина в режиме INPUT, можно в этой же команде осуществить повышающую/понижающую резисторную подтяжку этого пина, а также отключить подтягивание.

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

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

Чтобы обойти эту проблему, мы используем подтягивающий или понижающий резистор. Таким образом, можно установить значение входа по умолчанию. Резисторы повышения/понижения можно использовать аппаратно и с помощью программного обеспечения. В аппаратном обеспечении обычно используется резистор 10 кОм между входным каналом и напряжением 3,3 В (повышение) или 0 В (понижение).

Программная подтяжка будет реализована в другой версии модуля.

Подтягиваем к +3.3В

GPIO.setup(GPIO.PL+3, GPIO.IN, pull_up_down=GPIO.PUD_UP)

Подтягиваем к 0В

GPIO.setup(GPIO.PL+3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

Отключаем подтягивание

GPIO.setup(GPIO.PL+3, GPIO.IN, pull_up_down=GPIO.PUD_OFF)

Чтение и установка состояний

Для получения состояния пина, установленного в режиме INPUT (режим чтения состояния) или OUTPUT (режим установки состояния) воспользуемся функцией input(channel).

Функция имеет параметр channel номер пина в соответствие с установленным режимом нумерации и возвращает значение 0/GPIO.LOW/False или 1/GPIO.HIGH/True

value=GPIO.input(GPIO.PL+3)

В данном примере в value запишется состояние пина PL3, 0/GPIO.LOW/False или 1/GPIO.HIGH/True.

Для задания состояния пина, инициализированного в режим OUTPUT (режим установки состояния) воспользуемся функцией output(channel, state).

Параметры функции:

  • channel - номер пина, может принимать список (list) и кортежи (tuple)

  • state - состояние пина 0/GPIO.LOW/False или 1/GPIO.HIGH/True, может принимать список (list) и кортежи (tuple)

GPIO.output(GPIO.PL+3, GPIO.HIGH)

В данном примере PL3 был задан высокий уровень (1/GPIO.HIGH/True), в данном случае на пине будет напряжение +3,3В.

Теперь рассмотрим варианты с использованием списка (list)

GPIO.output([GPIO.PL+3, GPIO.PA+10], GPIO.HIGH)

или кортежа (tuple)

GPIO.output((GPIO.PL+3, GPIO.PA+10), GPIO.HIGH)

В этих примерах мы установили PL3 и PA10 высокий уровень (1/GPIO.HIGH/True).

Также в значение пина можно тоже передать список (list) значений

GPIO.output([GPIO.PL+3, GPIO.PA+10], [GPIO.HIGH, GPIO.LOW])

или кортежа (tuple)

GPIO.output([GPIO.PL+3, GPIO.PA+10], (GPIO.HIGH, GPIO.LOW))

Параметры channel и state могут иметь тип список (list) или кортеж (tuple), связи типов нет. Но в state должно быть 1 значение которое будет задано все пина или одинаковое количество с channel.

И рассмотрим еще одну функцию cleanup(), предназначенную для возврата пинов в исходное состояние.

Функция имеет параметр channel номер пина в соответствие с установленным режимом нумерации.

Сброс всех установленных пинов

GPIO.cleanup()

Внимание: При таком вызове также сбросится и установленный режим нумерации пинов.

Сбросить только один пин

GPIO.cleanup(GPIO.PL+3)

Также в этой функции можно применить список (list) или кортеж (tuple), чтобы вернуть в исходное состояние несколько пинов

GPIO.cleanup([GPIO.PL+3, GPIO.PA+10])

или

GPIO.cleanup((GPIO.PL+3, GPIO.PA+10))

Заключени

В данной статье мы начали знакомство с библиотекой RepkaPi.GPIO SysFS для Python3, выполнили установку, разобрали ее настройки, рассмотрели константы и некоторые функции по работе с GPIO в режиме I/O (Input/Output).

В следующей статье мы рассмотрим разные примеры работы библиотеки на практике!

Теги:
Хабы:
Всего голосов 6: ↑4 и ↓2+2
Комментарии1

Публикации

Истории

Работа

Data Scientist
68 вакансий

Ближайшие события

2 – 18 декабря
Yandex DataLens Festival 2024
МоскваОнлайн
11 – 13 декабря
Международная конференция по AI/ML «AI Journey»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань