Дмитрий
Дмитрий
2876 просмотров6 комментариев

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

Содержание


Содержание #

  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)

Для участия в обсуждении Вы должны быть авторизованным пользователем
piton369  

Поправьте опечатку: "Данная библиотека была максимально поддерживает"

k_s_corp
k_s_corp  

Сделал по инструкции, но без sudo выдает:
PermissionError: [Errno 13] Permission denied: '/sys/class/gpio/export'
(Пользователя нового создал)

Дмитрий
Дмитрий  

Пользователю группу gpio добавили?

k_s_corp
k_s_corp  

Да... перепробовал все подряд. Единственное помогает, если поменять права на директорию питона, но при этом выполнение программы замедляется в раз 10

Дмитрий
Дмитрий  

https://gitflic.ru/project/repka_pi/repkapigpio эту лучше попробуйте

k_s_corp
k_s_corp  

Установил, все равно требует рут...
" Нет доступа к /dev/mem. Попробуйте запустить под root!"

Темы

Навигация

ВойтиРегистрация