Содержание #
- Введение
- Установка и первичная настройка
- Константы библиотеки
- Методы библиотеки
- Начало работы с библиотекой
- Заключение
Введение #
Начнем знакомство с подключаемой библиотекой 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).
В следующей статье мы рассмотрим разные примеры работы библиотеки на практике!
Поправьте опечатку: "Данная библиотека была максимально поддерживает"
Сделал по инструкции, но без sudo выдает:
PermissionError: [Errno 13] Permission denied: '/sys/class/gpio/export'
(Пользователя нового создал)
Пользователю группу gpio добавили?
Да... перепробовал все подряд. Единственное помогает, если поменять права на директорию питона, но при этом выполнение программы замедляется в раз 10
https://gitflic.ru/project/repka_pi/repkapigpio эту лучше попробуйте
Установил, все равно требует рут...
" Нет доступа к /dev/mem. Попробуйте запустить под root!"