Поделиться через


Использование GPIO для двоичного ввода

Контакты ввода-вывода общего назначения (GPIO) можно настроить для получения электрических сигналов в качестве входящих. На самом базовом уровне это полезно для сценариев, которые обнаруживают открытие или закрытие канала. Такие цепи могут включать кнопки, тумблеры, герконовые переключатели, прессостаты и другие устройства, которые представляют двоичные значения (вкл./выкл.), замыкая цепь.

В этом руководстве вы будете использовать .NET и пины GPIO Raspberry Pi для обнаружения открытия и закрытия канала.

Предпосылки

  • Компьютер на основе ARM (ARMv7 или более поздней версии) с одной платой (SBC)
  • Перемычки
  • Хлебная доска (необязательно)
  • Плата расширения GPIO для Raspberry Pi (необязательно)
  • SDK-пакет .NET версии 10 или более поздней

Примечание.

В этом руководстве предполагается, что целевое устройство — Raspberry Pi. Однако это руководство можно использовать для любого SBC на основе Linux, который поддерживает .NET, например Orange Pi, ODROID и многое другое.

Убедитесь, что SSH включен на устройстве. Для Raspberry Pi см. инструкции по настройке SSH-сервера в документации raspberry Pi.

Подготовка оборудования

Используйте аппаратные компоненты для построения канала, как показано на следующей схеме:

Схема, показывающая цепь, которая подключает контакт заземления к контакту 21.

На рисунке выше показано прямое соединение между заземляющим контактом и контактом 21.

Подсказка

На схеме показана макетная плата и плата расширения GPIO для наглядности, но вы можете просто подключить контакт заземления и 21 контакт с помощью перемычки на Raspberry Pi.

При необходимости обратитесь к следующей схеме распиновки:

Схема, показывающая распиновку заголовка Raspberry Pi GPIO. Изображение предоставлено любезно фондом Raspberry Pi.
Изображение любезно Raspberry Pi Foundation.

Создание приложения

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

  1. Создайте консольное приложение .NET с помощью .NET CLI или Visual Studio. Назовите его InputTutorial.

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. Добавьте в проект пакет System.Device.Gpio . Используйте .NET CLI из каталога проекта или Visual Studio.

    dotnet package add System.Device.Gpio --version 4.0.1
    
  3. Замените содержимое файла Program.cs кодом, приведенным ниже.

    using System.Device.Gpio;
    using System.Threading.Tasks;
    
    const int Pin = 21;
    const string Alert = "ALERT 🚨";
    const string Ready = "READY ✅";
    
    using var controller = new GpioController();
    controller.OpenPin(Pin, PinMode.InputPullUp);
    
    Console.WriteLine(
        $"Initial status ({DateTime.Now}): {(controller.Read(Pin) == PinValue.High ? Alert : Ready)}");
    
    controller.RegisterCallbackForPinValueChangedEvent(
        Pin,
        PinEventTypes.Falling | PinEventTypes.Rising,
        OnPinEvent);
    
    await Task.Delay(Timeout.Infinite);
    
    static void OnPinEvent(object sender, PinValueChangedEventArgs args)
    {     
        Console.WriteLine(
            $"({DateTime.Now}) {(args.ChangeType is PinEventTypes.Rising ? Alert : Ready)}");
    }
    

    В предыдущем коде:

    • Объявление using создает экземпляр GpioController. Объявление using гарантирует, что объект удаляется, а аппаратные ресурсы освобождаются должным образом.
      • Экземпляр класса создается без параметров, указывая на то, что он должен определить, на какой аппаратной платформе выполняется, и использовать схему логической нумерации выводов .
    • Контакт GPIO 21 открыт с помощью PinMode.InputPullUp.
      • Откроется выход с подключенным резистором PullUp. В этом режиме, когда контакт подключен к земле, он вернёт PinValue.Low. Когда вывод отключен от земли и цепь разомкнута, контакт переходит в состояние PinValue.High.
    • Начальное состояние записывается в консоль с помощью тернарного выражения. Текущее состояние пина читается с помощью Read(). Если PinValue.High, записывается строка Alert в консоль. В противном случае он записывает Ready строку.
    • RegisterCallbackForPinValueChangedEvent() регистрирует функцию обратного вызова для событий PinEventTypes.Rising и PinEventTypes.Falling на выводе. Эти события соответствуют состояниям закреплений PinValue.High и PinValue.Lowсоответственно.
    • Функция обратного вызова указывает на метод с именем OnPinEvent(). OnPinEvent() использует другое тернарное выражение, которое также записывает соответствующие Alert или Ready строки.
    • Основной поток будет бесконечно находиться в состоянии ожидания, ожидая событий пинов.
  4. сборка приложения. При использовании интерфейса командной строки .NET выполните dotnet build. Чтобы создать Visual Studio, нажмите клавиши Ctrl+Shift+B.

  5. Разверните приложение в SBC как автономное приложение. Инструкции см. в разделе Deploy .NET приложения в Raspberry Pi. Обязательно предоставьте исполняемому файлу разрешение на выполнение с помощью chmod +x.

  6. Запустите приложение на Raspberry Pi, переключившись в каталог развертывания и запустив исполняемый файл.

    ./InputTutorial
    

    В консоли отображается текст, аналогичный следующему:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Отключите контакт 21 от земли. В консоли отображается текст, аналогичный следующему:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Подключите повторно контакт 21 и землю. В консоли отображается текст, аналогичный следующему:

    (05/10/2022 16:00:25) READY ✅
    
  9. Завершите программу, нажав клавиши CTRL+C.

Поздравляю! Вы использовали GPIO для обнаружения входных данных с помощью System.Device.Gpio пакета NuGet! Для этого типа входных данных используется множество способов. Этот пример можно использовать с любым сценарием, в котором коммутатор подключает или прерывает канал. Ниже приведен пример использования с магнитным переключателем, который часто используется для обнаружения открытых дверей или окон.

Анимированный GIF-файл, демонстрирующий работу магнитного геркона, который открывается и закрывается. Переключатель подвергается воздействию магнита, и приложение отображает READY. Магнит убирается, и приложение отображает ALERT. Затем действие повторяется.

Лазерная вихра

Расширяя предыдущую концепцию примера немного дальше, давайте рассмотрим, как это может быть применено к созданию лазера tripwire. Для создания лазерной ловушки требуются следующие дополнительные компоненты:

  • Модуль лазерного датчика KY-008
  • Модуль датчика лазерного приемника (см. примечание ниже)
  • 2 10K Ω резисторов

Примечание.

Модуль датчика лазерного приемника — это универсальное имя, применяемое к общему модулю, найденном во многих интернет-магазинах. Устройство может отличаться по имени или производителю, но должно выглядеть так, как это изображение.

Изображение модуля датчика лазерного приемника

Подключите лазерное оборудование с датчиком пересечения линии

Подключите компоненты, как описано на следующей схеме.

Схема, показывающая канал, который получает входные данные из модуля датчика лазерного приемника.

Обратите внимание на резисторы 10k Ω. Они реализуют разделитель напряжения. Это связано с тем, что модуль лазерного приемника выводит 5V, чтобы указать, что луч разбит. Raspberry Pi поддерживает только до 3,3V для входных данных GPIO. Поскольку подача полного 5 В на контакт может повредить Raspberry Pi, ток от модуля приемника проходит через делитель напряжения, чтобы уменьшить напряжение до 2,5 В.

Применение обновлений исходного кода

Вы почти можете использовать тот же код, что и раньше, за исключением одного исключения. В других примерах мы использовали PinMode.InputPullUp, чтобы когда пин отключается от земли и цепь разомкнута, пин возвращается в состояние PinValue.High.

Однако в случае модуля лазерного приемника мы не обнаруживаем открытый канал. Вместо этого мы хотим, чтобы контакт действовал в качестве стока тока, поступающего из модуля лазерного приемника. В этом случае мы откроем пин с помощью PinMode.InputPullDown. Таким образом, контакт возвращает PinValue.Low, когда он не получает ток, и PinValue.High, когда он получает ток из модуля лазерного приемника.

controller.OpenPin(pin, PinMode.InputPullDown);

Это важно

Убедитесь в том, что код, развернутый на Raspberry Pi, учитывает это изменение, прежде чем тестировать лазерную растяжку. Программа работает без нее, но использование неправильного режима ввода рискует нанести ущерб raspberry Pi!

Анимированный GIF-файл, демонстрирующий работу лазерной сигнализации. Лазерный эмиттер освещает модуль лазерного датчика, а приложение отображает ГОТОВ. Лазерный луч прерывается, и приложение отображает ТРЕВОГА. Затем действие повторяется.

Получение исходного кода

Исходный код этого руководства доступен на GitHub.

Дальнейшие действия