Содержание
Введение
Начнем знакомство с подключаемой библиотекой 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).
В следующей статье мы рассмотрим разные примеры работы библиотеки на практике!