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+[H3], Banana Pi M2 Ultra[R40], Banana Pi M2 Magic[R16], Banana Pi M2+[H2+], Banana Pi M2+[H5], Banana Pi M2 Ultra[V40], Banana Pi M2 Zero[H2+/H3].
Установка на 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 с флагами, соответствующими версии вашей платы.
Задавать размер буфера SPI и скорости передачи данных I2C (при загрузке модулей).
Определять версию платы.
Использование 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