Установка и настройка WiringOP/WiringPi на Orange Pi PC

Как установить и настроить WiringPi на Orange Pi PC?

Для работы с GPIO (англ. general-purpose input/output) — интерфейс ввода/вывода общего назначения, необходимо установить WiringOP или WiringPi на Orange Pi. В данной статье мы узнаем, как правильно скачать и установить библиотеку WiringPi на Orange Pi PC и проверить работоспособность примером программы на языке C (Си), а именно, самым простым примером — мигание светодиодом.

Смотрите ещё:
Orange Pi PC — четырёхъядерный мини ПК
Как создать загрузочную флешку Ubuntu Mate для Orange Pi PC из Windows
Руководство пользователя Orange Pi (ENG)
Установка Android на Orange Pi
Banana Pi BPI-M3 – удаленный доступ к рабочему столу из Windows

Что такое WiringPi и WiringOP?

WiringPi — это GPIO-библиотека, написанная @drogon-ом, первоначально для Raspberry Pi, но Orange Pi модифицировали и адаптировали её под свои мини-компьютеры и назвали её WiringOP, где OP — сокращение от Orange Pi. Подробнее о библиотеке WiringPi можно узнать на сайте разработчика http://wiringpi.com/.

Загрузка, установка и проверка WiringOP/WiringPi на Orange Pi

WiringPi загружена на Git для облегчения отслеживания изменений. Для того, чтобы вытянуть WiringOP из GitHub, необходимо, чтобы у вас был установлен пакет git-core. Если у вас не установлен Git, то вы можете установить его с помощью:

sudo apt-get install git-core

При возникновении каких-либо ошибок, тогда необходимо обновить вашу ОС:

sudo apt-get update
sudo apt-get upgrade

Загрузка WiringOP/WiringPi

git clone https://github.com/zhaolei/WiringOP.git -b h3

В случае если вы уже клонировали файлы ранее, тогда необходимо просто обновить до последней версии:

cd WiringOP
git pull origin

Загрузка WiringOP/WiringPi для Orange Pi Zero

git clone https://github.com/vladikoms/WiringOP-Zero.git

или

git clone https://github.com/xpertsavenue/WiringOP-Zero.git

Загрузка WiringOP/WiringPi для Orange Pi PC 2

git clone https://github.com/zhaolei/WiringOP.git -b h5

или

git clone https://github.com/kazukioishi/WiringOP.git -b h5

Установка WiringOP/WiringPi (H3, H5)

cd WiringOP
chmod +x ./build
sudo ./build

Установка WiringOP/WiringPi на Orange Pi Zero

cd WiringOP-Zero
chmod +x ./build
sudo ./build

Проверка WiringOP/WiringPi

gpio -v
gpio readall

Установка WiringPi на Orange Pi PC (1)

Самая простая программа: Мигание светодиодом

Мигание светодиодом является самой простой программой для управления пинами ввода/вывода на плате. Создайте файл с именем blink.c с содержанием:

#include <wiringPi.h>
int main (void) {
  wiringPiSetup();
  pinMode (0, OUTPUT) ;
  for (;;) {
    digitalWrite(0, HIGH);
    delay (500) ;
    digitalWrite(0, LOW);
    delay(500);
  }
  return 0;
}

Затем, для компиляции и запуска, вы должны выполнить следующие команды:

sudo gcc blink.c -o blink -lwiringPi -lpthread
sudo ./blink

Чтобы увидеть результат, вам нужно будет подключить один светодиод между CON3-11 и GND с резистором на 220 Ом для ограничения тока.

Как найти номер вывода

Об этом можно узнать тут: тык. Номера выводов с GPIO не совпадают с номерами в WiringPi.

Материалы

GitHub — zhaolei/WiringOP: This is a GPIO access library for OrangePi. It is based on the original WiringPi for Raspberry Pi.
Установка Git
WiringPi
Raspberry Pi | Wiring | Download & Install | Wiring Pi

48 комментариев к “Установка и настройка WiringOP/WiringPi на Orange Pi PC”

  1. Приветствую, спасибо за полезный материал, у меня плата orange pi plus 2, соответственно не все работает(lan, usb не работают) по причине немного отличающегося оборудования, а есть тоже самое только под orange pi plus 2 ?, спасибо

    Ответить
  2. Добрый день.
    Возникла проблема при установке. Плата orange pi pc2.
    При вызове команды gpio readall и любой другой в ответ приходит:
    piBoardRev: Unable to determine board revision from /proc/cpuinfo
    -> No «Revision» line

    В файле /proc/cpuinfo действительно нет записи Revision, данных файл является виртуальным и нет возможности его отредактировать.
    Скажите как можно исправить данную проблему?
    Спасибо.

    Ответить
  3. Начал устанавливать, все вначале шло норм, но после части выполненных нормально операций по команде sudo ./build (дошло до [complite] drcSerial.c
    и hx711.c:86:2 error: ‘for’ loop initial declarations are only allowed in c99 or c11 mode

    Ответить
    • обновите версию g++ (больше> 4.8):

      sudo apt-get install gcc g++

      чтобы проверить какая у вас версия:

      gcc --version

      или:

      gcc -v
      Ответить
    • Словил эту же ошибку. OrangePI Zero. Armbian. Все апдейты на 26.02.2018 прошли без ошибок. Но при компиляции wiringPi-zero вылетела ваша ошибка. Решение указано на GitHub. Исходники копировать отсюда:
      git clone https://github.com/vladikoms/WiringOP-Zero
      С ними библиотека скомпилировалась, диод замигал..

      Ответить
  4. Выдает следующую ошибку:

    GPIO Utility
    [Link]
    /usr/bin/ld: gpio.o: relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol’ can not be used when making a shared object; recompile with -fPIC
    gpio.o: error adding symbols: Bad value
    collect2: error: ld returned 1 exit status
    Makefile:48: recipe for target ‘gpio’ failed
    make: *** [gpio] Error 1

    не подскажете, что делать?

    Ответить
  5. Добрый день!!! Помогите пожалуйста!!
    У меня PC2, вроде все делаю правильно, скачал по нужной ссылке, правда по второй, первая, не рабочая оказалась…. в первый раз выдавало
    много ошибок при установке, попробовал повторить, выводится
    сообщение такого вида:

    [url=[/img][/url]

    Ответить
  6. ./build: 4: ./build: [[: not found
    wiringPi Build script
    =====================

    WiringPi Library
    [UnInstall]
    make: Nothing to be done for ‘all’.
    [Install Headers]
    [Install Dynamic Lib]

    WiringPi Devices Library
    [UnInstall]
    make: Nothing to be done for ‘all’.
    [Install Headers]
    [Install Dynamic Lib]

    GPIO Utility
    make: Nothing to be done for ‘all’.
    [Install]

    All Done.

    NOTE: To compile programs with wiringBP v2, you need to add:
    -lwiringPi
    to your compile line(s) To use the Gertboard, MaxDetect, etc.
    code (the devLib), you need to also add:
    -lwiringPiDev
    to your compile line(s).

    Ответить
    • Попробуй этот вариант:

      git clone https://github.com/tumugin/WiringOP.git -b h5
      cd WiringOP
      chmod +x ./build
      sudo ./build

      К сожалению, нету у меня Orange Pi на базе Allwinner H5, чтобы протестировать работоспособность библиотеки.

      Можешь проверит вариант от zhaolei не указывая имя ветки:

      git clone https://github.com/zhaolei/WiringOP.git
      Ответить
  7. Вроде все установил. Открываю пример blink из wiringpi, ругается на wiringPiSetup() и соответственно далее на все строки.

    Ответить
    • А можно поподробнее? Какая у вас плата и полное сообщение ошибки.
      Если использовать команду

      sudo gcc blink.c -o blink -lwiringPi -lpthread

      ошубок быть не должно.

      Ответить
  8. Плата BananaPi M2Ultra. Плохо, что в комментах нельзя выделить код. Вот что получается:

    avs@BananaPi:~/wiringPi/examples$ ls
    COPYING.LESSER  README.TXT      blink.sh       blink8.c     isr-osc.c       max31855.c  rht03.c       softPwm.c
    Gertboard       blink-thread.c  blink12.c      clock.c      isr.c           nes.c       scrollPhat    softTone.c
    Makefile        blink.c         blink12drcs.c  delayTest.c  lcd-adafruit.c  okLed.c     serialRead.c  speed.c
    PiFace          blink.o         blink6drcs.c   ds1302.c     lcd.c           pwm.c       serialTest.c  spiSpeed.c
    PiGlow          blink.rtb       blink8-drcn.c  header.h     lowPower.c      q2w         servo.c       wfi.c
    avs@BananaPi:~/wiringPi/examples$ sudo gcc blink.c -o blink -lwiringPi -lpthread
    /usr/lib/gcc/arm-linux-gnueabihf/7/../../../../lib/libwiringPi.so: undefined reference to `crypt'
    /usr/lib/gcc/arm-linux-gnueabihf/7/../../../../lib/libwiringPi.so: undefined reference to `rint'
    /usr/lib/gcc/arm-linux-gnueabihf/7/../../../../lib/libwiringPi.so: undefined reference to `pow'
    /usr/lib/gcc/arm-linux-gnueabihf/7/../../../../lib/libwiringPi.so: undefined reference to `shm_open'
    collect2: error: ld returned 1 exit status
    
    Ответить
  9. avs@BananaPi:~/wiringPi/examples$ gpio -v
    gpio version: 2.50
    Copyright (c) 2012-2018 Gordon Henderson
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type: gpio -warranty
    
    Raspberry Pi Details:
      Type: Model A, Revision: 00, Memory: 256MB, Maker: Sony
      * Device tree is enabled.
      *--> Banana Pi BPI-M2-Ultra
      * Root or sudo required for GPIO access.
    avs@BananaPi:~/wiringPi/examples$
    avs@BananaPi:~/wiringPi/examples$
    avs@BananaPi:~/wiringPi/examples$
    Ответить
  10. Попробовал еще раз. После запуска установки были выдаются строки типа

    mcp3422.c: In function 'waitForConversion':
    mcp3422.c:50:5: warning: ignoring return value of 'read', declared with attribute warn_unused_result [-Wunused-result]
         read (fd, buffer, n) ;
         ^~~~~~~~~~~~~~~~~~~~
    

    А в самом конце

    All Done.
    
    NOTE: To compile programs with wiringPi, you need to add:
        -lwiringPi
      to your compile line(s) To use the Gertboard, MaxDetect, etc.
      code (the devLib), you need to also add:
        -lwiringPiDev
      to your compile line(s).

    Но после запуска компиляции тестового примера ошибка осталась прежняя

    avs@BananaPi:~/BPI-WiringPi2/examples$ sudo gcc blink.c -o blink -lwiringPi -lpthread
    /usr/lib/gcc/arm-linux-gnueabihf/7/../../../../lib/libwiringPi.so: undefined reference to `crypt'
    /usr/lib/gcc/arm-linux-gnueabihf/7/../../../../lib/libwiringPi.so: undefined reference to `rint'
    /usr/lib/gcc/arm-linux-gnueabihf/7/../../../../lib/libwiringPi.so: undefined reference to `pow'
    /usr/lib/gcc/arm-linux-gnueabihf/7/../../../../lib/libwiringPi.so: undefined reference to `shm_open'
    collect2: error: ld returned 1 exit status

    Не понятно, куда копать 🙁

    Ответить
  11. По поводу параметра pthread, залез в доки по gcc, там пишут:

    -pthread
    Link with the POSIX threads library. This option is supported on GNU/Linux targets, most other Unix derivatives, and also on x86 Cygwin and MinGW targets. On some targets this option also sets flags for the preprocessor, so it should be used consistently for both compilation and linking.
    

    Так что без «l»
    Надо еще понять, что значит: -lm -lrt
    PS. Спасибо за ваши статьи.

    Ответить
    • Проверил, с pthread без разницы, а вот wiringPi без «l» не пойдет.
      П.С. Скомпилировалось или нет?

      Ответить
      • Да, скомпилировалось. Правда диод не мигает.
        Добавил в код вывод millis() в консоль — работает. Т.е. программка работает, но светодиод не мигает. Как правильно снести, установленный wiringPi?
        Хочу заново скачать и установить.

        Ответить
        • Снести можно так:

          cd WiringOP
          sudo chmod +x ./build
          sudo ./build uninstall

          В моём примере используется пин 0, но не факт, что на Банане он тот-же.
          Попробуйте использовать любой другой доступный из GPIO.XX, весь список можно получить командой gpio readall, смотрите на колонку wPI, пин под номером «0» работать и не должен, можете попробовать 21, 22, 23, 24 или 25-й.
          Установка WiringPi на Orange Pi PC 1

          #include <wiringPi.h>
          int main (void) {
            wiringPiSetup();
            pinMode (25, OUTPUT) ;
            for (;;) {
              digitalWrite(25, HIGH);
              delay (500) ;
              digitalWrite(25, LOW);
              delay(500);
            }
            return 0;
          }
          Ответить
  12. Да я немного ступил, когда зашел на

    https://github.com/BPI-SINOVOIP/BPI-WiringPi2.git

    , то внизу прочел readme, ну и взял и использовал

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

    .
    Вечером переставлю и попробую заново.

    Ответить
  13. В общем, ерунда какая то получается ;(
    Деинсталлировал установленный пакет, выполнил

    	
    git clone https://github.com/BPI-SINOVOIP/BPI-WiringPi2.git

    , установил. В результате

    avs@BananaPi:~/BPI-WiringPi2$ gpio readall
    Unable to determine hardware version. I see: Hardware   : Allwinner sun8i Family
    ,
     - expecting BCM2708, BCM2709 or BCM2835.
    If this is a genuine Raspberry Pi then please report this
    to projects@drogon.net. If this is not a Raspberry Pi then you
    are on your own as wiringPi is designed to support the
    Raspberry Pi ONLY.
    Ответить
    • Что-от мне подсказывает, что это из за ОС Armbian, с твоей проблемой ещё сталкивались тут
      http://forum.banana-pi.org/t/banana-pi-bpi-m2-ultra-m2u-wiringpi-gpio-demo/3027/10

      If you look closer to WiringPi source code, you can see it receive info about board from:

      /var/lib/bananapi/board.sh

      The easiest solution (not saying it is the right one) is to create it with this content (copied from bananapi images):

      BOARD=bpi-m2u
      BOARD_AUTO=bpi-m2u
      BOARD_OLD=bpi-m3

      Tested on Armbian image.

      Вам нужно будет создать файл /var/lib/bananapi/board.sh и прописать в него следующее содержание:

      BOARD=bpi-m2u
      BOARD_AUTO=bpi-m2u
      BOARD_OLD=bpi-m3

      Из за отсутствия этих параметров ваш мини-ПК определяется как Raspberry Pi, т.е. по умолчанию.
      После этих операций удалите WiringPi, перезапустите систему и установите по новой. Надеюсь, что получится на этот раз!

      Ответить
  14. С такой ошибкой кто то сталкивался?
    Oops — unable to determine board type… model: 0
    Подскажите как исправить если знаете.

    Ответить
    • Можете уточнить, какая у вас плата/модель и что именно установили? Скорее всего, вы установили неправильную версию.

      Ответить
      • У меня OrangePI Zero а устанавливал вот по етой ссылке «https://github.com/xpertsavenue/WiringOP-Zero.git». Возможно проблемма связана с тем что установлена Arch linux. Но мне кажется должна быть возможность и на ней запустить.

        Ответить
        • Можете попробовать установить вот эту версию:

          git clone https://github.com/vladikoms/WiringOP-Zero

          от xpertsavenue не у всех работает, даже тут отписались люди, что заработало именно с версией от vladikoms.

          Ответить
          • Неа. Та же ошибка. Я так понимаю оно просто не видит модель. Не понятно только где оно смотрит ее.

            Ответить
            • Скорее всего это из за отличающегося или отсутствии файла

              /proc/cpuinfo

              на Arch linux.
              Можете отредактировать функцию

              void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted)
              {
                FILE *cpuFd ;
                char line [120] ;
                char *c ;
              
                (void)piBoardRev () ;	// Call this first to make sure all's OK. Don't care about the result.
              
                if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL)
                  piBoardRevOops ("Unable to open /proc/cpuinfo") ;
              
                while (fgets (line, 120, cpuFd) != NULL)
                  if (strncmp (line, "Revision", 8) == 0)
                    break ;
              
                fclose (cpuFd) ;
              
                if (strncmp (line, "Revision", 8) != 0)
                  piBoardRevOops ("No \"Revision\" line") ;
              
              // Chomp trailing CR/NL
              
                for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c)
                  *c = 0 ;
                
                if (wiringPiDebug)
                  printf ("piboardId: Revision string: %s\n", line) ;
              
              // Scan to first digit
              
                for (c = line ; *c ; ++c)
                  if (isdigit (*c))
                    break ;
              
              // Make sure its long enough
              
                if (strlen (c) < 4)
                  piBoardRevOops ("Bogus \"Revision\" line") ;
              
              // If longer than 4, we'll assume it's been overvolted
              
                *overVolted = strlen (c) > 4 ;
                
              // Extract last 4 characters:
              
                c = c + strlen (c) - 4 ;
              
              // Fill out the replys as appropriate
              
                /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_1   ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
                else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_1_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
                else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_SONY   ; }
                else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_QISDA  ; }
                else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
                else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
                else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_SONY ; ; }
                else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_QISDA  ; }
                else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; }
                else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 512 ; *maker = PI_MAKER_SONY   ; }
                else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; }
                else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY   ; }
                else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY   ; }
              //add for Orange Pi Zero by pel
                else if (strcmp (c, "0000") == 0) { *model = PI_MODEL_OPZ;  *rev = PI_VERSION_UNKNOWN;  *mem = 512;  *maker = PI_MAKER_UNKNOWN;}
              //end 
                else                              { *model = 0           ; *rev = 0              ; *mem =   0 ; *maker = 0 ;               }
              }

              вместо этого

              //end 
                else                              { *model = 0           ; *rev = 0              ; *mem =   0 ; *maker = 0 ;               }

              вставить

              //end 
                else                              { *model = PI_MODEL_OPZ;  *rev = PI_VERSION_UNKNOWN;  *mem = 512;  *maker = PI_MAKER_UNKNOWN;}

              чтобы всегда возвращались параметры для Orange Pi Zero.

              Или использовать Armbian

              Ответить
                    • Так после того, как вы отредактировали файл, нужно удалить wiringPi.o файл, но лучше все *.o файлы и libwiringPi.so, и переустановить WiringPi, чтобы был эффект.
                      Но мне кажется, что будет работать на другой ОС

  15. Я так и сделал. Только я не файл удалил а полностью удалил все, командой ./build uninstall А потом заново установил.

    Ответить
  16. Привет, нужна помощь. Плата Orange Pi 4
    Установил WiringOP по этой ссылке https://github.com/orangepi-xunlong/WiringOP.

    Пытаюсь скопмилить, получаю вот такие ошибки
    /usr/lib/gcc/aarch64-linux-gnu/7/../../../../lib/libwiringPi.so: undefined reference to `shm_open’
    /usr/lib/gcc/aarch64-linux-gnu/7/../../../../lib/libwiringPi.so: undefined reference to `crypt’
    collect2: error: ld returned 1 exit status
    При добавлении ключей -lrt -lcrypt — компилится без ошибок, но не работает. (подключил кулер к пинам 4 и 6). Командой gpio read 4 ответ 1, то есть по идеи кулер должен работать?

    Ответить
  17. А как решить проблему кода с прерываниями? Обычный blink работает хорошо, а вот когда скомпилировал и запускаешь isr-osc, то вылезает ошибка:
    gpio: Unable to open GPIO edge interface for pin 4: Permission denied
    wiringPiISR: unable to open /sys/class/gpio/gpio355/value: No such file or directory
    Даже если запускаешь так:
    sudo ./isr-osc
    то вылетает та же самая ошибка. Кто-то запускал примеры с прерываниями? Плата — OrangePi 3 LTS

    Ответить

Оставьте комментарий

Отправляя комментарий, вы соглашаетесь с обработкой ваших данных (имя, адрес электронной почты, текст комментария) в соответствии с политикой конфиденциальности.