Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Контакты ввода-вывода общего назначения (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.
Подсказка
На схеме показана макетная плата и плата расширения GPIO для наглядности, но вы можете просто подключить контакт заземления и 21 контакт с помощью перемычки на Raspberry Pi.
При необходимости обратитесь к следующей схеме распиновки:
Изображение любезно Raspberry Pi Foundation.
Создание приложения
Выполните следующие действия в предпочтительной среде разработки:
Создайте консольное приложение .NET с помощью .NET CLI или Visual Studio. Назовите его InputTutorial.
dotnet new console -o InputTutorial cd InputTutorial
Добавьте в проект пакет System.Device.Gpio . Используйте .NET CLI из каталога проекта или Visual Studio.
dotnet add package System.Device.Gpio --version 3.2.0-*
Замените содержимое файла 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
гарантирует, что объект удаляется, а аппаратные ресурсы освобождаются должным образом.-
GpioController
создается экземпляр без параметров, указывая, что он должен определить, на какой аппаратной платформе он работает, и использовать схему логической нумерации выводов.
-
- Контакт GPIO 21 открыт с помощью
PinMode.InputPullUp
.- Это открывает контакт с задействованным резистором PullUp. В этом режиме, когда контакт подключен к земле, он возвратит
PinValue.Low
. Когда пин отключен от земли и цепь разомкнута, пин возвращается в состояниеPinValue.High
.
- Это открывает контакт с задействованным резистором PullUp. В этом режиме, когда контакт подключен к земле, он возвратит
- Начальное состояние записывается в консоль с помощью тернарного выражения. Текущее состояние пин-кода определяется с помощью
Read()
. ЕслиPinValue.High
, он записываетAlert
строку в консоль. В противном случае он записываетReady
строку. -
RegisterCallbackForPinValueChangedEvent()
регистрирует функцию обратного вызова для событийPinEventTypes.Rising
иPinEventTypes.Falling
на пине. Эти события соответствуют состояниям закрепленийPinValue.High
иPinValue.Low
соответственно. - Функция обратного вызова указывает на метод с именем
OnPinEvent()
.OnPinEvent()
использует другое тернарное выражение, которое также записывает соответствующиеAlert
илиReady
строки. - Основной поток будет бесконечно находиться в состоянии ожидания, ожидая событий пинов.
-
Инструкция using создает экземпляр
сборка приложения. При использовании .NET CLI выполните команду
dotnet build
. Чтобы выполнить сборку в Visual Studio, нажмите CTRL+SHIFT+B.Разверните приложение в SBC как автономное приложение. Инструкции см. в разделе "Развертывание приложений .NET в Raspberry Pi". Обязательно предоставьте исполняемому файлу разрешение на выполнение с помощью
chmod +x
.Запустите приложение на Raspberry Pi, переключившись в каталог развертывания и запустив исполняемый файл.
./InputTutorial
В консоли отображается текст, аналогичный следующему:
Initial status (05/10/2022 15:59:25): READY ✅
Отключите контакт 21 от земли. В консоли отображается текст, аналогичный следующему:
(05/10/2022 15:59:59) ALERT 🚨
Подключите повторно контакт 21 и землю. В консоли отображается текст, аналогичный следующему:
(05/10/2022 16:00:25) READY ✅
Завершите программу, нажав клавиши CTRL+C.
Поздравляю! Вы использовали GPIO для обнаружения входных данных с помощью System.Device.Gpio
пакета NuGet! Для этого типа входных данных используется множество способов. Этот пример можно использовать с любым сценарием, в котором коммутатор подключает или прерывает канал. Ниже приведен пример использования с магнитным переключателем, который часто используется для обнаружения открытых дверей или окон.
Лазерная вихра
Расширяя предыдущую концепцию примера немного дальше, давайте рассмотрим, как это может быть применено к созданию лазера 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!
Получение исходного кода
Источник этого руководства доступен на сайте GitHub.