Начало работы с WiringRP


Загрузка репозитория #

ПРЕДУПРЕЖДЕНИЕ

Библиотека собирается и предназначена только для одноплатных компьютеров Repka Pi.

Библиотека WiringPI доступна для загрузки из репозитория GitFlic. Перед загрузкой перейдите в каталог, который Вы планируете использовать для хранения проектов, например в Вашу домашнюю директорию /home/имя_пользователя/. Для загрузки библиотеки выполните следующие команды в терминале RepkaOS:

# установка Git
sudo apt-get install git
# переход в домашнюю директорию
cd ~
# загрузка репозитория WiringRP
git clone https://gitflic.ru/project/repka_pi/wiring-repka.git

После окончания загрузки, в текущем каталоге появится папка wiring-repka, а в ней следующие каталоги:

  1. driver - содержит исходный код драйвера repka_gpio.

  2. examples - содержит исходный код примеров использования библиотеки.

  3. wiringRP - содержит исходный код библиотеки.

Сборка проекта #

Для сборки библиотеки WiringRP необходимо, находясь в текущем каталоге (в нашем случае это /home/имя_пользователя/), выполнить следующие команды в терминале RepkaOS:

cd wiring-repka
mkdir build
cd build
cmake ..
cmake --build .

После успешного завершения процесса сборки в текущей директории появятся следующие каталоги:

  1. bin - содержит собранные примеры использования библиотеки WiringRP.
  2. lib - содержит файл статической библиотеки libwiringrp.a.
  3. driver - содержит файлы модуля ядра repka_gpio.ko.

Загрузка модуля ядра repka_gpio #

Для версии платы Repka Pi 5, данный модуль используется библиотекой WiringRP для получения безопасного доступа к контактам GPIO-разъема. Он собирается отдельно в каталоге driver с помощью cmake. Для его включения необходимо перейти в каталог с собранным драйвером (в нашем случае это /home/имя_пользователя/wiring-repka/build/driver/) и выполнить следующие команды в терминале RepkaOS:

# переход в каталог модуля ядра
cd ~/wiring-repka/build/driver/
# установка модуля ядра
insmod repka_gpio.ko
# установка прав доступа для символьных устройств
chmod 666 /dev/repka_gpio*
chmod 666 /dev/gpiochip*
chmod 666 /dev/ttyS0
chmod 666 /dev/ttyS2
chmod 666 /dev/ttyS3
chmod 666 /dev/i2c-1
chmod 666 /dev/i2c-2
chmod 666 /dev/spidev0.0
chmod 666 /dev/spidev1.0

После чего, необходимо убедиться, что модуль ядра загрузился:

lsmod | grep repka_gpio

После выполнения данной команды, в случае успешной загрузки, мы увидим следующее:

root@Repka-Pi:~/wiring-repka/build/driver# lsmod | grep repka_gpio
repka_gpio             12288  0

После успешной загрузки модуля ядра, будут созданы следующие символьные устройства:

  • Для Repka Pi 3 и Repka Pi 4: /dev/repka_gpio0 и /dev/repka_gpio1.
  • Для Repka Pi 5:
    • /dev/repka_gpio0, /dev/repka_gpio1, /dev/repka_gpio2, /dev/repka_gpio3 и /dev/repka_gpio4.
    • /dev/repka_pmu1 и /dev/repka_pmu2.
    • /dev/repka_bus.
    • /dev/repka_vccio1_4, /dev/repka_vccio3_5, /dev/repka_vccio2 и /dev/repka_vccio6.
    • /dev/repka_emmc.

После завершения работы ОС модуль ядра repka_gpio выгрузится автоматически.

ПРЕДУПРЕЖДЕНИЕ

При запуске ОС автоматическая загрузка драйвера не осуществляется.

Для работы с библиотекой WiringRP с помощью модуля ядра repka_gpio, после каждого запуска системы необходимо выполнять загрузку драйвера вручную или настроить его автозапуск.

Разработка программ #

Попробуем создать собственную программу, которая будет управлять напряжением GPIO-контакта 111 на Repka Pi 4 (аналогичную программу можно сделать на Repka Pi 3 и Repka Pi5, но номера контактов GPIO-разъема могут отличаться).

Создаем каталог проекта в любом удобном для Вас месте, например в Вашей домашней директории:

# переход в домашнюю директорию
cd ~
# создание каталога проекта
mkdir awesome-project
# переход в каталог проекта
cd awesome-project

После того как мы перешли в созданный каталог проекта, необходимо скопировать сюда заголовочный файл библиотеки и собранную библиотеку (пути могут отличаться - будьте внимательны):

# копирование заголовочного файла библиотеки в каталог проекта
cp ~/wiring-repka/wiringRP/wiringRP.h .
# копирование файла библиотеки в каталог проекта
cp ~/wiring-repka/build/lib/libwiringrp.a .

Теперь, находясь в каталоге проекта, создадим файл awesome-program.c с нашей программой, который будет содержать следующее:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#include "wiringRP.h"

// Глобальные переменные и константы
const int LED = 8; // Контакт PA8 GPIO-разъема

void setup() {
    // Инициализация библиотеки WiringRP.
    // Используется режим нумерации SUNXI
    if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
        goto error;
    }

    // Инициализация пользовательских объектов
    if (pinMode(LED, OUTPUT) < 0) {
        goto error;
    }

    return;
error:
    onClose(2);
}

void loop() {
    // Основной цикл программы
    digitalWrite(LED, HIGH); // Вывод на контакт GPIO-разъема логической "1"
    delay(1000);
    digitalWrite(LED, LOW);  // Вывод на контакт GPIO-разъема логического "0"
    delay(500);
}

ONDESTROY() {
    // Освобождение занятых ресурсов, выключение напряжения на пинах
    digitalWrite(LED, LOW);
    pinMode(LED, DISABLE);

    // Завершение работы библиотек
    releaseWiringRP();
    // Выход из программы
    exit(0);
}

MAIN_WIRINGRP();
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#include "wiringRP.h"

// Глобальные переменные и константы
const int LED = 111; // Контакт PD15 GPIO-разъема

void setup() {
    // Инициализация библиотеки WiringRP
    // Используется режим нумерации SUNXI
    if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
        goto error;
    }

    // Инициализация пользовательских объектов
    if (pinMode(LED, OUTPUT) < 0) {
        goto error;
    }

    return;
error:
    onClose(2);
}

void loop() {
    // Основной цикл программы
    digitalWrite(LED, HIGH); // Подача на контакт GPIO-разъема логической "1"
    delay(1000);
    digitalWrite(LED, LOW);  // Подача на контакт GPIO-разъема логического "0"
    delay(500);
}

ONDESTROY() {
    // Освобождение занятых ресурсов, выключение напряжения на пинах
    digitalWrite(LED, LOW);
    pinMode(LED, DISABLE);

    // Завершение работы библиотек
    releaseWiringRP();
    // Выход из программы
    exit(0);
}

MAIN_WIRINGRP();
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#include "wiringRP.h"

// Глобальные переменные и константы
const int LED = 117; // Контакт GPIO3_C5 GPIO-разъема

void setup() {
    // Инициализация библиотеки WiringRP
    // Используется режим нумерации SUNXI
    if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
        goto error;
    }

    // Инициализация пользовательских объектов
    if (pinMode(LED, OUTPUT) < 0) {
        goto error;
    }

    return;
error:
    onClose(2);
}

void loop() {
    // Основной цикл программы
    digitalWrite(LED, HIGH); // Подача на контакт GPIO-разъема логической "1"
    delay(1000);
    digitalWrite(LED, LOW);  // Подача на контакт GPIO-разъема логического "0"
    delay(500);
}

ONDESTROY() {
    // Освобождение занятых ресурсов, выключение напряжения на пинах
    digitalWrite(LED, LOW);
    pinMode(LED, DISABLE);

    // Завершение работы библиотек
    releaseWiringRP();
    // Выход из программы
    exit(0);
}

MAIN_WIRINGRP();

После чего выполним сборку и запуск нашей программы:

gcc awesome-program.c -L./ -lwiringrp -o awesome-program
./awesome-program

Наша программа работает!

Также можно воспользоваться шаблоном для упрощения написания программ. Вы можете использовать стандартный шаблон examples/template.c или examples/template_adv.c, если программа не укладывается в парадигму, используемую в стандартном шаблоне.


6105 просмотров0 комментариев
0

Комментарии (0)

Для участия в обсуждении Вы должны быть авторизованным пользователем
Разделы

Навигация

ВойтиРегистрация