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


Использование 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.

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

Диаграмма, показывающая распиновку 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 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 создает экземпляр . Объявление гарантирует, что объект удаляется, а аппаратные ресурсы освобождаются должным образом.
      • создается объект без параметров, указывающий, что ему следует определить, на какой аппаратной платформе он работает, и использовать схему нумерации логических пинов.
    • С помощью пин-кода GPIO открывается пин-код 21.
      • Откроется вывод с задействованным резистором PullUp. В этом режиме, когда пин-код подключен к земле, он возвращается . Когда пин-код отключен от земли и канал открыт, пин-код возвращается .
    • Начальное состояние записывается в консоль с помощью тернарного выражения. Текущее состояние пин-кода считывается с помощью . Если это так, он записывает строку в консоль. В противном случае он записывает строку.
    • регистрирует функцию обратного вызова для пин-кода и событий. Эти события соответствуют состояниям закреплений [первого состояния] и [второго состояния] соответственно.
    • Функция обратного вызова указывает на метод с именем . использует другое тернарное выражение, которое также записывает соответствующие или строки.
    • Основной поток будет бесконечно находиться в состоянии ожидания, ожидая событий пинов.
  4. сборка приложения. При использовании интерфейса командной строки .NET выполните dotnet build. Чтобы создать Visual Studio, нажмите клавиши Ctrl+Shift+B.

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

  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. Завершите программу, нажав клавиши CTRLC.

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

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

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

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

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

Примечание.

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

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

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

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

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

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

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

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

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

controller.OpenPin(pin, PinMode.InputPullDown);

Это важно

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

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

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

Источник этого руководства доступен на #REF!.

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

Узнайте, как считывать условия окружающей среды с датчика