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


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

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

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

Предпосылки

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

Примечание.

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

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

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

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

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

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

Подсказка

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

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

Схема, показывающая распиновку заголовка GPIO Raspberry Pi. Изображение предоставлено Raspberry Pi Foundation.
Изображение любезно 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 add package System.Device.Gpio --version 3.2.0-*
    
  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 CLI выполните команду dotnet build. Чтобы выполнить сборку в Visual Studio, нажмите CTRL+SHIFT+B.

  5. Разверните приложение в SBC как автономное приложение. Инструкции см. в разделе "Развертывание приложений .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, демонстрирующий работу герконового переключателя. Переключатель приводится в действие магнитом, и приложение отображает ГОТОВ. Магнит удаляется, и приложение отображает ТРЕВОГА. Затем действие повторяется.

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

Расширяя предыдущую концепцию примера немного дальше, давайте рассмотрим, как это может быть применено к созданию лазера 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.

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