Установка и настройка 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

Похожие записи

Комментарии 53

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

  • А каким образом можно остановить даную команду?

  • Начал устанавливать, все вначале шло норм, но после части выполненных нормально операций по команде 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
    • ещё можно добавить в начале Makefile следующею команду:

      CFLAGS += -std=c99

      или

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

  • Плата pi zero, ставил
    git clone https://github.com/xpertsavenue/WiringOP-Zero.git

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

  • Выдает следующую ошибку:

    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

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

  • ./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
  • Спасибо!!! По первой ссылке получилось.

  • Вроде все установил. Открываю пример blink из wiringpi, ругается на wiringPiSetup() и соответственно далее на все строки.

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

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

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

  • Плата 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
    
  • 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$
  • Попробовал еще раз. После запуска установки были выдаются строки типа

    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

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

  • Скомпилировалось при таком вызове

    gcc blink.c -o blink -pthread -lwiringPi -lm -lrt -lcrypt
  • По поводу параметра 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-й.

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

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

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

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

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

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

    	
    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, перезапустите систему и установите по новой. Надеюсь, что получится на этот раз!

  • Заработало! Спасибо за помощь, я уже хотел бросить.

  • С такой ошибкой кто то сталкивался?
    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.

        • Удалить можно так:

          sudo chmod +x ./build
          sudo ./build uninstall
          • Неа. Та же ошибка. Я так понимаю оно просто не видит модель. Не понятно только где оно смотрит ее.

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

              /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

              • В каком файле искать эту функцию?

                • Забыл уточнить: WiringOP-Zero/wiringPi/wiringPi.c

                  • Странно, но даже ето не помогло .

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

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

  • Привет, нужна помощь. Плата 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, то есть по идеи кулер должен работать?

  • А как решить проблему кода с прерываниями? Обычный 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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *