GPIO – интерфейс ввода/вывода общего назначения (general-purpose input/output). В Orange PI PC 2 используется микроконтроллер AllWiner H5 Quad-core (ARM Cortex-A53 64bit). Часть портов этого микроконтроллера соединены с GPIO (интерфейс 40 pin платы Orange Pi). Этими портами можно управлять программно. В этой инструкции будет подробно описано управление GPIO (портами микроконтроллера ARM Cortex-A53) с помощью командной строки Bash через системное окружение в файловой системе sysfs.

Для управления GPIO через SYSFS в дистрибутиве LINUX ARMBIAN Ubuntu 16.04 для Orange Pi PC 2 имеются все средства, что не гарантировано в других дистрибутивах. Все изложенное далее проверено на этом дистрибутиве.

Прежде всего, необходимо изучить распиновку GPIO на вашей плате микрокомпьютера. Для этого, воспользуемся альбомом схем от производителя платы. Скачать схему Вы можете на странице загрузки Orange Pi проекта. Рядом с первой ножкой GPIO разъема на плате микрокомпьютера Orangr Pi белой краской нарисован треугольник. Мы составили таблицу с распиновкой так, как нам было удобно подключать к GPIO на плате микрокомпьютера Orange Pi провода. Плата сама занимала на столе положение первой ножкой GPIO к нам, поэтому и на таблице мы разместили первую ножку внизу справа. Надеемся и Вам этой таблицей будет удобно пользоваться.

Распиновка GPIO Orange Pi PC 2 (разъем 40 pin)

ФункцииПортgpioXpin   pingpioXПортФункции
UART1_RX/PG_EINT7 PG7 199
40
39
    GND
UART1_TX/PG_EINT6 PG6 198
38
37
107 PD11 RGMII_NULL/MII_CRS/RMII_NULL
UART1_CTS/PG_EINT9 PG9 201
36
35
10 PA10 SIM_DET/PA_EINT10
GND    
34
33
9 PA9 SIM_RST/PA_EINT9
UART1_RTS/PG_EINT8 PG8 200
32
31
8 PA8 SIM_DATA/PA_EINT8
GND    
30
29
7 PA7 SIM_CLK/PA_EINT7
PCM0_SYNC/TWI1_SCK/PA_EINT18 PA18 18
28
27
19 PA19 PCM0_CLK/TWI1_SDA/PA_EINT19
PCM0_DIN/SIM_VPPPP/PA_EINT21 PA21 21
26
25
    GND
SPI1_CS/UART3_TX/PA_EINT13 PA13 13
24
23
14 PA14 SPI1_CLK/UART3_RX/PA_EINT14
UART2_RTS/JTAG_DO0/PA_EINT2 PA2 2
22
21
16 PA16 SPI1_MISO/UART3_CTS/PA_EINT16
GND    
20
19
15 PA15 SPI1_MOSI/UART3_RTS/PA_EINT15
NAND_RB1 PC7 71
18
17
    VCC3V3-EXT
NAND_CE0 PC4 68
16
15
3 PA3 UART2_CTS/JTAG_DI0/PA_EINT3
GND    
14
13
0 PA0 UART2_TX/JTAG_MS0/PA_EINT0
RGMII_NULL/MII_TXERR/RMII_NULL PD14 110
12
11
1 PA1 UART2_RX/JTAG_CK0/PA_EINT1
NAND_RB0/SDC2_CMD PC6  70
10
9
    GND
NAND_RE/SDC2_CLK PC5 69
8
7
6 PA6 SIM_PWREN/PWM1/PA_EINT6
GND    
6
5
11 PA11 TWI0_SCK/DI_TX/PA_EINT11
DCIN-5V    
4
3
12 PA12 TWI0_SDA/DI_RX/PA_EINT12
DCIN-5V    
2
1
    VCC3V3-EXT

ИТОГО: 28 портов, чуть больше чем на Arduino Uno/Nano. На принципиальной схеме видно, что порты TWI0 и TWA1 (pin 3, 5, 27, 28) нагружены на землю резисторами по 2 кОм, это нужно учитывать.

Допустим нам нужно управлять 21-й ножкой разъема GPIO на плате Orange Pi PC 2. К 21-й ножке подключен порт PA16 микроконтроллера. Выполним, обязательно под root, команду:

root@orangepipc2:~# echo 16 > /sys/class/gpio/export

В каталоге /sys/class/gpio появилась папка gpio16. Посмотрим структуру этой папки.

root@orangepipc2:~# tree /sys/class/gpio/gpio16
/sys/class/gpio/gpio16
├── active_low
├── device -> ../../../gpiochip1
├── direction
├── edge
├── power
│   ├── autosuspend_delay_ms
│   ├── control
│   ├── runtime_active_time
│   ├── runtime_status
│   └── runtime_suspended_time
├── subsystem -> ../../../../../../../class/gpio
├── uevent
└── value

Файлы direction и value содержат значения параметров, которые определяют состояниe порта (в частности PA16). По умолчанию, в direction записано in, то есть порт работает как вход, а value содержит значение, соответствующее состоянию порта (0 или 1). Настроим порт как выход подадим на него 1 и зажжем на выходе светодиод.

echo out > /sys/class/gpio/gpio16/direction
echo 1 > /sys/class/gpio/gpio16/value

Так же, как мы включили драйвер порта, мы его можем и выключить:

root@orangepipc2:~# echo 16 > /sys/class/gpio/unexport

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

#!/bin/bash

## gpio0 PA0 pin 13
#echo 0 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio0/direction
#echo 1 > /sys/class/gpio/gpio0/value

## gpio1 PA1 pin11
#echo 1 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio1/direction
#echo 1 > /sys/class/gpio/gpio1/value

## gpio2 PA2 pin22
#echo 2 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio2/direction
#echo 1 > /sys/class/gpio/gpio2/value

## gpio3 PA3 pin15
#echo 3 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio3/direction
#echo 1 > /sys/class/gpio/gpio3/value

## gpio6 PA6 pin7
#echo 6 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio6/direction
#echo 1 > /sys/class/gpio/gpio6/value

## gpio7 PA7 pin29
#echo 7 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio7/direction
#echo 1 > /sys/class/gpio/gpio7/value

## gpio8 PA8 pin31
#echo 8 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio8/direction
#echo 1 > /sys/class/gpio/gpio8/value

## gpio9 PA9 pin33
#echo 9 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio9/direction
#echo 1 > /sys/class/gpio/gpio9/value

## gpio10 PA10 pin35
#echo 10 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio10/direction
#echo 1 > /sys/class/gpio/gpio10/value

## gpio11 PA11 pin5
#echo 11 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio11/direction
#echo 1 > /sys/class/gpio/gpio11/value

## gpio12 PA12 pin3
#echo 12 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio12/direction
#echo 1 > /sys/class/gpio/gpio12/value

## gpio13 PA13 pin24
#echo 13 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio13/direction
#echo 1 > /sys/class/gpio/gpio13/value

## gpio14 PA14 pin23
#echo 14 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio14/direction
#echo 1 > /sys/class/gpio/gpio14/value

## gpio15 PA15 pin19
#echo 15 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio15/direction
#echo 1 > /sys/class/gpio/gpio15/value

## gpio16 PA16 pin21
#echo 16 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio16/direction
#echo 1 > /sys/class/gpio/gpio16/value

## gpio18 PA18 pin28
#echo 18 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio18/direction
#echo 1 > /sys/class/gpio/gpio18/value

## gpio19 PA19 pin27
#echo 19 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio19/direction
#echo 1 > /sys/class/gpio/gpio19/value

## gpio21 PA21 pin26
#echo 21 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio21/direction
#echo 1 > /sys/class/gpio/gpio21/value

## gpio68 PC4 pin16
#echo 68 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio68/direction
#echo 1 > /sys/class/gpio/gpio68/value

## gpio69 PC5 pin8
#echo 69 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio69/direction
#echo 1 > /sys/class/gpio/gpio69/value

## gpio70 PC6 pin10
#echo 70 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio70/direction
#echo 1 > /sys/class/gpio/gpio70/value

## gpio71 PC7 pin18
#echo 71 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio71/direction
#echo 1 > /sys/class/gpio/gpio71/value

## gpio107 PD11 pin37
#echo 107 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio107/direction
#echo 1 > /sys/class/gpio/gpio107/value

## gpio110 PD14 pin12
#echo 110 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio110/direction
#echo 1 > /sys/class/gpio/gpio110/value

## gpio198 PG6 pin38
#echo 198 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio198/direction
#echo 1 > /sys/class/gpio/gpio198/value

## gpio199 PG7 pin40
#echo 199 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio199/direction
#echo 1 > /sys/class/gpio/gpio199/value

## gpio200 PG8 pin32
#echo 200 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio200/direction
#echo 1 > /sys/class/gpio/gpio200/value

## gpio201 PG9 pin36
#echo 201 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio201/direction
#echo 1 > /sys/class/gpio/gpio201/value

Нужные строчки раскомментируйте. Файлу дайте права на выполнение.