Pi gpio: Raspberry Pi GPIO Pinout

Содержание

GPIO-пины Raspberry Pi и их использование из Python

В уже довольно не новом посте, посвященном Raspberry Pi, это устройство рассматривалось исключительно, как маленький и очень дешевый компьютер. Бесспорно, Raspberry Pi им и является. Но, помимо этого, у Raspberry Pi есть еще и 26 пинов GPIO (General Purpose Input Output), что очень кстати в свете моего недавнего увлечения электроникой. Почему? Давайте разберемся.

Отмечу, что все написанное ниже справедливо для Raspberry Pi 2 Model B. Если у вас другая малина, то расположение пинов и другие детали могут отличаться. Поэтому обязательно сверьтесь с официальной документацией. В качестве операционной системы я использовал релиз Raspbian от 2016-09-28, который можно скачать здесь. Более поздние релизы мне не нравятся, потому что из соображений безопасности в них решили по умолчанию отключать SSH. Что довольно смешно, потому что в этот же релиз решили включать Adobe Flash.

Итак, расположение пинов описано на официальном сайте:

На этой картинке явно изображен один из углов устройства (слева вверху), поэтому по ошибке пронумеровать пины вверх ногами довольно сложно. Очень интересно, что курили ребята, решившие

так нумеровать пины. Если кто-нибудь знает ответ, расскажите, пожалуйста, в комментариях. Чтобы окончательно всех запутать, они решили сделать две нумерации. Выше представлена «логическая» нумерация. Под этими номерами пины видны операционной системе. Есть еще и «физическая» нумерация, про которую можно прочитать по приведенной выше ссылке. В рамках данной заметки используется исключительно «логическая» нумерация, изображенная на картинке.

Допустим, мы хотим программно управлять напряжением, подаваемым на 2-й пин. Проще всего это сделать через sysfs.

Первым делом «экспортируем» пин, без этого шага им не получится управлять:

echo 2 > /sys/class/gpio/export

Делаем его out-пином, то есть, он будет либо подавать, либо не подавать напряжение в 3.3 вольта:

echo out > /sys/class/gpio/gpio2/direction

Подаем напряжение:

echo 1 > /sys/class/gpio/gpio2/value

Перестаем подавать напряжение:

echo 0 > /sys/class/gpio/gpio2/value

Узнаем, подается ли сейчас напряжение:

cat /sys/class/gpio/gpio2/value

По завершении работы пину можно сделать unexport:

echo 2 > /sys/class/gpio/unexport

Есть мнение, и не только мое, что 3.3 вольта — как-то маловато. Кроме того, было бы неплохо не только включать и выключать напряжение, но и изменять его в некотором диапазоне. Увы, насколько мне известно, ничего этого Raspberry Pi не умеет. Поговаривают, что умеет Arduino, но опыта использования этого устройства на момент написания этих строк у меня нет.

Можете подключить пин к цепи из светодиода и резистора с сопротивлением 470 Ом и проверить, что описанным выше образом светодиод можно включать и выключать. Для земли (то есть, минуса) можно использовать любой пин, изображенный на приведенной выше схеме черным цветом. Понятно, что работу с sysfs можно автоматизировать на любом языке программирования по вкусу. Можно подключить сразу три светодиода разного цвета и получить программно управляемый светофор. Собственно, это я и сделал, воспользовавшись пинами 3 и 4.

Важно! После загрузки Raspberry Pi некоторые пины по дэфолту могут подавать напряжение. Возможно, это не то, чего вы хотите для вашей цепи. У меня по дэфолту ток был на пинах 2, 3 и 14. Я бы советовал перепроверить эту информацию на вашей конкретной Raspberry Pi и конкретной версии Raspbian. Имейте также в виду, что написанная вами же программа может оставить пины в неизвестном состоянии (например, если вы прибьете ее kill’ом). Наверное, в общем случае лучше всего проектировать цепь так, чтобы она была готова к любым комбинациям наличия или отсутствия тока на используемых вами пинах.

До сих пор были рассмотрены out-пины. Они как бы «пишут» на макетную плату, но не позволяют узнать ее текущее состояние. Например, нажата ли в настоящих момент какая-то кнопка. Даже если цепь разомкнута, out-пины об этом не знают. Поэтому есть еще и in-пины.

Экспортируем 5-ый пин и делаем его in-пином:

echo 5 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio5/direction

Этот пин я подключил к цепи из резистора сопротивлением 10 кОм и кнопки, которая в нажатом состоянии замыкает цепь, а в отпущенном размыкает.

«Прочитать» кнопку можно так:

cat /sys/class/gpio/gpio5/value

Считывается 1, если кнопка не нажата, то есть, цепь разомкнута, и 0, если кнопка нажата, то есть, цепь замкнута.

В итоге получилась такая конструкция (иллюстрация про кнопку взята отсюда):

А вот и скрипт на Python, который при нажатии на кнопку тушит текущий светодиод и зажигает следующий за ним:

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

# Use «logical» pin numbers
GPIO.setmode(GPIO.BCM)

# Disable «This channel is already in use» warnings

GPIO.setwarnings(False)

# Setup LED’s: 2 — green, 3 — yellow, 4 — red
for i in range(2,5):
    GPIO.setup(i, GPIO.OUT)
    GPIO.output(i, False)

current_led = 2
GPIO.output(current_led, True)

# Prepare to read button state
BUTTON = 5
PRESSED_CODE = 0
GPIO.setup(BUTTON, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while True:
#    GPIO.wait_for_edge(BUTTON, GPIO.FALLING)
#    print(«Button pressed»)
#    GPIO.wait_for_edge(BUTTON, GPIO.RISING)
#    print(«Button released»)
    time.sleep(0.05)
    if GPIO.input(BUTTON) == PRESSED_CODE:
        GPIO.output(current_led, False)
        current_led = max(2, (current_led + 1) % 5)
        GPIO.output(current_led, True)
        time.sleep(0.1)

Опытным путем удалось подобрать временные задержки, при которых светодиоды переключаются в точности так, как ожидает пользователь. Закомментированный в приведенном коде метод wait_for_edge на практике работает совершенно непредсказуемо. Например, если зажать кнопку на несколько секунд, то последующие нажатия будут приводить к зажиганию светодиодов в каком-то почти случайном порядке.

Насколько мне известно, это по большому счету все, что можно сделать с помощью GPIO на Raspberry Pi. Поправьте, если я не прав.

Дополнение: В комментариях подсказывают, что малина также умеет и ШИМ. Еще один пример использования GPIO в одноплатном компьютере описывает заметка Реверс-инжиниринг роутера на примере GL.iNet GL-AR750.

Метки: Linux, Python, Электроника.

Использование GPIO из Python на Raspberry Pi / Хабр

Делюсь своим опытом, полученным при изучении задачи вынесенной в заголовок. В статье рассматриваются два варианта работы, которые можно использовать в 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()

Raspberry Pi: установка библиотеки RPi.GPIO для python

Одно из главных преимуществ Raspberry Pi  — это наличие выводов общего назначения (General Purpose Iinput/Outputs). GPIO — это группа контактов, которыми можно управлять с помощью программы. Причем управление это может быть совсем простым, например, включение/выключение светодиода. Либо весьма сложным — обмен данными с периферийными устройствами по специализированным протоколам.

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

В этой статье я расскажу как установить на Raspberry Pi библиотеку управления GPIO для python — RPi.GPIO, и приведу несколько простых примеров работы с ней.

1. Загрузка и подготовка библиотеки RPi.GPIO

Первое что мы сделаем — скачаем архив с библиотекой с официального сайта:

ссылка для скачивания RPi.GPIO

Ссылка ведет на страницу с разными версиями библиотеки. Выбираем самый свежий архив. На момент написания статьи это был — RPi.GPIO-0.6.3.tar.gz

По-умолчанию, штатный браузер Chromium скачает библиотеку в папку /home/pi/Downloads. Зайдем в эту папку с помощью проводника:

Теперь жмем правую кнопку мыши на архиве и выбираем пункт Extract Here.

Этим самым мы просим разархивировать библиотеку в ту же папку, в которой находится сам архив. В результате рядом с архивом появится папка RPi.GPIO-0.6.3.

2. Установка дополнительного пакета для python

Перед тем, как установить библиотеку RPi.GPIO, нам потребуется дополнительный пакет python-dev. Для этого запустим терминал (черная иконка на верхней панели рабочего стола) и запустим в нем следующую команду:

sudo apt-get install python-dev

На вопрос «Do you want to continue? [Y/n]» пишем символ «Y» и жмем Enter.

В результате появится отчет об успешной установке. Выглядит он так:

3. Установка библиотеки RPi.GPIO

Теперь приступим к установке самой библиотеки для работы с GPIO. Не выходя из терминала, переходим в разархивированную ранее папку:

cd /home/pi/Downloads/RPi.GPIO-0.6.3

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

python setup.py build

В результате получим примерно такой отчет:

Далее запускаем команду установки библиотеки. Нужно выполнить её с правами администратора, поэтому вначале добавляем директиву sudo:

sudo python setup.py install

Результат выполнения:

Ну вот и готово! Приступим к сборке стенда и составлению первой программы, которая будет управлять состоянием светодиода.

4. Подключение светодиода к Raspberry Pi

Разъем GPIO у Raspberry Pi имеет два типа нумерации. Первый тип — это последовательный номер контакта. Второй тип — BCM, соответствует выводам микропроцессора. Оба эти нумерации представлены на картинке.

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

Анод светодиода (длинная ножка) соединим с выводом GPIO23 через резистор 200 Ом, а катод с землей (GND). Хорошо бы сначала вспомнить урок про макетные платы.

Теперь перейдем к написанию программы.

5. Программа для управления с помощью RPi.GPIO

В Raspbian установлены две версии python: 2 и 3. Поскольку мы установили библиотеку только для python 2, будет пользоваться именно это версией.

Открываем среду разработки Python 2 (IDLE). В меню появившегося окна выбираем New File.

Откроется окно редактора. В этом окне записываем программу, которая включит светодиод на 5 секунд, а затем погасит его.

from RPi import GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)

GPIO.output(23, True)
sleep(5)
GPIO.output(23, False)

GPIO.cleanup()

Программу желательно сохранить, например, в домашнюю папку. Делается это с помощью пункта меню File/Save As…

Наконец, запускаем программу через меню Run/Run Module или с помощью клавиши F5.

Заключение

Этот пример показывает, как легко управлять простыми исполнительными устройствами с помощью библиотеки RPi.GPIO. Вместо светодиода можно поставить, например, мощное реле и управлять включением уличного освещения, или, скажем, чайником. Однако, следует помнить, что функционал этой библиотеки весьма ограничен и для управления устройствами через интерфейсы I2C и SPI потребуются дополнительные специализированные библиотеки.

Вконтакте

Facebook

Twitter

Работа с GPIO · Clover

GPIO (General-Purpose Input/Output) – это тип пинов на Raspberry Pi, напряжение на которых можно программно подавать и измерять. Также на некоторых пинах реализован аппаратный ШИМ (PWM). Интерфейс GPIO может быть использован для управления различной периферией: светодиодами, электромагнитами, электромоторами, сервоприводами и т. д.

Используйте распиновку, чтобы понять, какие из пинов на Raspberry Pi поддерживают GPIO и ШИМ.

Для того, чтобы не создавалось конфликтов при использовании портов GPIO в образе закрыт доступ для портов 0, 1, 2, 3, 14, 15, на которые выведены интерфейсы подключения I2C и UART.

Для работы с GPIO на образе для RPi предустановлена библиотека pigpio. Чтобы взаимодействовать с этой библиотекой, запустите соответствующий демон:

sudo systemctl start pigpiod.service

Для включение автозапуска демона pigpiod используйте команду:

sudo systemctl enable pigpiod.service

При одновременном использовании pigpiod и LED-ленты возможны конфликты. Для подключения ленты используйте пин GPIO21. На версиях образа ниже 0.17 измените в файле /lib/systemd/system/pigpiod.service строку запуска сервиса на ExecStart=/usr/bin/pigpiod -l -t 0 -x 0x0FFF3FF0.

Пример работы с библиотекой:

import time
import pigpio


pi = pigpio.pi()


pi.set_mode(11, pigpio.OUTPUT)


pi.write(11, 1)

time.sleep(2)


pi.write(11, 0)




pi.set_mode(12, pigpio.INPUT)


level = pi.read(12)

Для определения номера пина используйте распиновку Raspberry Pi.