Одноплатный компьютер для embedded программиста. Моргаем светодиодом на Qt

  • Tutorial

Введение

Цель - моргать светодиодом на GPIO одноплатного компьютера в своём Qt проекте.

Первое, что приходит в голову - использовать готовое решение, такое как wiringOP. Однако для меня, как программиста микроконтроллеров, странно устанавливать пакет для работы с GPIO. Но помимо этого сторонний пакет ещё и нужно динамически линковать (связывать) с моим приложением. А тут возникает и вопрос совместимости с новой версией пакета, и вопрос того, будет ли пакет этот в системе установлен. Таким образом, я решил прикрутить wiringOP к своему проекту на Qt статически, да и ещё иметь возможность редактировать wiringOP как проект статической библиотеки прямо в Qt Creator.

Как оказалось, кодовая база проекта wiringOP является явно избыточной. Например, мне не нужен код для работы со сдвиговыми регистрами. Так что возможность удобно редактировать библиотеку оказывается очень кстати. Ключевой функцией является wiringPiSetup(), которая выясняет у Ubuntu адреса GPIO и других регистров в памяти путем чтения файла /dev/mem. Забегая вперед скажу, что это - дырка в безопасности, потому что читая /dev/mem - можно получить доступ не только к портам ввода-вывода, но и ко всей ОЗУ.

После инициализации с помощью wiringPiSetup() можно приступать к работе. Так, функция pinMode задает режим работы вывода гребенки: вход, выход, генерация PWM. Пример кода моргания светодиодом на выводе PIN8.

wiringPiSetup();
pinMode(3, OUTPUT);
while(1){
  digitalWrite(3, LOW);
  delay(1000); //for(volatile uint64_t i=0;i<0xFFF;i++);
  digitalWrite(3, HIGH);
  delay(1000); //for(volatile uint64_t i=0;i<0xFFF;i++);
}

Сам светодиод должен быть подключен к гребенке. В случае Orange Pi 4B ситуация следующая.

Статическая линковка wiringOP

Текст выше был о том, зачем всё это надо и как это использовать. А теперь пришло время для основной части. Итак, нужно скачать wiringOP

git clone https://github.com/orangepi-xunlong/wiringOP.git 

Далее необходимо создать новую Statically Linked Library. В качестве системы сборки я выбрал qmake.

Далее нужно из скачанной wiringOP в созданную библиотеку перенести некоторые файлы согласно рисунку ниже.

В файле .pro библиотеки можно настроить важные параметры, влияющие на сборку. Во-первых, указать модель SBC. Во-вторых, было бы удобно, чтобы результирующий файл libmy_wiringOP_v5.a помещался в отдельную папку wiringOP_build_artifacts. Это можно настроить следующим образом

DEFINES += CONFIG_ORANGEPI 
DEFINES += CONFIG_ORANGEPI_4  
DESTDIR = $$PWD/../wiringOP_build_artifacts

Подсказка. Знаком две точки требуем переход на каталог назад; переменная $$PWD предоставляет текущий путь к проекту.

Наконец можно собрать библиотеку. В случае успеха вы получите файл libmy_wiringOP_v5.a

Перейдём к тестовому проекту, в моём случае консольному. Необходимо добавить в проект нашу библиотеку как External Library согласно скриншоту.

Обратите внимание, что один и тот же файл wiringPi.h используется как при создании библиотеки, так и в тестовой программе. Наконец можно написать программу для моргания светодиодом. Далее перенесем исходные коды на целевую машину.

rsync -avz /home/andrei/Документы/mywiringOP/my_wiringOP_base/my_wiringOP_v5  a@192.168.0.112:/home/a/Documents/QtProj
rsync -avz /home/andrei/Документы/mywiringOP/my_wiringOP_base/wOP_Test1  a@192.168.0.112:/home/a/Documents/QtProj

Оборачиваясь назад, можно было просто поместить файлы wiringOP в дерево своего проекта и вызывать функции. Получается, что мы пошли по тернистому пути, однако приобрели навык создания своей библиотеки и использования её в проекте. Теперь соберем библиотеку и пример на целевой машине. Запускать приложение нужно или с sudo или осуществив предварительную настройку. У меня мигает, а у вас?

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

    +2

    А без всяких библиотек просто через /sys/class/gpio чем не подошло? Или в Orange PI нету стандартных драйверов GPIO в линуксе?

      –1
      Емнип, есть. Но, через gpio нормально не назначить альтернативные функции выводам. Т.е. все, на что годен gpio — это именно что подрыгать ножкой. Достаточно для «Hello, world!», но мало для.
      0
      В качестве системы сборки я выбрал qmake.

      Без претензий лично к Вам, но начиная с Qt6 основной будет система сборки CMake: doc.qt.io/qt-6/qt6-buildsystem.html
        0

        Вы совершенно неправы. Qt 6 уже доступен — сходите попробуйте, потом расскажете про qmake.

          0
          У меня установлен и пятый и шестой Qt. Я пробовал шестой. QtCreator и CLion по дефолту используют cmake при создании нового проекта. И если первой ссылки не достаточно: www.qt.io/blog/qt-6-build-system
          CMake is the build system for Qt 6

          The CMake build system is now the default one

          p.s. Я не утверждаю, что qmake нельзя. Я утверждаю, что Qt переходит на cmake вместо qmake
            0

            Зайдите в Qt Creator в Kits. Что у вас прописано в "Qt Versions"?
            Какой-то не нужный qmake? Вот и удалите его, на CMake же перешли. Ну что, собирается?

              0
              По моему, Вы просто путаете понятия версий и системы сборки. А так же просто не открывали те два линка что я постил выше (оба с официального сайта Qt, попрошу заметить). Где английским по белому написано, что дефолтная система сборки — cmake. Даже написано, что в шестой версии что бы собрать проект с qmake — надо указать аргумент --qmake, иначе будет использована дефолтная (угадаете какая?).
              Вы же мне предлагаете заняться полной дичью и удалить компонент фреймворка (который, по факту мной не используется): у меня всё прекрасно собирается и с cmake
              Скрытый текст
              19:41:33: Running steps for project SomeQtProject...
              19:41:33: Starting: "/usr/bin/cmake" --build . --target all
              [0/2 ?/sec] Re-checking globbed directories...
              [1/6 2.5/sec] Automatic MOC and UIC for target SomeQtProject
              [2/6 5.0/sec] Generating ~/projects/tmp/SomeQtProject/SomeQtProject_en_US.ts
              Scanning directory '~/projects/tmp/SomeQtProject'...
              Updating '../../SomeQtProject/SomeQtProject_en_US.ts'...
              Found 3 source text(s) (0 new and 3 already existing)
              [3/6 0.8/sec] Building CXX object CMakeFiles/SomeQtProject.dir/SomeQtProject_autogen/mocs_compilation.cpp.o
              [4/6 1.0/sec] Building CXX object CMakeFiles/SomeQtProject.dir/main.cpp.o
              [5/6 1.1/sec] Building CXX object CMakeFiles/SomeQtProject.dir/include/Window/mainwindow.cpp.o
              [6/6 1.1/sec] Linking CXX executable SomeQtProject
              19:41:38: The process "/usr/bin/cmake" exited normally.
              19:41:38: Elapsed time: 00:06.

              Возможно где-то в недрах QtCreator и используется qmake (в cmake передается QT_QMAKE_EXECUTABLE, я не знаю зачем, я в основном использую CLion, там это не указывается и тоже собирается отлично), но так или иначе — я использую cmake, и документация Qt тоже говорит о том, что надо использовать cmake вместо qmake.
              И между прочим в Kits у меня везде cmake а версии вынесены отдельно. Есть даже вкладка для настройки cmake, но нет для qmake.
              Скрытый текст
              image

              И вообще, мне не комфортно вести с Вами диалог. За сим откланяюсь и отвечать больше не буду. Все претензии по поводу cmake и просьбой «удалить qmake» — обращайтесь к парням из qt.io.
                +1
                По моему, Вы просто путаете понятия версий и системы сборки.

                Это вы путаете понятия «сборка самого Qt» и «сборка проектов, использующих Qt». Обе ваши ссылки — они про первое, а не про второе. qmake из Qt 6 никуда не делся и убирать его оттуда не планируется. По первой ссылке даже прямо написано про это:

                If you're looking for a way to easily port your qmake-based project to CMake, I have good and bad news for you.

                The Good News

                There is no immediate need to port your project to CMake.

                QMake continues to work in Qt6.

                А bad news — это про то что сейчас никакой porting tool нет, ибо нинужно. qmake is here to stay на протяжении как минимум всей мажорной 6-й версии Qt.
                  0
                  Обе ваши ссылки — они про первое, а не про второе

                  Вообще-то там есть про всё.
                  Повторю еще раз: я не утверждаю, что qmake куда-то делся и qmake нельзя. Можно, пользуйтесь на здоровье.
                  Ну и про замечания о «не нужно»: если бы было не нужно — то не было бы указано, что «There is no immediate need to port your project to CMake.». Т.е. перевожу дословно: нет необходимости портироватся незамедлительно. Но сама необходимость есть, но необязательная. По этому и есть qmake. Пока что. Вот через года 3-4 встретимся тут снова и посмотрим. А сейчас я не вижу смысла спорить.
                  Ну и еще один линк. Пусть полежит
                  Команда признаёт, что эволюция qmake зашла в тупик и замена его было лишь вопросом времени.

                  Но Вы то знаете лучше, видимо.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое