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
Продолжение следует...