Управление GPIO Raspberry Pi из Bash

Разъем GPIO (сверху)Порт  GPIO - одна из главных фишек Raspberry Pi. Но по умолчанию на пустой системе им нельзя управлять, например, из Bash-скриптов. В этой статье я, на примере Raspbian, разберу установку и использование библиотеки Wiring Pi.

При помощи Wiring Pi мы можем выводить сигналы на порт GPIO и считывать их с него, используя при этом только командную строку. Так же эту библиотеку можно подключить в различных языках программирования (я пока что пробовал только C++).

Установка

1. Подготовка системы

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

sudo apt-get update #обновляет базу данных пакетов
sudo apt-get upgrade #обновляет сами пакеты

2. Git

Данная библиотека отсутствует в репозиториях Raspbian, поэтому нам нужно скачать ее исходный код из официального репозитория git.

Для этого нам понадобится, собственно, git. Чтобы проверить, установлен ли он, нужно ввести команду:

git --version

Если вывод данной команды примерно такой,

git version 1.7.10.4

то git установлен и ничего делать не нужно.

Иначе нужно установить его командой:

sudo apt-get install git

3. Получение исходного кода

Далее нужно получить исходный код библиотеки. Для этого нам потребуется всего одна команда:

git clone git://git.drogon.net/wiringPi

Через несколько секунд в текущей директории появится новая директория wiringPi, после чего можно приступать к установке.

4. Сборка и установка

Для установки достаточно ввести всего две команды:

cd wiringPi #переходим в директорию с исходниками
./build #запускаем установку

Сборка может занять несколько минут на особо загруженной Raspberry Pi, но обычно процесс занимает не очень много времени.

Примечание: так как при установке не используется пакетный менеджер, удалить или обновить библиотеку можно только при помощи скрипта build, лежащего в директории wiringPi. Рекомендую сохранить эту директорию на случай, если вам понадобится вычистить файлы библиотеки.

5. Проверка работы

Для того, чтобы проверить, заработала ли библиотека, можно воспользоваться следующими командами:

gpio -v #проверка версии
gpio readall #проверка состояния всех выводов GPIO

Пример вывода для gpio -v:

gpio version: 2.13
Copyright (c) 2012-2013 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

This Raspberry Pi is a revision 2 board.

И пример вывода для gpio readall:

+----------+-Rev2-+------+--------+------+-------+
| wiringPi | GPIO | Phys | Name   | Mode | Value |
+----------+------+------+--------+------+-------+
|      0   |  17  |  11  | GPIO 0 | OUT  | Low   |
|      1   |  18  |  12  | GPIO 1 | IN   | Low   |
|      2   |  27  |  13  | GPIO 2 | IN   | Low   |
|      3   |  22  |  15  | GPIO 3 | IN   | Low   |
|      4   |  23  |  16  | GPIO 4 | IN   | Low   |
|      5   |  24  |  18  | GPIO 5 | IN   | Low   |
|      6   |  25  |  22  | GPIO 6 | IN   | Low   |
|      7   |   4  |   7  | GPIO 7 | IN   | Low   |
|      8   |   2  |   3  | SDA    | IN   | High  |
|      9   |   3  |   5  | SCL    | IN   | High  |
|     10   |   8  |  24  | CE0    | IN   | Low   |
|     11   |   7  |  26  | CE1    | IN   | Low   |
|     12   |  10  |  19  | MOSI   | IN   | Low   |
|     13   |   9  |  21  | MISO   | IN   | Low   |
|     14   |  11  |  23  | SCLK   | IN   | Low   |
|     15   |  14  |   8  | TxD    | OUT  | Low   |
|     16   |  15  |  10  | RxD    | ALT0 | High  |
|     17   |  28  |   3  | GPIO 8 | ALT2 | Low   |
|     18   |  29  |   4  | GPIO 9 | ALT2 | Low   |
|     19   |  30  |   5  | GPIO10 | ALT2 | Low   |
|     20   |  31  |   6  | GPIO11 | ALT2 | Low   |
+----------+------+------+--------+------+-------+

6. Обновление или удаление Wiring Pi (дополнительно)

Обновить установленную библиотеку можно при помощи трех команд. При этом нужно находиться в директории с wiringPi.

cd wiringPi
git pull origin #получаем обновления для библиотеки
./build #устанавливаем новую версию

Для удаления библиотеки с полной вычисткой всех ее файлов, нужно опять же воспользоваться скриптом build:

cd wiringPi
./build uninstall #запускаем удаление

Использование

1. Описание команд

Все управление портом GPIO производится при помощи команды gpio и ее параметров. Вот описание самых часто используемых параметров для прямого доступа к порту:
1) gpio readall - просмотр состояния всех выводов (режим, значение и т.д.). Пример вывода есть выше в разделе "Проверка работы".
2) gpio mode номер_вывода режим - установка режима IO для одного вывода порта. Доступные режимы: in, out, pwm, clock, up, down, tri.
3) gpio write номер_вывода значение - запись значения на один из выводов. Записывать значения на вывод можно только, если он находится в режиме out.
4) gpio read номер_вывода - чтение значения с определенного вывода. Можно считывать как с выводов в режиме in, так и с выводов в режиме out.
5)
gpio reset - полный сброс порта. При этом все выводы порта обнуляются и возвращаются к состоянию, в котором они были после включения Raspberry Pi.

Примечание: номер вывода можно узнать при помощи команды gpio readall. Номер указан в самой левой колонке.

2. Названия выводов и распиновка GPIO

Wiring Pi использует свою нумерацию выводов GPIO, отличающуюся от официальной. Для сравнения, вот две распиновки: официальная и вариант, использующийся в Wiring Pi.

GPIOWiringPi GPIOСам GPIO

3. Вывод сигнала

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

gpio mode 0 out #переводим вывод 0 в режим OUT
gpio write 0 1 #записываем логическую единицу

После этого на выводе 0 появится напряжение 3.3 вольта.

Точно так же можно его выключить:

gpio write 0 0 #записываем логический ноль

4. Чтение сигнала

Каждый вывод работает в обе стороны, поэтому мы можем считывать сигналы. Тут нужно учитывать то, с чего поступает сигнал. Поэтому я разберу два варианта: сигнал с кнопки и сигнал из какого-либо устройства.

Чтение сигнала с кнопки, подключенной к GND

Чтобы считать кнопку, замыкающую вывод на GND, нам нужно перевести вывод в режим IN, а также подключить подтягивающий резистор, который даст напряжение на этот вывод. Опять же в качестве примера возьму вывод 0:

gpio mode 0 in #переводим вывод в режим IN
gpio mode 0 up #подключаем подтягивающий резистор
gpio read 0 #считываем значение с вывода 0

Как это работает: при нажатии на кнопку, она замыкает вывод на GND, из-за чего напряжение на нем падает до 0 и, следовательно, при считывании этого вывода у нас будет логический ноль. Когда кнопка не нажата, напряжение на выводе равно 3.3 вольта, а при считывании мы получим логическую единицу.

Чтение сигнала с другого устройства или кнопки, подключенной к 3.3В

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

gpio mode 0 in #переводим вывод в режим IN
gpio mode 0 down #отключаем подтягивающий резистор
gpio read 0 #считываем значение с вывода 0

Как это работает: при нажатии кнопки или подаче сигнала с другого устройства, напряжение на выводе поднимается до 3.3 вольт, что при считывании дает логическую единицу. Когда сигнал на выводе отсутствует, напряжение на нем равно 0, а при считывании мы получаем логический ноль.

Внимание!!! Нельзя подавать на выводы GPIO напряжение больше 3.3 вольт! Данный порт может работать только с уровнями 0-3.3, а использование уровней 0-5 может привести к выходу порта из строя! Будьте осторожны и проверяйте все устройства, которые подключаете.

Заключение

Библитека Wiring Pi очень полезна для управления GPIO прямо из консоли и написания легких bash-скриптов для работы с портом. Только при помощи этой библиотеки возможно за пару команд без всяких компиляций и даже прав root получить доступ к любому пину GPIO, что иногда бывает очень удобно.

Сейчас с помощью bash-скрипта и WiringPi я могу управлять кулером, охлаждающем Raspberry Pi. Кулер включается автоматически при достижении определенной температуры и не шумит, когда не надо. Если кому-нибудь нужен пример такого скрипта, могу выложить. Там всего несколько строк.

Как обычно, половину всего материала я писал по памяти, поэтому возможны некоторые неточности. Если вы заметили их, прошу сообщить мне в комментариях.

Спасибо за внимание :3