Wiring Pi – библиотека работы с GPIO. Часть 1
Данная статья рассчитана на пользователей, имеющих представления об основах GPIO Raspberry Pi.
Если эта тема для вас новая, то перед прочтением статьи рекомендую ознакомится с другими статьями для начинающих на тему GPIO – их можно найти в разделе “Документация”
В настоящее время самой популярной библиотекой для работы с GPIO на Raspberry Pi стала 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)
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) и выполняетсяодновременнос основной программой. Также она имеет полный доступ к глобальным переменным и т.д
Вместе с библиотекой Wiring Pi поставляется удобная программа gpio (я её упомянул в начале статьи). С её помощью можно быстро устанавливать пины в нужное состояние из консоли.
- gpio mode <pin&gt; in/out/pwm/clock/up/down/tri – установка режима работы пина.
- gpio write &amp;amp;lt;pin&amp;amp;gt; 0/1 – установить высокий/низкий уровень на пине в режиме работы OUT
- gpio pwm &amp;amp;lt;pin&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;amp;nbsp; – генерация ШИМ сигнала на пине. value в диапазоне от 0 до 1023 определяет коэффициент заполнения
- gpio read &amp;amp;lt;pin&amp;amp;gt; – считать состояние пина. 0 или 1
Продолжение следует…
Использование библиотеки WiringPi [BPI-WiringPi2] на Banana Pi BPI-M64
WiringPi – это библиотека для доступа к GPIO-контактам отладочной платы, изначально разрабатывалась для чипа BCM2835, используемого в Raspberry Pi. Написана на языке C, выпущена под лицензией GNU LGPLv3 и предназначена для использования в C, C++ и RTB (BASIC), а также в других языках (но для этого нужны специальные функции-обертки). Библиотека WiringPi создавалась с прицелом на схожесть с языком Wiring, который используется в Arduino.
WiringPi была портирована на другие платформы, однако автор оригинальной WiringPi поддержкой этих версий не занимается.
В библиотеке WiringPi доступны протоколы и интерфейсы: цифровой вход/выход, PWM (ШИМ), I2C, SPI, UART.
В комплекте с WiringPi идет gpio, утилита для командной строки, которую можно использовать для программирования и настройки GPIO-контактов. С ее помощью можно записывать и считывать данные с контактов, а также управлять ими при помощи shell-скриптов.
Библиотеку WiringPi можно расширить при помощи модулей. К примеру, один модуль позволяет использовать на Gertboard устройства с аналоговым интерфейсом, другой – пользоваться MCP23x17 и MCP23x08, популярными чипами для увеличения количества GPIO-контактов, третий – использовать WiringPi для вывода 32 бит данных при помощи 4 сдвиговых регистров 74×595, последовательно подключенных друг к другу. Кроме того, есть модуль, который для увеличения количества GPIO-контактов использует ATmega (например, Arduino или Gertboard) – через последовательный порт.
Вы также можете создавать для WiringPi собственные расширительные модули, чтобы интегрировать в цепь с Pi собственное периферийное устройство.
Драйверы devLib
В комплекте с WiringPi идет devLib – это набор драйверов, обеспечивающих доступ к некоторым популярным периферийным устройствам. Среди поддерживаемых устройств: LCD-дисплеи (на базе чипов Hitachi HD44780U) и графические дисплеи (например, обычные дисплеи с разрешением 128х64, работающие на чипе-драйвере 12864H). Также поддерживаются DS1302 (чип, работающий как часы реального времени), датчики на базе чипов Maxdetect (например, RHT003), платы Gertboard/PiFace и т.д.
Установка
Загрузить WiringPi для Banana Pi BPI-M64 можно по ссылке.
Портированная версия BPI-WiringPi2 помимо Banana Pi BPI-M64 так же поддерживает следующие платы: Banana Pi[New], Banana Pi[X86], Banana Pi M1[A20], Banana Pi M1+[A20], Banana Pi R1[A20], Banana Pi M2[A31s], Banana Pi M3[A83T], Banana Pi M2+[h4], Banana Pi M2 Ultra[R40], Banana Pi M2 Magic[R16], Banana Pi M2+[h3+], Banana Pi M2+[H5], Banana Pi M2 Ultra[V40], Banana Pi M2 Zero[h3+/h4].
Установка на Armbian, так же подходит для Ubuntu:
$ sudo apt-get update $ sudo apt-get install git $ cd ~/ $ git clone https://github. com/BPI-SINOVOIP/BPI-WiringPi2 $ cd ~/BPI-WiringPi2 $ ./build
Компиляция и установка должна завершиться без ошибок, предупреждения компилятора на результат не влияют:
После этого скрипт скомпилирует и установит динамическую библиотеку *.so по пути /usr/local/lib.
Удаление библиотек WiringPi:
./build uninstall
В некоторых дистрибутивах нет /usr/local/lib по умолчанию как LD_LIBRARY_PATH. Для решение этой задачи необходимо в файл /etc/ld.so.conf добавить строку: /usr/local/lib. Затем выполнить
sudo ldconfig
Если необходимо установить статическую библиотеку, то необходимо сделать следующее:
$ cd ~/BPI-WiringPi2 $ make static $ sudo make install-static
Утилита gpio
В состав WiringPi входит утилита gpio, помогающая управлять встроенным GPIO-интерфейсом. gpio можно так же использовать в скриптах, чтобы манипулировать GPIO-контактами – записывать данные на выходные контакты и считывать данные с входных контактов.
Более того, при помощи gpio, встроенной в shell-скрипт, можно писать целые программы, но это не самый эффективный метод. Другой способ ее использования – вызывать в функции system() (в языках C/C++) или функции-эквиваленте из другого языка программирования.
Команда gpio разработана таким образом, что устанавливается с флагом права доступа setuid. Благодаря этому обычный пользователь может вызывать ее без команды sudo или залогинивания в аккаунт root-пользователя.
Помимо управления, считывания и записи на GPIO контакты, утилита gpio позволяет делать следующее:
- Экспортировать/реэкспортировать контакты через интерфейс /sys/class/gpio, где они становятся доступны для пользовательских программ (т.е. их не нужно будет запускать с правами root-пользователя или через sudo).
- Экспортировать контакты через интерфейс /sys/class/gpio для включения прерываний, запускаемых на фронте импульса.
- Загружать модули для шин I2C и SPI, а также задавать разрешения в «/dev/», чтобы позволить пользователю, который запустил gpio, запись/считывание данных.
- Запускать программы i2cdetect с флагами, соответствующими версии вашей платы.
Определять версию платы.
Использование gpio
После установки WiringPi выполните команду, которая покажет версию библиотеки и платы:
$ gpio -v
Команда:
$ gpio readall
— считывает данные со всех доступных контактов и печатает удобную перекрестную таблицу их номеров (т.е. распиновку WiringPi, распиновку BCM_GPIO и распиновку согласно положению на плате), а также текущие значения контактов и режимы, в которые они выставлены. На приведенном снимке экрана показана нумерация выводов согласно WiringPi, BCM (нумерация GPIO) и физическая нумерация ( BOARD):
Использование
Выполним классический пример, поморгаем светодиодом. Для этого нам потребуется светодиод, резистор, и подключим все это на 32-pin, GPIO-26, номер GPIO на чипе Allwinner = 39.
Для проверки правильности подключения подадим «1» на GPIO-26 используя утилиту gpio. Команда:
gpio write 0/1
, выставляет выходной контакт в состояние HIGH («1») или LOW («0»). Поэтому для включения светодиода выполним:
$ gpio write 26 1
Если светодиод не включился значил подключение выполнено неверно или не был инициализирован pin.
В каталоге ~/BPI-WiringPi2/examples, располагаются примеры для работы с GPIO. Нам потребуется пример blink.c, создадим копию файла для редактирования и установим mc вместе с удобным редактором mcedit:
$ sudo apt-get install -y mc $ cd ~/BPI-WiringPi2/examples $ cp blink. c blink_pin32.c $ mcedit blink_pin32.c
Изменим номер контакта для светодиода: #define LED 0, на #define LED 26. Сохраним изменения — F2 — save, выход F10.
blink_pin32.c:
#include ; #include ; // LED Pin - wiringPi pin 0 is BCM_GPIO 17. #define LED 26 int main (void) { printf ("Raspberry Pi blink\n") ; wiringPiSetup () ; pinMode (LED, OUTPUT) ; for (;;) { digitalWrite (LED, HIGH) ; // On delay (500) ; // mS digitalWrite (LED, LOW) ; // Off delay (500) ; } return 0 ; }
Теперь скомпилируем программу:
$ gcc -Wall -pthread -o blink_pin32 blink_pin32.c -lwiringPi -lm -lpthread -lcrypt -lrt
Приведенная выше команда создаст исполняемый файл с именем blink_pin32. Теперь можно выполнить нашу программу:
$ . /blink_pin32
Светодиод будет мигать с частотой в полсекунды до тех пор пока не завершим программу.
Ссылки
- GitHub BPI-WiringPi2
- Raspberry Pi:Библиотеки/WiringPi
- Библиотеки/WiringPi/Утилита gpio
- Raspberry Pi:Библиотеки/WiringPi/Драйверы DevLib
- Как использовать библиотеку WiringPi на Raspberry Pi
- WiringPI для Raspberry PI, +Python
- Wiring Pi
- GPIO Interface library for the Raspberry Pi
- WiringPi — Unofficial mirror and ports of WiringPi
- WiringPi — Banana Pi BPI-M64
- Установка и настройка WiringOP/WiringPi на Orange Pi PC
- How to enable wiringpi GPIO control inside a Docker container
WiringPi
WiringPi — это библиотека доступа GPIO на основе PIN , написанная на C для устройств SoC BCM2835, BCM2836 и BCM2837, используемых во всех Raspberry Pi. версий. Исходный код не является общедоступным, но может быть предоставлен тем, кто желает получить коммерческую поддержку.
Он предназначен для использования с C и RTB (BASIC) ТОЛЬКО НА RASPBERRY PI.
Он должен быть знаком людям, которые использовали Arduino « проводка ” система 1 и предназначена для использования опытными программистами C/C++. Это не инструмент обучения новичков.
Пожалуйста, прочитайте страницу новостей.
WiringPi разработан непосредственно на Raspberry Pi с 32-разрядной версией Raspbian.
Я не поддерживаю никакие другие платформы, кросс-компиляцию или операционные системы. Он был портирован на другие платформы, другие операционные системы, а некоторые из них подвергаются кросс-компиляции, однако я не поддерживаю эти системы. Если вы пытаетесь использовать wirePi на платформе, отличной от Raspberry Pi с Raspbian, тогда вы должны связаться с человеком, который сделал порт, а не со мной.
Первоначальная версия Raspberry Pi Model A и B версии B1 представляла собой одноплатный компьютер стоимостью 35 долларов с 26-контактным разъемом ввода-вывода общего назначения (GPIO), который несет набор сигналов и шин. Имеется 8 цифровых контактов ввода-вывода общего назначения, которые можно запрограммировать как цифровые выходы или входы. Два из этих контактов (на 40-контактном Pi и только один на 26-контактном Pi) также могут быть назначены для аппаратного выхода ШИМ. Кроме того, имеется 2-проводной интерфейс I2C и 4-проводной интерфейс SPI (со второй линией выбора, всего 5 контактов) и последовательный UART с еще 2 контактами.
За прошедшие годы были некоторые обновления:
- Оригинальная модель B с 26-контактным разъемом GPIO.
- Модель B, версия 1.1 Raspberry Pi имеет дополнительные 4 линии GPIO на отдельном разъеме, который необходимо припаять к плате.
- Модель A, аналогичная модели B v1.1, но без концентратора USB и разъема Ethernet.
- Модель Raspberry Pi моделей A+ и B+ представляет собой результат двух лет исследований, разработок и испытаний и теперь оснащена одним 40-контактным разъемом GPIO с 28 используемыми контактами GPIO и 4 разъемами USB. (Нет USB или Ethernet на A+)
- Модель B v2 оснащена четырехъядерным процессором Arm A7 с 1 ГБ оперативной памяти. Тот же GPIO.
- Модель Zero — это форсированный (1 ГГц) урезанный Pi A+. 40-контактный разъем GPIO и многое другое. Ценник 5 долларов.
- Модель B v3 оснащена четырехъядерным процессором Arm A8 (64-разрядная версия) с той же оперативной памятью и GPIO, что и модель 2, однако она также имеет встроенные модули Wi-Fi и Bluetooth. Все тот же ценник в 35 долларов.
- Модель Zero-W добавляет встроенный Wi-Fi, Bluetooth и разъем для камеры Pi к существующей плате модели Zero.
Интерфейсы I2C, SPI и UART также могут использоваться в качестве контактов ввода-вывода общего назначения, когда они не используются в своих режимах шины, что дает в общей сложности 8 + 2 + 5 + 2 = 17 контактов ввода-вывода на . Разъем P1 (плюс еще 4 на разъеме P5 на Revision 2 Pi) и 28 контактов ввода-вывода на платах B+ и версии 2 и 3 (хотя 2 зарезервированы для интерфейса HAT I2C, но могут использоваться как обычные GPIO, если не используется плата HAT)
WiringPi включает утилиту командной строки gpio , который можно использовать для программирования и настройки контактов GPIO. Вы можете использовать это для чтения и записи контактов и даже использовать его для управления ими из сценариев оболочки.
WiringPi является расширяемым, и предоставляются модули для расширения WiringPi для использования устройств аналогового интерфейса на плате Gertboard, а также для использования популярных MCP23x17/MCP23x08 (I2C 7 SPI) микросхем расширения, а также модулей расширения IO как модуль, который позволит блокировать до 4 74 × 595 регистров сдвига , которые можно последовательно соединить вместе для получения дополнительных 32-битных выходных данных в виде единого блока. (При необходимости у вас может быть несколько блоков по 4 74×595). Один из модулей расширения позволяет вам использовать ATmega (например, Arduino или Gertboard) в качестве дополнительного расширения GPIO — через последовательный порт Pi.
Кроме того, вы можете легко написать свои собственные модули расширения для интеграции ваших собственных периферийных устройств с wireingPi по мере необходимости.
WiringPi поддерживает аналоговое чтение и запись, и, хотя по умолчанию на Pi нет собственного аналогового оборудования, предусмотрены модули для поддержки аналоговых микросхем Gertboards, а другие устройства A/D и D/A могут быть реализованы относительно легко.
ПРИМЕЧАНИЕ.
Существует версия wireingPi , размещенная на Github. Не используйте эту версию проводки Pi . Он существует только для облегчения создания оболочек Ruby и Python, которые были написаны кем-то другим. Вы также можете найти другие версии wirePi на github — все они были разветвлены и изменены для поддержки различных аппаратных платформ. Если вы используете эти версии, вы ДОЛЖНЫ связаться с человеком, который сделал эту форму для поддержки. Просьбы о поддержке от меня будут игнорироваться.
TheWiringPi devLib
devLib представляет собой набор библиотечных подпрограмм, реализованных с использованием wiringPi , чтобы предоставить вам легкий доступ к некоторым популярным периферийным устройствам. Поддерживаемые устройства включают в себя как символьные ЖК-дисплеи (на базе чипов Hitachi HD44780U), так и графические — напр. обычные дисплеи с разрешением 128 × 64 пикселей с общим чипом драйвера 12864H. Чип часов DS1302 RTC, датчики на базе чипов Maxdetect (например, RHT003), интерфейсные платы Gertboard и PiFace и так далее.
Ресурсы WiringPi
- Raspberry Pi GPIO Нумерация контактов
- Загрузите и установите
- Примеры и инструкции
- Справочное руководство/документация по функции WiringPi
- Расширения GPIO
- DevLib
- Утилита GPIO
PiFace
WiringPi когда-то поддерживал плату PiFace, но ее поддержка сейчас сильно устарела.
Гертборд
WiringPi полностью поддерживает Gertboard, но его поддержка сейчас сильно устарела.
1 Arduino на самом деле состоит из двух вещей; один — это аппаратная платформа, другой — программное обеспечение, а часть программного обеспечения — это пакет под названием Wiring . Проводка является ядром ввода и вывода для Arduino, поэтому я подумал, что было бы неплохо воспроизвести эту функциональность (или хорошее полезное подмножество с расширениями Raspberry Pi) на Raspberry Pi.
Малиновый Пи | Электропроводка | Скачать и установить
WiringPi — это ПРЕДУСТАНОВЛЕННЫЙ со стандартными системами Raspbian. Пожалуйста, НЕ ПЫТАЙТЕСЬ следовать каким-либо инструкциям по установке, которые вам могут дать где-либо еще. ЭТА СТРАНИЦА является окончательным и правильным способом сделать это.
Также обратите внимание: WiringPi разработан и протестирован ТОЛЬКО на Raspberry Pi. Это для программ C и RTB BASIC. Если вы пытаетесь установить его на что-нибудь еще, то удачи.
Для обновления или установки в системе Raspbian-Lite:
sudo apt-get install wirepi
— это все, что вам нужно.
Из источника:
WiringPi поддерживается GIT для простоты отслеживания изменений, однако существует Plan B , если вы не можете использовать GIT по каким-либо причинам (обычно ваш брандмауэр блокирует вас, так что сначала проверьте это!)
Примечание : wirePi – это , а НЕ , размещенный на Github. Есть много форков, которые вы можете найти там, но это не оригинальная версия, поддерживаемая мной.
Чтобы просмотреть источники WiringPi, перейдите по адресу:
https://git.drogon.net/
и выберите ссылку WiringPi.
Для установки…
Сначала убедитесь, что не установлен wirePi. В терминале запустите:
$ gpio -v
Если вы что-то получили, значит оно у вас уже установлено. Следующий шаг — выяснить, установлен ли он через стандартный пакет или из исходного кода. Если вы установили его из исходного кода, то вы знаете, что делаете — продолжайте — но если он установлен как пакет, вам нужно будет сначала удалить пакет. Для этого:
$ sudo apt-get purge wirepi $ hash -r
Тогда продолжайте.
Если у вас не установлен GIT, то под любой из версий Debian (например, Raspbian) вы можете установить его с помощью:
$ sudo apt-get install git-core
Если вы получаете какие-либо ошибки, убедитесь ваш Pi обновлен до последней версии Raspbian: (в любом случае, это хорошая идея делать регулярно)
$ sudo apt-get update $ sudo apt-get upgrade
Чтобы получить WiringPi с помощью GIT:
$ кд $ git clone git://git.drogon.net/wiringPi
Если вы уже впервые использовали операцию клонирования, то
$ cd ~/wiringPi $ git pull origin
Будет получена обновленная версия, после чего вы сможете повторно запустить приведенный ниже скрипт сборки.
Для сборки/установки есть новый упрощенный скрипт:
$ cd ~/wiringPi $ . /build
Новый сценарий сборки скомпилирует и установит все это за вас — в какой-то момент он использует команду sudo, поэтому вы можете проверить сценарий перед его запуском.
План B
Нажмите на этот URL-адрес: (он должен открыться на новой странице)
https://git.drogon.net/?p=wiringPi;a=summary
Затем найдите ссылку с пометкой снимок справа. Вы хотите нажать на верхний.
Будет загружен файл tar.gz с именем , например wirePi-98bcb20.tar.gz. Обратите внимание, что цифры и буквы после wireingPi (в данном случае 98bcb20), вероятно, будут другими — они являются уникальным идентификатором для каждого выпуска.
Затем вам нужно сделать это для установки:
$ cd Проводка $tar xfzPi-98bcb20.tar.gz $кд проводкаPi-98bcb20 $ ./build
Обратите внимание, что фактическое имя файла будет другим — вам придется проверить имя и внести соответствующие изменения.
Проверка установки WiringPi
Запустите команду gpio для проверки установки:
$ gpio -v $ gpio readall
Это должно дать вам некоторую уверенность в том, что все работает нормально.