Делюсь своим опытом, полученным при изучении задачи вынесенной в заголовок. В статье рассматриваются два варианта работы, которые можно использовать в Python-программах, обращающихся к портами GPIO Raspberry Pi. Порты GPIO Raspberry Pi выглядят следующим образом: Одним из вариантов работы с GPIO является интерфейс Sysfs. Подробнее о Sysfs интерфейсе GPIO здесь. В этом случае для обращения к портам GPIO используются операции чтения и записи файлов. Для использования конкретного вывода его нужно зарезервировать и установить направление на вход или на выход. После окончания работы с портом его нужно освободить, чтобы другие процессы могли его использовать. Резервирование порта (XX — номер нужного порта):
$ echo XX > /sys/class/gpio/export
При успешном резервировании появляется новая папка по адресу /sys/class/gpio/gpioXX/
. Установка направления выполняется так:
$ echo "out" > /sys/class/gpio/gpioXX/direction
Или так:
$ echo "in" > /sys/class/gpio/gpioXX/direction
Установка высокого и низкого уровней для порта, настроенного на выход выполняется так:
$ echo 1 > /sys/class/gpio/gpioXX/value $ echo 0 > /sys/class/gpio/gpioXX/value
Определение состояние порта, настроенного на вход делается так:
$ cat /sys/class/gpio/gpioXX/value
Освобождение порта после окончания его использования:
$ echo XX > /sys/class/gpio/unexport
Для упрощения работы с GPIO через интерфейс Sysfs мне встретились две утилиты. Одна из них WiringPi GPIO utility, другая quick2wire-gpio-admin. Основная задача, решаемая этими утилитами — это предоставление возможности работы с GPIO от имени непривилегированного пользователя. При этом WiringPi GPIO utility более функциональна. Я для работы с GPIO остановился на пакете RPIO (на момент написания последней была версия 0.10.0). Этот пакет работает с портами GPIO напрямую, обращаясь к регистрам BCM2708 через специальное устройство /dev/mem
. Что такое RPIO:
Advanced GPIO for the Raspberry Pi. Extends RPi.GPIO with PWM, GPIO interrups, TCP socket interrupts, command line tools and more
RPIO позиционируется как улучшенный и расширенный вариант другого модуля, RPi.GPIO. В документации непосредственно на RPIO подробно рассмотрены только возможности, отсутствующие в RPi.GPIO, по этому за описанием общих для этих модулей функций нужно обращаться к документации RPi.GPIO, доступной здесь. Устанавливается пакет следующей командой:
$ sudo pip install RPIO
Кроме python-модулей устанавливаюся две программы: rpio-curses и rpio. С их помощью можно, например, получить текущий режим и состояние GPIO и, при желании, изменить их. Так выглядит работа с rpio-curses: Так можно получить информацию о системе:
$ rpio --sysinfo 000f: Model B, Revision 2.0, RAM: 512 MB, Maker: Qisda
Пример python-программы, использующей RPIO:
import RPIO import time NRF_CE = 24 # set up output channel with an initial state RPIO.setup(NRF_CE, RPIO.OUT, initial=RPIO.LOW) for i in range(10): RPIO.output(NRF_CE, 1) time.sleep(1) RPIO.output(NRF_CE, 0) time.sleep(1) # reset every channel that has been set up by this program, # and unexport interrupt gpio interfaces RPIO.cleanup()
2201.2018Рубрика:Всё о Raspberry PI
Самое интересное в разработке на Одноплатных компьютерах — это общение с внешним миром. Вот что позволяет «Малина» — это подключение датчиков, концевиков, двигателей, лампочек, различных исполнительных органов. В Raspberry Pi GPIO является самой привлекательной частью. Я считаю, что для роботов это просто идеальные «мозги».
Из этой статьи вы узнаете:
Знакомство с GPIOОсобенности работы с GPIOСхема подключения светодиода и кнопкиПрограммируем GPIO
Приветствую вас, друзья!! Сегодняшняя тема статьи будет посвящена физическим входам и выходам на одноплатном компьютере Raspberry. Именно этим «Малина» и заслужила такую недетскую популярность. Очень много различных модулей сделано для Raspberry, и разрабатываются всё новые и новые.
Что можно подключить? Да все те же датчики и дополнительные платы, что и на Arduino. На борту есть два интерфейса, таких как SPI и I2C, по которым можно управлять электроникой. Можно сравнить с протоколом Modbus в системе ПЛК — модули ввода/вывода.
Недавно я научился управлять входами и выходами с помощью скриптов на Python. Показать как?
Знакомство с GPIO
Про старые модели, я так думаю, нет смысла писать. Начнём сразу с 3-ей модели. Давайте разбираться, что такое вообще GPIO.
Аббревиатура GPIO с английского расшифровывается как: General-purpose Input/Output — это интерфейс. который содержит Входы и Выходы общего назначения, к которым можно подключать разнообразные исполнительные устройства, датчики, дисплеи, контроллеры, разные модули и разную периферию.
Интерфейс GPIO выглядит как разъём со штырьками. в третьей «Малине» будет выглядеть следующим образом:
Где какой пин? А вот где они:
На картинке нарисована модель Raspberry Pi 2 model B, не пугайтесь, распиновка одна и та же.
Обратите внимание, что все пины могут быть как ВХОДАМИ, так и ВЫХОДАМИ. Присвоение функции пина происходит программно.
Распиновка Raspberry pi 3:
Особенности работы с GPIO
Перед сборкой и подключением внешних цепей к Raspberry, вы должны знать о таких нюансах:
- Максимальный суммарный ток обоих выводов 3,3 В равен 50 мА, напрямую можно подключать устройства только с током потребления меньше 50 мА.
- Максимальный суммарный ток обоих выводов 5 В равен 300 мА, напрямую можно подключать устройства только с током потребления меньше 300 мА.
- На GPIO ни в коем случае нельзя подавать напряжение выше 3,3 В. В противном случае можно спалить вход, а можно и весь процессор целиком.
- Выводы 14 и 15 по умолчанию выполняют альтернативную функцию и являются выводами UART (RXD и TXD), поэтому при включении на них присутствует высокий уровень 3,3 В.
- Все настраиваемые выводы GPIO — кроме GPIO0 (SDA) и GPIO1 (SCL) — по умолчанию являются входами и поэтому имеют высокое сопротивление, при этом подтяжка высокого уровня не подключена, поэтому они начинают плавать.
Вы должны понимать, что GPIO подключены напрямую к процессору, и неграмотное подключение может повредить сам процессор. Будьте внимательны!!!
Поэтому при проектировании устройств в которых используется большое количество пинов GPIO нужно обязательно делать развязку через дополнительные буфферные схемы, преобразователи уровня напряжений, электронные ключи.
Есть ещё несколько нюансов. После того как Raspberry Pi включена и операционная система Linux загружена, на выводах GPIO установлен низкий уровень (0В), и так до тех пор пока какая-то программа или скрипт не изменит состояние портов.
И все бы хорошо если бы не небольшое НО… Суть его заключается в том, что начиная с момента подачи питания на платформу и до момента инициализации драйверов в ОС, на произвольных пинах могут кратковременно присутствовать высокие уровни (3,3В).
Схема подключения светодиода и кнопки
При подключении светодиода не забудьте подключить гасящий резистор (200-300 Ом). Это обеспечит малое потребления тока, как раз меньше 50 мА. Таким образом вы спасёте сам процессор и буфер GPIO.
При подключении кнопки, тоже есть свои нюансы. Очень рекомендуется ставить токоограничивающие резисторы. Кто-то спросит, а почему нельзя поставить просто кнопку, и всё? Я тоже задавался таким вопросом. Оказывается всё просто.
Не забывайте, что при загрузке ОС или неверно установленном режиме GPIO на используемый пин может пойти 3,3 В. Таким образом при замыкании на землю, мы обеспечим короткое замыкание, и таким образом спалим пин, или процессор.
Такая схема с ограничительными резисторами — это гарантия сохранения работоспособности «Малины» в различных ситуациях.
Что даёт такая схема подключения кнопки:
- Пока кнопка SW1 не нажата то через резисторы R1 и R2 на входе порта установлен высокий уровень 3,3В;
- При замыкании кнопки SW1 через резистор R1 и кнопку пойдет ток, равный I=U/R=3,3В/10000Ом=0,33мА, а через ограничивающий резистор R2 и кнопку на входе порта будет установлен низкий уровень — 0В;
- Если пин порта выставлен неверно, на выход 3,3В — через цепочку R1, R2 не будет идти никакой ток (3,3В=3,3В), а при нажатии кнопки через R2 и SW1 потечет ток равный R=3,3В/750Ом=4,4мА, что является безопасным значением и никак не повредит схему и порт GPIO.
Схема подключения светодиода и кнопки:
R1 — 10 кОм, R2 — 1 кОм, R3 — 220 кОм.
Программируем GPIO
Работать с GPIO можно двумя способами:
- Используя оболочку bash и файловую систему.
- Используя языки программирования.
Управление GPIO из оболочки bash
ОС Raspbian является дистрибутивом Linux, а концепция Linux представляет собой работу с текстовыми файлами, и конфигурирование этих файлов. Пользуемся оболочкой bash в любимом терминале.
Вывод логической единицы на 25 пин:
Выполняем чтение входа 24, используем команду cat:
Управление GPIO из языка Python
Вот здесь для меня начинается самое интересное! Надеюсь, не только для меня, но и для вас.
Для того, чтобы эта система работала на языке Python, требуется специальная библиотека RPi.GPIO. В новых дистрибутивах Raspbian она уже установлена. Если же нет, то ставим:
Чтобы использовать все опции пинов в Python’e, для этого нам нужно использовать модули:
Затем выбираем способ нумерации портов. GPIO.BOARD — использует нумерацию портов на плате. Преимущество будет в том, что эта система будет работать всегда, в независимости от номера ревизии платы. Вторая система нумерации GPIO.BCM — это более низкий уровень и обращается напрямую к номерам каналов на процессоре. По аналогии на ПЛК, как конфигурирование или обращение напрямую к адресам. Программисты CoDeSyS меня поймут.
Выбираем:
Дальше выбираем режим работы пинов (вход или выход):
Если входной канал ни к чему не подключен, он может «Плыть». Следующие команды осуществляют подтяжку вывода к 3,3 В или к земле. Тогда прописываем:
Для выходов мы можем сразу определить начальное положение, 0 или 1.
Для того, чтобы прочитать вход, существует такая команда:
Для того чтобы произвести запись на выход, есть такая команда:
Ну что, есть. Давайте попробуем написать программу, со скрипта включим или выключим светодиод.
Если вы хотите помигать светодиодом:
Включаем светодиод с кнопки:
Управляем с клавиатуры:
Все это мы пишем в ОС в программе Python IDLE. Сохраняем все в корневую папку /home/pi.
После этого, для того, чтобы запустить скрипт в терминале вводим следующую команду и название программы:
Для основного понимания работы скриптов в Raspberry PI я думаю достаточно. Если будут вопросы, пишите в комментариях или письма. До встречи в следующих статьях. Пока-пока!!
С уважением, Гридин Семён
Посмотрим более подробно на распиновку новой платы Raspberry Pi 4 GPIO и подробно изучим каждую функцию.
GPIO
Из википедии: GPIO или Интерфейс ввода/вывода общего назначения (англ. general-purpose input/output, GPIO) — интерфейс для связи между компонентами компьютерной системы, к примеру микропроцессором и различными периферийными устройствами. Контакты GPIO могут выступать как в роли входа, так и в роли выхода — это, как правило, конфигурируется. GPIO контакты часто группируются в порты.
Во многих отношениях Raspberry Pi 4 улучшает возможности более ранних моделей Pi. Одноплатный компьютер поддерживает не только больший объем оперативной памяти, более высокую скорость процессора и расширенные периферийные устройства, но выводы GPIO сохраняют свои стандартные функции, установленные предыдущими моделями, наряду с дополнительными функциями для существующих выводов. Давайте посмотрим, что делают стандартные 40 контактов на Raspberry Pi, а затем рассмотрим каждую из этих функций подробнее.
Как я написал ранее, GPIO — это Интерфейс ввода/вывода общего назначения.
Универсальный интерфейс ввода/вывода — это, собственно, то, что означает GPIO и прекрасно описывает работу контактов плат Raspberry Pi. Они очень похожи на штыревые порты Arduino, так как их можно настроить для чтения входов или записи выходов. Эти контакты позволяют вашему Pi взаимодействовать с различными компонентами, такими как кнопки, потенциометры и зуммеры.
По теме: Управление GPIO Raspberry Pi через Node.js
Есть две схемы именования, с которыми вы должны ознакомиться: нумерация WiringPi и Broadcom. Последняя — это то, как официально называют каждый пин, отображен зеленым цветом на изображении выше. WiringPi, библиотека интерфейса GPIO, которую вы, скорее всего, будете использовать. Имеет собственную аппаратно-независимую систему нумерации. Не забывайте проверять, с какому выводом вы на самом деле работаете при программировании Pi.
Пины питания и заземления
Контакты питания и заземления используются для питания внешних цепей. Все Raspberry Pi со стандартными контактами 40 GPIO будут иметь два контакта 5В и два контакта 3.3В, всегда в одном и том же месте.
Наряду с контактами 5 В и 3,3 В доступны 8 заземляющих контактов (GND). Контакты питания и заземления позволяют питать ваши компоненты Raspberry Pi, такие как светодиоды и двигатели. Однако помните, что перед тем, как на что-либо подавать питание через эти контакты, всегда следует устанавливать надлежащие компоненты или внешнюю схему. Питание чего-либо со слишком большим током или значительными скачками напряжения, например, двигатель без соответствующего контроллера мотора, повредит контакты и может сделать их непригодными для использования.
Альтернативные функции
В то время как многие проекты могут уживаться с выводами питания и ввода, иногда от Pi требуются разные способности. К счастью, некоторые выводы GPIO удваиваются как интерфейсы I2C, SPI и UART. Pi 4 расширил возможности многих выводов, поддерживая эти интерфейсы на большем количестве из них, чем в Raspberry Pi 3b+ и до неё. Ниже приведем краткое описание по каждому интерфейсу.
I2C
I2C, или протокол Inter-Integrated Circuit, позволяет вашему Raspberry Pi управлять несколькими датчиками и компонентами, известными как ведомые (slave, подчиненные). Связь осуществляется через SDA (вывод данных) и SCL (вывод тактовой частоты). Каждое ведомое устройство создается с уникальным адресом, чтобы обеспечить быструю связь со многими устройствами. Контакты ID_EEPROM также являются I2C, но используются для связи с дополнительными платами, а не подчиненными компонентами.
SPI
SPI, или последовательный периферийный интерфейс, также используется для управления компонентами с отношениями мастер-ведомый (ведущий-ведомый), хотя он не такой компактный. Для работы требуются часы (SCLK), контакты Master Out Slave In (MOSI) и Master In Slave Out. Выводы выполняют то, что подразумевают их названия, с помощью SCLK, регулирующего скорость передачи данных, MOSI используется для отправки указаний от Pi на подключенные устройства, а MISO делает наоборот.
UART
Если вы раньше работали с Arduino, возможно, вы уже слышали о UART или Serial (последовательная связь). Универсальный асинхронный приемник/передатчик используется для подключения плат Arduino к компьютерам, которые их программируют, а также для связи между другими устройствами с приемными и передающими контактами. Эти контакты могут использоваться для управления вашим Pi через другой компьютер, если последовательная консоль включена в raspi-config, или для прямого управления Arduino, если вы не можете использовать кабель USB для своего проекта.
По теме: Как подключить Raspberry Pi к Ардуино?
PWM
Наряду с другими функциями все контакты поддерживают программный ШИМ, а GPIO12, GPIO13, GPIO18, GPIO19 — аппаратную широтно-импульсную модуляцию.
Официальный 40-контактный список Raspberry Pi
Хотя стандартная распиновка для всех 40-контактных Raspberry Pi осталась прежней, вы можете найти обновленный список функций для Raspberry Pi 4 в официальном репозитории raspi-gpio на GitHub.
Если вы постоянно забываете какой пин что делает? Ниже вы можете распечатать распиновку Raspberry Pi B+, созданную Андреасом Гором (более известным как Splitbrain).
Его дизайн можно распечатать и разместить прямо на верхнюю часть платы, чтобы упростить запоминание всех контактов.
Используемые источники:
- https://habr.com/post/214839/
- https://kip-world.ru/pervoe-znakomstvo-s-gpio-v-raspberry-pi.html
- https://arduinoplus.ru/raspinovka-raspberry-pi-4-gpio/