Прошло много времени, но я, наконец, решил выпустить 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 — найди меня в Твиттере. Если вам понравилась эта статья, пожалуйста, поделитесь ею повсюду!