Прошло много времени, но я, наконец, решил выпустить C#/.NET-версию моей оригинальной статьи Raspberry Pi / Low Voltage Labs о светофорах на Python (читать здесь).

Чтобы сделать это руководство отдельным, здесь будет повторно использован контент из предыдущей статьи. С момента написания этой статьи я также написал такое же упражнение с использованием Swift (Swift версия), Node.js (прочитайте об этом здесь), Node RED (попробуйте здесь), Java (попробуйте здесь ), Bash scripting (статья Bash), C (посмотрите здесь), а также для Arduino.

При написании этой статьи я нашел очень полезной статью Пита Галлахера Установка и использование Microsoft .NET 5 с Raspberry Pi (читать здесь).

Список покупок

Чтобы попробовать это, вам понадобится следующее (ссылки здесь в основном ведут на Adafruit, клиенты из Великобритании могут захотеть рассмотреть Pimoroni в качестве альтернативы из Великобритании, у Amazon есть почти все, если не все это):

  • Raspberry Pi (здесь я буду использовать Pi 3 Model B, но подойдет любая модель с контактами GPIO — если вы хотите использовать Pi Zero, вам нужно будет припаять к нему несколько разъемов). Я предполагаю, что у вас есть Pi 2, 3 или 4 с 40 контактами.
  • Источник питания для вашего Pi (для Raspberry Pi 4 требуется другой блок питания USB C)
  • Какой-то кейс, вероятно, является хорошей идеей для защиты Pi (но вам нужно будет снять крышку, чтобы открыть контакты GPIO для подключения ваших источников света)
  • Карта Micro SD для установки вашей операционной системы (или получите карту с предустановленной ОС). Если вы хотите установить операционную систему самостоятельно, вам понадобится компьютер Mac, ПК или Linux с устройством чтения SD-карт.
  • Набор Светофоры от Low Voltage Labs (две упаковки выгодны)
  • Любая USB-клавиатура для ввода текста на Pi, вам может понадобиться и мышь.
  • Любой дисплей HDMI для отображения вывода с Pi

Крепление светофоров

Светофоры Low Voltage Labs подключаются к Pi с помощью четырех контактов. Один из них должен быть заземлен, а остальные три являются фактическими контактами GPIO, используемыми для управления каждым из отдельных светодиодов.

Перед включением Pi подключите светофоры так, чтобы контакты подключались к контактам GPIO, выделенным красным:

Когда вы закончите, это будет выглядеть примерно так… (простой способ убедиться, что вы все сделали правильно, — найти индикаторы в левом ряду контактов, когда вы смотрите на Pi с портами USB внизу, затем отсчитайте 8 контактов вверх и прикрепите туда фонари).

Пока не включайте Pi, вам нужно будет сначала подготовить для него образ операционной системы…

Настройка операционной системы

Установите ОС Raspbian, которую можно скачать с официального сайта Raspberry Pi. Там же можно найти отличное руководство по установке, если вам понадобится помощь. Поскольку для этого проекта мне не нужен был полноценный графический рабочий стол, я выбрал версию Lite.

После того, как вы установили операционную систему, убедитесь, что вы можете войти в систему и у вас есть работающее проводное или Wi-Fi подключение к Интернету.

Теперь вы можете идти вперед и начать включать и выключать свет!

Установка зависимостей

Для начала нам нужно установить некоторые зависимости. К ним относятся git, а также некоторые библиотеки, которые требуются среде выполнения .NET:

$ sudo apt-get install git libunwind8 gettext apt-transport-https
$ git --version
git version 2.20.1

Установка пакета SDK для .NET

Далее мы хотим установить .NET SDK. Я использовал Raspberry Pi 3, поэтому мне нужна была версия ARM 32. На момент написания последней версией была 5.0.x, доступная у Microsoft здесь. Команда загрузки может отличаться, если доступны более новые исправления, но вот что я использовал:

$ wget https://download.visualstudio.microsoft.com/download/pr/f456f253-db24-45ea-9c73-f507f93a8cd2/6efe7bed8639344d9c9afb8a46686c99/dotnet-sdk-5.0.302-linux-arm.tar.gz

Разархивируйте SDK (опять же, имя файла может отличаться, если есть более поздняя версия):

$ gunzip dotnet-sdk-5.0.302-linux-arm.tar.gz

Затем установите его:

$ sudo mkdir /opt/dotnet-5.0.302
$ sudo tar xf dotnet-sdk-5.0.302-linux-arm.tar -C /opt/dotnet-5.0.302
$ sudo ln -s /opt/dotnet-5.0.302 /opt/dotnet
$ sudo ln -s /opt/dotnet/dotnet /usr/local/bin/dotnet

Убедитесь, что SDK был установлен правильно:

$ export DOTNET_ROOT=/opt/dotnet (add to ~/.bashrc if you like)
$ dotnet --version
5.0.302

Чтобы убедиться, что переменная среды DOTNET_ROOT всегда установлена, вы можете дополнительно изменить свой файл .bashrc (~/.bashrc), чтобы установить ее:

$ echo "export DOTNET_ROOT=/opt/dotnet" >> ~/.bashrc
$ . ~/.bashrc

Программирование светофоров

Я уже создал для вас проект .NET и код C#, так что нам просто нужно получить это с GitHub:

$ git clone https://github.com/simonprickett/dotnetpitrafficlights.git
$ cd dotnetpitrafficlights

Теперь добавьте пакет, который нам нужен для управления выводами GPIO Pi:

$ dotnet add package System.Device.Gpio

Теперь у нас есть все, что нам нужно, чтобы начать видеть какое-то действие, так что давайте начнем:

$ dotnet run

Если индикаторы подключены к правильным контактам GPIO, они должны начать мигать по образцу светофора в Великобритании (красный, красный + желтый, зеленый, желтый, красный). Если вы ничего не видите, убедитесь, что лампочки подключены к правильным контактам.

Чтобы выйти, нажмите Ctrl + C. Это приведет к выключению всех индикаторов и выходу программы.

Как это работает

Вот краткое руководство по полному исходному коду…

Строки 1–3 объявляют, какие пакеты мы будем использовать… мы хотим, чтобы System.Device.Gpio управлял выводами GPIO Pi, к которым подключены индикаторы. Мы также используем System.Threading для сна в течение определенного периода времени, прежде чем менять свет из одного состояния в другое.

Строки 11–13 объявляют некоторые константы, которые сопоставляют каждый индикатор с номером контакта GPIO, к которому он подключен.

В строке 15 мы объявляем новый экземпляр GpioController, который мы будем использовать для установки значений трех контактов GPIO. Строки 16-18 настраивают эти контакты как выходы, так как к каждому из них подключен свет (мы бы объявили их входами, если бы у нас была подключена, скажем, кнопка).

Функция allLightsOff в строке 20 — это служебная функция, которая выключает все три индикатора, записывая в них значение PinValue.Low (см. Документацию System.Device.Gpio).

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

Затем основной поток выполнения начинается со строки 31, сначала проверяя, что все индикаторы выключены. Код входит в бесконечный цикл, затем настраивает значения вывода каждого источника света на PinValue.High или PinValue.Low перед вызовом Thread.Sleep() для ожидания подходящего времени перед переходом в следующее состояние.

Всякий раз, когда пользователь заканчивает работу с программой и хочет вернуться в командную строку, он нажимает Ctrl-C. Это вызывает обработчик в строке 27 и выключает все индикаторы.

Я выложил полный исходный код на GitHub для вашего удовольствия.

Я хотел бы услышать, что вы делаете с Raspberry Pi — найди меня в Твиттере. Если вам понравилась эта статья, пожалуйста, поделитесь ею повсюду!