.NET IoT. Часть 2. Мигаем светодиодом (LED) используя библиотеку Libgpiod

Управление контактами GPIO в Linux на C# .NET IoT, уже было рассмотрено в публикации Управляем контактами GPIO из C# .NET 5 в Linux. Дабы не повторятся желательно ознакомится с выше указанной публикацией. Но для работы с GPIO в .NET IoT необходимо разобраться с нумерацией ножек процессора и иметь в наличие как минимум светодиод. Но что делать если на руках только одноплатный компьютер? В большинстве случаев на плате компьютера распаяны светодиоды, которые подключены к контроллеру GPIO (gpiochip). Таким образом, данные светодиоды доступны для управления из C# .NET IoT. В зависимости от дистрибутива, светодиоды могут быть задействованы в ОС как устройства, которые необходимо выключить в конфигурации дерева устройств Linux. На плате Banana Pi BPI-M64 размещено три светодиода красного, зеленого и синего цвета. Красный светодиод занят под функцию индикации подачи электропитания. Два остальных светодиода доступны для любых задач. Будем управлять встроенным синим светодиодом из .NET кода.

Оглавление

  1. Постановка задачи
  2. Светодиоды RED, GREEN, BLUE на плате Banana Pi BPI-M64
  3. Выяснение линий GPIO для светодиодов
  4. Файл наложения устройств DTS для отключения устройства
  5. Проверка управления синим светодиодом на GPIO143
  6. Подготовка устройства
  7. Подготовка среды запуска (ПК)
  8. Управление светодиодом (LED) в Linux из .NET кода
  9. Литература

Постановка задачи

Реализовать программу(blink) мигания светодиодом на C# .NET IoT использую библиотеку Libgpiod. Будет использован синий светодиод из доступных на самой плате Banana Pi BPI-M64. Т.к. светодиод задействован в дереве устройств (device tree) Linux, то необходимо создать файл DTS для освобождения назначенной функции.

Светодиоды RED, GREEN, BLUE на плате Banana Pi BPI-M64

Светодиоды красный, зеленый, синий, располагаются на плате Banana Pi BPI-M64, возле 40-контактного разъема совместимого с Raspberry Pi 3. Управлять светодиодами можно используя виртуальную файловую систему Sysfs.

Светодиоды красный, зеленый, синий на Banana Pi BPI-M64. Красный светодиод — индикация электропитание, состояние включено.
Linux .NET IoT LED

Перейдем по пути  /sys/class/leds/  и посмотрим содержимое каталога:

root@bananapim64:~# cd /sys/class/leds/
root@bananapim64:/sys/class/leds# ls
bananapi-m64:blue:user bananapi-m64:green:user bananapi-m64:red:pwr
root@bananapim64:/sys/class/leds#

В каталоге будут доступны светодиоды с именами:

  • bananapi-m64:blue:user
  • bananapi-m64:green:user
  • bananapi-m64:red:pwr

Для включения синего светодиода с именем «bananapi-m64:blue:user» необходимо выполнить команду:

echo 1 > /sys/class/leds/bananapi-m64:blue:user/brightness

В результате выполнения команды синий светодиод включится.

Включен синий светодиод на плате Banana Pi BPI-M64
Linux .NET IoT LED

Более подробно о LED в публикации Работа с GPIO в Linux на примере Banana Pi BPI-M64. Часть 3. Device Tree overlays. LED, ШИМ (PWM), КНОПКА раздел LED (светодиод).

Выяснение линий GPIO для светодиодов

Для управления светодиодом необходимо знать его номер GPIOXX в контроллере GPIO(gpiochip). Существует три варианта решения этой задачи (перечислены в порядке увеличения сложности):

Способ 1. Просмотр раздела DEBUG в Sysfs

Список задействованных контактов и контроллеров GPIO можно узнать выполнив команду:

cat /sys/kernel/debug/gpio

Результат выполнения команды:

Linux .NET IoT LED

Исходя из полученных данных следует, что все светодиоды располагаются в контроллере — gpiochip1, номера контактов:

Номер контакта Метка линии
gpio-120 bananapi-m64:red:pwr
gpio-142 bananapi-m64:green:user
gpio-143 bananapi-m64:blue:user

Синий светодиод подключен к gpio-143 в GPIO контроллере gpiochip1.

Способ 2. Используя утилиту gpioinfo из библиотеки Libgpiod

Для управления контактами GPIO из .NET все равно потребуется установить библиотеку Libgpiod. Установка и работа с Libgpiod в публикации Работа с GPIO в Linux. Часть 6. Библиотека Libgpiod. Утилита gpioinfo выводит информацию о линиях GPIO всех доступных контроллеров GPIO. В таблице вывода по колонкам будет указано: номер линии, название контакта, направление ввода/вывода, текущее состояние. Для получения  номера линии GPIO синего светодиода выполним команду:

gpioinfo

Результат выполнения команды:

Linux .NET IoT LED

Исходя из полученных данных следует, что синий светодиод находится на линии 143, т.е. GPIO143, в GPIO контроллере gpiochip1.

Способ 3. Чтение datasheet к плате Banana Pi BPI-M64

Это самый сложный вариант, который требует понимания схем datasheet. В документе banana pi BPI-M64-V1_1-Release 201609.pdf на странице GPIO-IR-KEY-LED (page 10), указанна схема подключения светодиодов LED0, LED1, LED3. Далее на странице CPU (page 2), указано следующее:

  • LED0 подключен к ножке процессора PD24
  • LED1 подключен к ножке процессора PE14
  • LED2 подключен к ножке процессора PE15

Datasheet к плате Banana Pi BPI-M64
Linux .NET IoT LED

Используя формулу вычисления номера GPIO — (позиция буквы в алфавите — 1) * 32 + позиция вывода (более подробно в пункте Формула для вычисления номера GPIOXX). Получаем следующие результаты:

  • LED0 = (4 — 1) * 32 + 24 = 120
  • LED1 = (5 — 1) * 32 + 14 = 142
  • LED2 = (5 — 1) * 32 + 15 = 143

К сожалению из datasheet нельзя сказать к какому из gpio-120, gpio-142, gpio-143, подключен синий светодиод, выручит только простой последовательный перебор.

Файл наложения устройств DTS для отключения устройства «gpio-leds»

Как формируются файлы наложения устройств (DTS) можно почитать в публикации Работа с GPIO на примере Banana Pi BPI-M64. Часть 2. Device Tree overlays.

Самое сложное при формирование файла dts заключается в нахождение нужного узла, в который необходимо вставить единственную строку status = «disabled».

Для поиска необходимого узла выполним декомпиляцию DT (основное дерево устройств) в читаемый вид формата DTS (исходный файл для дерева устройств). Файл DTD платы Banana Pi BPI-M64 — sun50i-a64-bananapi-m64.dtb. Из него получим файл DTS, командой:

dtc -I dtb -O dts /boot/dtb/allwinner/sun50i-a64-bananapi-m64.dtb -o /boot/dtb/allwinner/sun50i-a64-bananapi-m64.dts

Теперь рассмотрим полученный файл sun50i-a64-bananapi-m64.dts.

Фрагмент узла /leds/, файл sun50i-a64-bananapi-m64.dts
Linux .NET IoT LED

Узел синего светодиода blue располагается в по пути /leds/, в этот узел необходимо добавить строку status = «disabled»;

Создадим файл DTS с названием sun50i-a64-led-blue-disabled.dts:

/dts-v1/;
/plugin/;

/ {
 compatible = "allwinner,sun50i-a64";
 
 fragment@0 {
  target-path = "/leds/";
  __overlay__ {
   blue {    
    //turn off the device
    status = "disabled";   
   };
  };
 };
};

Рассмотрим параметры:

  • target-path — путь по которому будет вставлен фрагмент fragment@0;
  • status — значение «disabled» выключает данное устройство.

Разместим файл по пути  /boot/dtb/allwinner/overlay . Затем компилируем файл .dts в .dtbo:

$ dtc -O dtb -o sun50i-a64-led-blue-disabled.dtbo sun50i-a64-led-blue-disabled.dts

Запустим утилиту конфигурирования платы:  armbian-config . Перейдем по меню: System > Hardware, и включим слой (overlay): led-blue-disabled. После перезагрузки платы, устройство gpio-leds по пути /leds/blue будет выключено.

Проверка управления синим светодиодом на GPIO143

После перезагрузки необходимо убедится в доступности GPIO143 для использования из пользовательского пространства (userspace). Выполним команду, которую уже выполняли выше  Способ 1. Просмотр раздела DEBUG в Sysfs) и включим светодиод командой gpioset

Результат выполнения команды:

Linux .NET IoT LED

В таблице линия GPIO143 не отобразилась, значит, она не используется ОС или каким либо приложением. С помощью команды gpioset, подали логическую «1» на линию 143 контроллера GPIO 1. Светодиод включился, каких либо сообщений об ошибке не было. В случае занятости линии утилита gpioset вывела бы сообщение об использование линии. Теперь переходим к .NET коду.

Подготовка устройства

На плате Banana Pi BPI-M64 должна быть установлена платформа .NET Runtime 5.0 и отладчик vsdbg, как это сделать указано в публикации Удаленная отладка приложения на .NET 5.0 в Visual Studio Code для ARM на примере Banana Pi BPI-M64 и Cubietruck (Armbian, Linux).

Подготовка среды запуска (ПК)

Отладку будем запускать из среды Visual Studio Code на ПК под ОС Windows 7. Как установить и настроить среду в публикации Создание первого приложения на .NET 5.0 в Visual Studio Code для ARM.

Управление светодиодом (LED) в Linux из .NET кода

Создадим .NET 5.0 консольное приложение — dotnet-iot-blink. Добавим Nuget-пакет System.Device.Gpio. В качестве основы возьмем пример Blink an LED.

Разместим в Program.cs следующий программный код, который будет включать, и выключать светодиод с интервалом в 1 секунду:

using System;
using System.Device.Gpio;
using System.Device.Gpio.Drivers;
using System.Threading;

namespace dotnet_iot_blink
{
 class Program
 {
  static void Main(string[] args)
  {   
   Console.WriteLine("Blinking LED.");
   //for Linux
   const int GPIOCHIP = 1;
   const int LED_PIN = 143; //GPIO143 - bananapi-m64:blue. Board: Banana Pi BPI-M64
   GpioController controller;
   var drvGpio = new LibGpiodDriver(GPIOCHIP);
   controller = new GpioController(PinNumberingScheme.Logical, drvGpio);
   //
   controller.OpenPin(LED_PIN, PinMode.Output);
   bool ledOn = true;
   while (true)
   {
    controller.Write(LED_PIN, ((ledOn) ? PinValue.High : PinValue.Low));
    Thread.Sleep(1000);
    ledOn = !ledOn;
   }
  }
 }
}

Описание кода:

  • GpioController — класс контроллера для управления контактами GPIO;
  • LibGpiodDriver(GPIOCHIP) — драйвер обертки библиотеки Libgpiod, в качестве аргумента указываем номер gpiochip;
  • GpioController(PinNumberingScheme.Logical, drvGpio) — инициализация контроллера, PinNumberingScheme.Logical — формат указания контактов. Есть два варианта, по названию контакта или по его номеру. Но т.к. названия контактов не заданы, то обращение будет только по номеру;
  • controller.OpenPin — открытие контакта и задание ему режима работы, PinMode.Output на вывод;
  • controller.Write(LED_PIN, PinValue.High | PinValue.Low) — выставление контакту LED_PIN  значение PinValue.High или PinValue.Low.

Демонстрация работы программного кода

Приложение dotnet-iot-blink на GitHub — .NET IoT Samples.

Литература

Вам также может понравиться

About the Author: Anton

Programistik