gpio wiringPi

Wiring Pi - библиотека работы с GPIO. Часть 1

Данная статья рассчитана на пользователей, имеющих представления об основах GPIO Raspberry Pi.

Если эта тема для вас новая, то перед прочтением статьи рекомендую ознакомится с другими статьями для начинающих на тему GPIO - их можно найти в разделе "Документация"

В настоящее время самой популярной библиотекой для работы с GPIO на Raspberry Pi стала wiringPi

Установка wiringPi

1. Если у вас нет утилиты git для работы с github-репозиториями, то устанавливаем:

sudo apt-get install git-core

2. Скачиваем исходники библиотеки из репозитория -

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

!!!UPD: автор библиотеки прекратил её поддержку и разработку. Крайняя версия WiringPi от Гордона Хендерсона не работает нормально на Raspberry Pi 4. Поэтому следует использовать версию библиотеки, которая разрабатывается сообществом:

git clone https://github.com/WiringPi/WiringPi.git

3. Устанавливаем:

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 4

void 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) на пине, работающем в режиме OUTPUT

void 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 или 1

analogRead (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 &lt;pin&amp;gt; in/out/pwm/clock/up/down/tri - установка режима работы пина.
  • gpio write &amp;amp;amp;lt;pin&amp;amp;amp;gt; 0/1 - установить высокий/низкий уровень на пине в режиме работы OUT
  • gpio pwm &amp;amp;amp;lt;pin&amp;amp;amp;gt; &amp;amp;amp;lt;value&amp;amp;amp;gt;&amp;amp;amp;nbsp; - генерация ШИМ сигнала на пине. value в диапазоне от 0 до 1023 определяет коэффициент заполнения
  • gpio read &amp;amp;amp;lt;pin&amp;amp;amp;gt; - считать состояние пина. 0 или 1

Продолжение следует...

Тэги:

 

Автор:

Комментариев: 0

Ваш комментарий

Авторизуйтесь для отправки комментария

© Сообщество пользователей RaspberryPi 2021