Использование библиотеки WiringPi [BPI-WiringPi2] на Banana Pi BPI-M64

logo bpi wiringpi
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

Компиляция и установка должна завершиться без ошибок, предупреждения компилятора на результат не влияют:

bpi wiringpi

После этого скрипт скомпилирует и установит динамическую библиотеку *.so по пути /usr/local/lib.

bpi libwiringPi.so

Удаление библиотек 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

bpi WiringPi

Команда:

$ gpio readall

— считывает данные со всех доступных контактов и печатает удобную перекрестную таблицу их номеров (т.е. распиновку WiringPi, распиновку BCM_GPIO и распиновку согласно положению на плате), а также текущие значения контактов и режимы, в которые они выставлены. На приведенном снимке экрана показана нумерация выводов согласно WiringPi, BCM (нумерация GPIO) и физическая нумерация ( BOARD):
bpi WiringPi gpio readall

Использование

Выполним классический пример, поморгаем светодиодом. Для этого нам потребуется светодиод, резистор, и подключим все это на 32-pin, GPIO-26, номер GPIO на чипе Allwinner = 39.

led blinking bpi WiringPi

Для проверки правильности подключения подадим «1» на GPIO-26 используя утилиту gpio. Команда:

gpio write <pin> 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 <stdio.h>;
#include <wiringPi.h>;

// 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

Светодиод будет мигать с частотой в полсекунды до тех пор пока не завершим программу.

Ссылки

About the Author: Anton

Programistik