QSG - quick start guide
SBC (single-board computer) - Одноплатный компьютер
GPIO (general-purpose input/output) - Интерфейс ввода/вывода общего назначения
Не забывайте о статическом электричестве - которое может быть опасным для микроэлектроники. Удостоверьтесь в правильности подключения схемы, используемых номиналов и т.д.
GPIO (general-purpose input/output) - Интерфейс ввода/вывода общего назначения.
GPIO подключены напрямую к "процессору" SoC (System-on-a-Chip - Система на кристалле), и неграмотное использование может вывести его из строя.
Большинство одноплатных компьютеров, кроме обычных двунаправленных Input/Output портов, имеют один или более интерфесов: UART, SPI, I²C/TWI, PWM (ШИМ), но не имеют ADC (АЦП).
GPIO - порты обычно могут быть сконфигурированны на ввод или вывод (Input/Output), состояние по умолчанию обычно INPUT.
Некоторые "GPIO"-порты - являются просто питающими портами 3.3V, 5V и GND, они не связаны с SoC и не могут использоваться как либо еще.
Порты с альтернативной функцией - могут быть мультиплексированны с одним из соответствующих ему интерфейсов.
Некоторые выводы могут иметь подтягивающие pullup и pulldown резисторы, на некоторых портах они могут быть включены по умолчанию.
Во время загрузки ОС и инициализации драйверов - состояния портов могут меняться.
Порты в режиме INPUT могут генерировать прерывания - по спаду, по фронту, по логическому уровню, по изменению сигнала и в асинхронном режиме по фронту и спаду.
Порты в режиме INPUT имеют входную фильтрацию на триггере Шмитта (преобразовывают аналоговый сигнал в цифровой с резкими переходами между состояниями).
Не забывайте, что у любого порта - есть "ограничения" по току и напряжению. А т.к. GPIO - это просто выводы чипа SoC - очень важно знать и соблюдать эти характеристики. Вы всегда можете узнать их в документации на SoC (но не всегда есть официальная публикация документации).
Например, GPIO на Raspberry Pi имеет следующие характеристики:
5 вольтовые выводы - могут давать ток до 300mA, т.к. они фактически не являются GPIO портами, а практически напрямую соединены с питанием всей платы (а не чипа SoC).
Как можно заметить, характеристики похожи на Raspberry Pi, в любом случае - мы имеем достаточно маленькие допустимые значения тока на GPIO и максимальное напряжение логических уровней: не более 3.3V.
Подробности уточняйте в спецификации к вашему SBC и используемому в его основе SoC.
При проектировании устройств в которых используется большое количество GPIO-выводов нужно обязательно делать развязку через дополнительные буферные схемы, преобразователи уровня напряжений (логических уровней), электронные ключи и т.д.
Рассмотрев электрические характеристики GPIO - можно приступить к сборке тестовой схемы.
Для демонстрации будем использовать только светодиод. Вы можете также подключить кнопку. И светодиод и кнопку необходимо подключать через токоограничивающий резистор.
В данном примере - подключаем светодиод (через резистор 360 Ом: 3.3В / 360Ом = 9мА) к 6 выводу GPIO на Orange Pi Zero. На представленной схеме распиновки (рисунок ниже). - он обозначен, как PA06 - обратите внимание, что номер GPIO - не обязательно должен соответствовать физическому номеру вывода (7 физ. вывод - считать слева направо от ключа), т.к. это прямой вывод с чипа SoC и нумерация соответствует чипу (существует формула для расчета номер GPIO). И, PA - в данном случае обозначает PORTA, но для нас это не имеет значение (можно даже найти распиновку, где будет указанно просто GPIO06).
PWM1 - дополнительная функция порта ШИМ (PWM) модуль.
(позиция буквы в алфавите - 1) * 32 + позиция вывода
PA06
PA = 1
P (PORT) - не учитывается
(1 - 1) * 32 + 06 = 0 * 32 + 06 = 06
Выводы GPIO не всегда распаяны на плате. На Orange Pi Zero - они обычно не распаяны (имеются только отверстия под штыревую линейку с шагом 2.54 мм).
Существует несколько способов обращения к GPIO:
Каждый из методов имеет свои преимущества и недостатки.
Философия операционных систем Unix гласит, что все есть файл. Это значит, что вся работа с этой операционной системой сводится к файлам. Поскольку Linux можно считать тоже потомком Unix, то эта концепция применима и здесь. Файлы это объекты, в которые мы записываем информацию, но кроме этих привычных нам понятий здесь есть файлы специального назначения - файлы устройств, файлы туннелей, сокетов и многое другое. Подробнее: https://losst.ru/tipy-fajlov-v-linux
Unix - торговая марка проприетарная ОС разработная 1970-х годах компанией AT&T. UNIX никогда не был программным обеспечением с открытым исходным кодом.
Linux - семейство Unix-подобных (используют сходные концепции и технологии c популярной тогда Unix) ОС на базе ядра Linux и включающих (теоретически не обязательно, но по факту) тот или иной набор утилит и программ проекта GNU (рекурсивный акроним GNU’s Not UNIX ). Существует даже целый фильм о истории GNU, Linux, Open Source и идеи появления свободного ПО: https://www.youtube.com/watch?v=n1F_MfLRlX0
История Unix (видео) или более сжатое изложение и логическое продолжение о Linux
Данный способ возможен благодаря наличию драйвера GPIO в ядре Linux.
Таким образом, мы можем управлять GPIO используя sysfs - виртуальная файловая система, находящаяся в памяти и доступная из пространства пользователя. Документация: https://www.kernel.org/doc/Documentation/gpio/sysfs.txt
sudo su
echo 6 > /sys/class/gpio/export
где, 6 - номер GPIO, к которому подключен светодиод.
echo out > /sys/class/gpio/gpio6/direction
echo 1 > /sys/class/gpio/gpio6/value
cat /sys/class/gpio/gpio6/value
echo 0 > /sys/class/gpio/gpio6/value
echo 6 > /sys/class/gpio/unexport
Где:
echo - команда оболочки Bash, которая просто выводит строку текста в терминал.
">"(знак больше) - перенаправление поток вывода (в данном случае с терминала в файл - перенаправляем вывод от команды echo)
cat - команда читает данные из файла (в данном случае) или стандартного ввода и выводит их на экран.
В Orange Pi Zero вы можете обращаться подобным образом и к светодиодам на плате (красный и зеленый), которые соответствуют GPIO17 и GPIO362
Но они имеют и свои собственные файлы:
echo 0 > /sys/class/leds/orangepi:green:pwr/brightness
echo 1 > /sys/class/leds/orangepi:red:status/brightness
Узнать необходимый порт - можно посмотрев на электрические принципиальные схемы. А номер GPIO вычислить по формуле (уже приводилась в данной статье). Или это можно найти в какой-либо другой "документации"
Таким образом, можно обращаться к GPIO, как к обычному текстовому файлу, что позволяет выполнять данные действия практически на любых языках программирования и сценарных языках, в том числе bash.
Будет работать на любом Linux-дистрибутиве и любом устройстве (GPIO имеют не только одноплатные компьютеры, но и некоторые роутеры и т.д. ) - если имеется драйвер GPIO в ядре Linux для данного SoC.
Существует некоторые готовые утилиты: https://github.com/torvalds/linux/tree/master/tools/gpio
Данный метод похож на разработку для микроконтроллеров. Необходимо изучать спецификацию на используемый чип (SoC) и обращаться к конкретным адресам для выполнения тех или иных действий. Для обращения к физическим адресам - необходимо обращаться к файлу /dev/mem
.
/dev/mem
- это символьный файл устройства, в котором отображается главная
память компьютера. Адресация байтов в mem точно та же, что и у физической памяти. Ссылки на несуществующие адреса приводят к ошибкам.
Подробнее можете ознакомиться в данной статье: https://habr.com/ru/company/dataart/blog/330536/
Существует несколько популярных библиотек для доступа к GPIO на разных языках программирования, некоторые из них:
WiringPi - это библиотека для доступа к GPIO-контактам чипа BCM2835, используемого в Raspberry Pi. Написана на языке C, выпущена под лицензией GNU LGPLv3 (отсутствует обязательное требование предоставления исходного кода) и пригодна для использования в C, C++ и RTB (BASIC), а также в других языках (но для этого нужны специальные функции-обертки). Библиотека WiringPi создавалась с прицелом на схожесть с языком Wiring, который используется в Arduino.
WiringPi была портирована на другие платформы, однако автор (Gordon Henderson) оригинальной WiringPi поддержкой этих версий не занимается.
В комплекте с WiringPi идет devLib – это набор драйверов, обеспечивающих доступ к некоторым популярным периферийным устройствам. Среди поддерживаемых устройств: LCD-дисплеи (на базе чипов Hitachi HD44780U) и графические дисплеи (например, обычные дисплеи с разрешением 128х64, работающие на чипе-драйвере 12864H). Также поддерживаются DS1302 (чип, работающий как часы реального времени), датчики на базе чипов Maxdetect (например, RHT003), платы Gertboard/PiFace и т.д.
1) Найдите необходимую библиотеку для вашей версии: WiringOP-Zero;
2) Скачайте библиотеку (будем использовать git):
3) Копируем ссылку для клонирования и выполняем команду:
git clone https://github.com/xpertsavenue/WiringOP-Zero.git
Если используете Armbian Bionic - git должен быть уже установлен. Иначе можете установить его сами.
4) После клонирования появиться каталог "WiringOP-Zero", переходим в него и выполняем установку библиотеки:
cd WiringOP-Zero
chmod +x ./build
sudo ./build
chmod - изменяет права файла ("+x" - даем право на выполнение)
build - сценарий автоматической сборки (компиляция, установка и т.д.)
5) Вместе с библиотекой - установиться утилита gpio:
gpio readall
gpio readall - команда выводит таблицу соответствия выводов GPIO.
1) Перейдем в директорию пользователя и создадим файл "blink.c"
cd
nano blink.c
2) Вставим следующий код:
/*
* Тестовая программа WiringPi на Orange Pi Zero
*/
#include <stdio.h>
//Подключите библиотеку (заголовочный файл) WiringPi
#include <wiringPi.h>
//Укажите порт GPIO соответствующий столбцу wPi
#define LED 30
int main (void)
{
printf ("Orange Pi: Status Led blink\n") ;
wiringPiSetup (); // Инициализация GPIO
pinMode (LED, OUTPUT); //PIN OUTPUT
while (1)
{
digitalWrite (LED, HIGH); // PIN ON
delay (500); // mS
digitalWrite (LED, LOW); // PIN OFF
delay (500);
}
return 0;
}
3) Компилируем:
gcc -Wall blink.c -o blink -lwiringPi -lpthread
4) Запускаем программу от root-пользователя:
sudo ./blink
5) Можете ознакомиться с примерами в директории WiringOP-Zero/examples/ и документацией на сайте WiringPi. Так же можете посмотреть код в директориях: WiringOP-Zero/wiringPi/ и WiringOP-Zero/devLib/