Wiring Pi - библиотека работы с GPIO. Часть 1
- 
Данная статья рассчитана на пользователей, имеющих представления об основах GPIO Raspberry Pi. Если эта тема для вас новая, то перед прочтением статьи рекомендую ознакомится с другими статьями для начинающих на тему GPIO - их можно найти в разделе "Документация" В настоящее время самой популярной библиотекой для работы с GPIO на Raspberry Pi стала wiringPi Установка wiringPi- Если у вас нет утилиты git для работы с github-репозиториями, то устанавливаем:
 sudo apt-get install git-core- Скачиваем исходники библиотеки из репозитория -
 git clone git://git.drogon.net/wiringPi!!!UPD: автор библиотеки прекратил её поддержку и разработку. Крайняя версия WiringPi от Гордона Хендерсона не работает нормально на Raspberry Pi 4. Поэтому следует использовать версию библиотеки, которая разрабатывается сообществом: git clone https://github.com/WiringPi/WiringPi.git- Устанавливаем:
 cd wiringPi ./buildИспользование 
 После того, как библиотека wiring Pi установлена, вы можете использовать её в своих проектах. Пример:#include <wiringPi.h> //подключаем заголовочный файл библиотеки int main (void) { wiringPiSetup () ; //инициализируем библиотеку pinMode (0, OUTPUT) ; for (;;) { digitalWrite (0, HIGH) ; delay (500) ; digitalWrite (0, LOW) ; delay (500) ; } return 0 ; }Компилируем исходник: gcc -Wall -o example example.c -lwiringPiЗапускаем: sudo ./exampleБиблиотека должна быть обязательно инициализирована вызовом функции wiringPiSetup() После этого можно использовать библиотечные функции Основные библиотечные функции 
 Если библиотека была инициализирована функцией wiringPiSetup() , то в функции следует передавать "виртуальный" номер пина. Таблицу соответствия "виртуальных" пинов (колонка wPi) реальным можно получить при помощи команды gpio readall (утилита gpio устанавливается автоматически вместе с библиотекой WiringPi)
  void pinMode (int pin, int mode) 
 Устанавливает режим работы пина. Доступные значения параметра mode: INPUT, OUTPUT, PWM_OUTPUT, GPIO_CLOCK. Примечание: режим работы PWM_OUTPUT поддерживается только пином BCM_GPIO 18, режим GPIO_CLOCK поддерживается только пином BCM_GPIO 4void pullUpDnControl (int pin, int pud) 
 Включает внутренние подтягивающие резисторы для пина, работающего в режиме INPUT. Возможные значения PUD_OFF (подтягивающие резисторы отключены), PUD_DOWN (подтяжка к земле), PUD_UP (подтяжка к 3.3v)/Сопротивление подтягивающих резисторов на Raspberry Pi составляет около 50KОмvoid digitalWrite (int pin, int value) 
 Устанавливает высокий (value=1)/низкий уровень(value=0) на пине, работающем в режиме OUTPUTvoid pwmWrite (int pin, int value) Параметр value задаёт коэффициент заполнения импульса (про ШИМ и что такое заполнение импульса можно прочитать в этой статье - https://raspberrypi.ru/50-gpio-dlya-chaynikov-chast-4), value принимает значения от 0 (0% заполнения импульса) до 1024 (100% заполнение импульса). Аппаратная ШИМ поддерживается только пином BCM_GPIO 18 int digitalRead (int pin) 
 Считывание состояния пина. В зависимости от логического уровня функция возвращает 0 или 1analogRead (int pin) 
 Функция считывает значение АЦП. Поскольку на Raspberry Pi нет встроенного АЦП, то перед вызовом функции в программе необходимо инициализировать внешний АЦП (пример использования можно найти в этой статье - https://raspberrypi.ru/571-poluchenie-dannyh-s-analogovyh-datchikov-podklyuchennyh-k-raspberry-pi)analogWrite (int pin, int value) 
 Функция записывает значение в АЦП.Временные функцииunsigned int millis (void) Возвращает время (в миллисекундах) прошедшее с момента вызова функции инициализации (wiringPiSetup) библиотеки WiringPi. Значение сбрасывается через 49 дней unsigned int micros (void) 
 Возвращает время (в микросекундах) прошедшее с момента вызова функции инициализации (wiringPiSetup) библиотеки WiringPi. Значение сбрасывается приблизительно через 71 минутуvoid delay (unsigned int howLong) 
 Приостанавливает выполнение программы на период времени, заданный в параметре howLong (задаётся в миллисекундах)void delayMicroseconds (unsigned int howLong) 
 Приостанавливает выполнение программы на период времени, заданный в параметре howLong (задаётся в микросекундах)Прерывания*int wiringPiISR (int pin, int edgeType, void (function)(void)) 
 Регистрирует функцию, которая будет выполнена при наступлении условия прерывания. Условие прерывания (параметр edgeType) может принимать следующие значения:INT_EDGE_FALLING (прерывание при смене уровня на пине с высокого на низкий) 
 INT_EDGE_RISING (прерывание при смене уровня на пине с низкого на высокий)
 INT_EDGE_BOTH (прерывание при любой смене уровня на пине)
 INT_EDGE_SETUP
 При условии INT_EDGE_SETUP не будет происходить инициализации пина - подразумевается, что он уже был настроен в другом приложении.В случае если следующее прерывание наступает до окончания обработки предыдущего, то оно также будет обработано. Но если 2 прерывания будут находится в обработке одновременно, то последующие прерывания будут игнорироваться. Функция-обработчик прерывания выполняется с высоким приоритетом (если программа запущена от пользователя root) и выполняетсяодновременнос основной программой. Также она имеет полный доступ к глобальным переменным и т.д Программа gpioВместе с библиотекой Wiring Pi поставляется удобная программа gpio (я её упомянул в начале статьи). С её помощью можно быстро устанавливать пины в нужное состояние из консоли. gpio mode <pin> in/out/pwm/clock/up/down/tri - установка режима работы пина. 
 gpio write <pin> 0/1 - установить высокий/низкий уровень на пине в режиме работы OUT
 gpio pwm <pin> <value> - генерация ШИМ сигнала на пине. value в диапазоне от 0 до 1023 определяет коэффициент заполнения
 gpio read <pin> - считать состояние пина. 0 или 1
 Продолжение следует...
