dotnet nanoFramework

.NET nanoFramework — это бесплатная платформа с открытым исходным кодом, основанная на .NET и предназначена для малых встраиваемых устройств, микроконтроллеров. С её помощью можно разрабатывать различные устройства для Интернета вещей, носимые устройства, научные приборы, робототехнические устройства, можно создавать прототипы и даже использовать на промышленном оборудовании. В первой части мы познакомились с платформой .NET nanoFramework, её архитектурой, основными возможностями, посмотрели примеры программного кода. Теперь перейдем к практике, установим nanoFramework на микроконтроллеры серии ESP32 и STM32, напишем первый «Hello World!», поработаем с аппаратными интерфейсами, и оценим переносимость кода с «большого» .NET на платформу nanoFramework.

Для кого предназначена платформа nanoFramework?


Сейчас на рынке представлено большое количество самых разнообразных микроконтроллеров. Одна из самых известных на сегодняшний день это платформа Arduino, которая использует язык программирования C/C++. По степени удобства, легкости, простоте, nanoFramework ничуть не уступает платформе Arduino. Несмотря на небольшой возраст, nanoFramework уже работает на многих микроконтроллерах, с поддержкой отладки кода и точками останова в удобной IDE MS Visual Studio. nanoFramework просто идеальное решение для существующих .NET разработчиков, которые не хотят останавливаться на достигнутом и им тоже интересна разработка для Интернета вещей (IoT). Ведь все, что необходимо знать и уметь для программирования на nanoFramework, они уже знают и умеют. Программный код и библиотеки в большой степени переносимы один-к-одному, только необходимо учитывать малый объем RAM и низкую производительность процессора.

nanoFramework Visual Studio 2019
Отладка кода приложения на nanoFramework в Visual Studio 2019

Платформа nanoFramework отлично подходит и для сферы обучения. Нет ничего лучше, чем научиться разрабатывать приложения на C# для микроконтроллеров, где у тебя нет гигабайтов оперативной памяти и n-количества ядер процессора, вот тут начинаешь серьезно задумываться над оптимизацией алгоритмов.

И конечно nanoFramework подойдет всем тем, кто стремится к творчеству и хочет сделать свою жизнь более интересной и разнообразной, добавить в неё автоматизацию, роботов, и ИИ. Финансовые затраты для начала работы с nanoFramework составят не более стоимости чашки «кофа» в Starbucks (при условии покупки микроконтроллера ESP32). Для разработки используется бесплатная версия Visual Studio 2019 Community Edition. Все что от вас требуется, это терпение и упорство.

С момента публикации первой части прошло более полугода, с того времени произошли серьезные изменения. Первое, команда разработчиков обновила логотип. Шутка, на самом деле его действительно обновили, но ещё добавили новые функции и существенно расширили поддержку различных микроконтроллеров.

nanoFramework logo
Логотипы nanoFramework

Рассмотрим некоторые микроконтроллеры для платформы nanoFramework.

Поддержка устройств


Поддерживаемые устройства делятся на две категории: основные платы и поддерживаемые сообществом (дополнительная ссылка — GitHub nanoframework/nf-Community-Targets). В зависимости от устройства будут доступны все или только некоторые сборки (.NET Assemblies). При выборе обращайте внимание на поддерживаемые функции, такие как:  Gpio, Spi, I2c, Pwm, Adc, Dac, Serial, OneWire, CAN, Events, SWO, Networking, Large Heap и UI. Например, работа с графическими дисплеями в серии модулей ESP32 будет доступна только на тех, в состав которых входит память PSRAM (Pseudo static RAM).

Модуль ESP-WROOM-32 — самое простое и доступное решение для начала осваивания nanoFramework. На основе данного модуля построена отладочная плата ESP32 DevKit v1, стоимостью до $3.65. В основе модуля чип SoC ESP32-D0WDQ6 от компании Espressif, в него входит 2-ядерный 32-битный процессор Tensilica Xtensa LX6 с блоками памяти ROM на 448 КБ и SRAM на 520 КБ. На кристалле расположены беспроводные модули Wi-Fi/Bluetooth, датчик Холла и сенсор температуры, доступны интерфейсы: ШИМ, АЦП, ЦАП, I2C, SPI, UART/Serial, I2S.  Дополнительно модуль содержит Flash-память на 4 МБ.

nanoFramework ESP32 DevKit
Отладочная плата ESP32 DevKit v1

При выборе модуля, возможно, вы встретите обозначение не ESP-WROOM-32, а
ESP32-WROOM-32U или ESP32-WROOM-32D. Разница заключается в следующем:
  • ESP32-WROOM-32U — модуль ESP-WROOM-32 с подключением внешней антенны;
  • ESP32-WROOM-32D — модуль ESP-WROOM-32 c встроенной антенной в виде змейки на самой плате.

Важно! Обычно на отладочной плате с модулем ESP-WROOM-32 размещают две кнопки EN и Boot. Кнопка EN — перезагрузка, Boot — ручной перевод микроконтроллера в режим загрузки прошивки. При нажатие кнопки Boot, контакт GPIO0 на микроконтроллере замыкается на Землю(GND), и в терминале можно увидеть следующий текст:
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x7 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download

ESP32 ESP-WROOM-32
Кнопки EN и Boot на плате с модулем ESP-WROOM-32

У некоторых пользователей модулей ESP-WROOM-32 без кнопки Boot, исходя из сообщений на форумах, возникают проблемы с переключением микроконтроллера в режим прошивки, поэтому лучше приобретайте модули с наличием кнопки Boot на плате. Но это касается модулей первой версии/ревизии, в третьей ревизии для прошивки нажимать кнопку Boot не обязательно. Далее этот момент будет подробно рассмотрен в пункте выбора прошивки.

Недавно команда разработчиков nanoFramework сообщила, что следующие прошивки для устройств ESP32 будут основаны на системе сборки ESP-IDF 4.3.1. Это означает поддержку микроконтроллеров всей серии ESP32, включая: ESP32_S2, ESP32_S3, ESP32_C3 (RISC-V). Новая система сборки позволяет легко добавлять новые библиотеки и функции в nanoFramework, которые доступны или предоставляются ESP-IDF. Теперь у двухъядерных чипов ESP32 задействованы оба ядра для работы кода. Был успешно перенесен компонент mbedTLS из ESP-IDF без потери оптимизации и использования аппаратных блоков (криптографические вычисления, генерации случайных чисел и т. д.). Конфигурация сети, профили Wi-Fi, CA корневые сертификаты и сертификаты устройств X509 теперь доступны для использования также на всей серии ESP32 устройств.

Если вам не хватает количества контактов GPIO, то можно выбрать один из микроконтроллеров поддерживаемых сообществом — STM32. Например, отладочная плата ST Nucleo64 F411RE на базе SoC Cortex-M4@100 MHz с блоками памяти ROM на 512 КБ и SRAM на 128 КБ. Дополнительно на плате размещены контакты для подключения Arduino-совместимых модулей. По стоимости плата уже существенно дороже ESP32, на торговых площадках продается от $29 и выше.

ST Nucleo64 F411RE
Плата ST Nucleo64 F411RE

Библиотеки классов


В связи с малыми аппаратными возможностями микроконтроллеров, в отличие от .NET IoT, у каждого класса библиотек есть соответствующий Nuget пакет. Все пакеты добавляются с помощью системы Nuget, как это принято в .NET Core. Рассмотрим подробно библиотеки классов для представления возможностей платформы. Все библиотеки делятся на общие для всех устройств и на специальные, предназначенные для конкретных микроконтроллеров или серии устройств. Классы, имеющие название, например System.Device.Gpio совместимы с .NET IoT для Linux, а с названием Windows.Device.Gpio совместимы с Windows IoT Core. Полный список библиотек в документации
Class Libraries. Documentation — nanoFramework.

Библиотеки .NET nanoFramework (xlsx, pdf)

Таблица библиотек .NET nanoFramework
Библиотека класса /название Nuget пакета Описание
Базовые (Bases)
Base Class Library (nanoFramework.CoreLibrary) известный как mscorlib, базовый класс для платформы
nanoFramework.Runtime.Events (nanoFramework.Runtime.Events) поддержка событий
nanoFramework.Runtime.Native (nanoFramework.Runtime.Native) поддержка низкоуровневых функций, таких как управление сборщиком мусора (GC — garbage collection), электропитание, часы реального времени и получение системной информации об устройстве
System.Threading (nanoFramework.System.Threading) поддержка многопоточности
System.Math (nanoFramework.System.Math) поддержка математических функций
System.Text (nanoFramework.System.Text) поддержка кодирования/декодирования текста и класса StringBuilder
System.Text.RegularExpressions (nanoFramework.System.Text.RegularExpressions) поддержка регулярных выражений
System.Collections (nanoFramework.System.Collections) поддержка коллекций: ArrayList, Dictionary, Queue (очередь), Stack (стек). Так же поддерживается работа через интерфейсы: Ienumerable, Ienumerator и т. д.
nanoFramework.Json (nanoFramework.Json) сериализация/десериализация в JSON
nanoFramework.ResourceManager (nanoFramework.ResourceManager) управление ресурсами приложения
Microsoft.Extensions.Logging (nanoFramework.Logging) логирование (совместим с Microsoft.Extensions.Logging)
Аппаратные интерфейсы (Hardware interfaces)
System.Device.Gpio (nanoFramework.System.Device.Gpio) поддержка управления контактами GPIO (general-purpose input/output)
Windows.Device.Gpio (nanoFramework.Windows.Devices.Gpio) поддержка управления контактами GPIO (general-purpose input/output)
System.Device.Dac (nanoFramework.System.Device.Dac) поддержка ЦАП (цифро-аналогового преобразователя), digital-to-analog converter,DAC
Windows.Devices.Adc (nanoFramework.Windows.Devices.Adc) поддержка АЦП (аналого-цифрового преобразователя),  analog-to-digital converter, ADC
System.Device.I2c (nanoFramework.System.Device.I2c) поддержка протокола I2C (Inter-Integrated Circuit) — последовательная шина данных для связи интегральных схем, использующая две двунаправленные линии связи (SDA и SCL).
Windows.Devices.I2c (nanoFramework.Windows.Devices.I2c) поддержка протокола I2C (Inter-Integrated Circuit) — последовательная шина данных для связи интегральных схем, использующая две двунаправленные линии связи (SDA и SCL).
System.Device.Spi (nanoFramework.System.Device.Spi) поддержка шины SPI (Serial Peripheral Interface). Подключаются высокоскоростные устройства такие как LCD дисплеи, сетевые карты, и т. д.
Windows.Devices.Spi (nanoFramework.Windows.Devices.Spi) поддержка шины SPI (Serial Peripheral Interface). Подключаются высокоскоростные устройства такие как LCD дисплеи, сетевые карты, и т. д.
nanoFramework.Devices.OneWire (nanoFramework.Devices.OneWire) поддержка протокола OneWire, можно подключить например датчик температуры DS18B20
System.IO.Ports (nanoFramework.System.IO.Ports) поддержка последовательных портов COM
Windows.Devices.SerialCommunication (nanoFramework.Windows.Devices.SerialCommunication) поддержка последовательных портов COM
System.Device.Pwm (nanoFramework.System.Device.Pwm) поддержка ШИМ (широтно-импульсной модуляции), pulse-width modulation PWM. Используется для управления яркости LCD дисплеев, и регулирования скорости работы двигателей
Windows.Devices.Pwm (nanoFramework.Windows.Devices.Pwm) поддержка ШИМ (широтно-импульсной модуляции), pulse-width modulation PWM. Используется для управления яркости LCD дисплеев, и регулирования скорости работы двигателей
nanoFramework.Devices.Can (nanoFramework.Devices.Can) поддержка протокола CAN (Controller Area Network) — это промышленный стандарт, позволяющий осуществить объединение в единую сеть различных узлов, механизмов, датчиков и т. п.
Сеть (Networking)
Windows.Devices.WiFi (nanoFramework.Windows.Devices.WiFi) поддержка протокола Wi-Fi. Доступно сканирование точек доступа (AP) и подключение к ним
System.Net (nanoFramework.System.Net) поддержка сети. Доступна работа с DNS, веб-прокси, поддерживаются сокеты и SSL-шифрование
System.Net.Http (nanoFramework.System.Net.Http) поддержка http-протокола
System.Net.Http.Client (nanoFramework.System.Net.Http.Client) поддержка http клиента
System.Net.WebSockets (nanoframework.System.Net.WebSockets) поддержка WebSocket
System.Net.Http.Server (nanoFramework.System.Net.Http.Server) поддержка http сервера. Можно создать свой Web-сервер для обеспечения удаленного управления устройством
nanoFramework.WebServer (nanoFramework.WebServer) «упрощенная версия» ASP.NET, REST API
nanoFramework.Networking (nanoFramework.Networking.Sntp) поддержка клиента протокола SNTP (Simple Network Time Protocol), позволяет удаленно управлять устройством по данному протоколу, поддержка является де-факто стандартом для коммутаторов, маршрутизаторов, концентраторов  и т. д.
nanoFramework.Azure.Devices (nanoFramework.Azure.Devices.Client) клиент Azure IoT Devices
Хранение данных (Storage)
System.IO.FileSystem (nanoFramework.System.IO.FileSystem) поддержка файловых систем, работа с microSD и MMC памятью
Windows.Storage (nanoFramework.Windows.Storage) поддержка хранения файлов на носителях
Windows.Storage.Streams (nanoFramework.Windows.Storage.Streams) классы потоковой записи/чтения данных на носитель
Графический интерфейс (GUI)
nanoFramework.Graphics (nanoFramework.Graphics) поддержка вывода графики на дисплей и UI
System.Drawing (nanoFramework.System.Drawing) работа с графикой
Аппаратно-зависимые (Hardware dependent)
nanoFramework.Hardware.Esp32 (nanoFramework.Hardware.Esp32) аппаратные функции Esp32 такие, как управление режимами засыпания устройства
nanoFramework.Hardware.Esp32.Rmt (nanoFramework.Hardware.Esp32.Rmt) поддержка удаленного управления RMT (Remote Control)
nanoFramework.M5Stack (nanoFramework.M5Stack) аппаратные функции M5Stack, такие как управление встроенным LCD
nanoFramework.Hardware.Stm32 (nanoFramework.Hardware.Stm32) аппаратные функции Stm32
nanoFramework.Hardware.TI (nanoFramework.Hardware.TI) аппаратные функции TI(Texas Instruments) такие как управление электропитанием
nanoFramework.TI.EasyLink (nanoFramework.TI.EasyLink) аппаратные функции TI EasyLink
Сторонние (Third party)
Amqp.* (AMQPNetLite.nanoFramework) поддержка протокола AMQP (Advanced Message Queuing Protocol) для брокеров-сообщений, например для RabbitMQ
Amqp.* (AMQPNetMicro.nanoFramework) поддержка протокола AMQP (Advanced Message Queuing Protocol) для брокеров-сообщений, например для RabbitMQ
nanoFramework.M2Mqtt (nanoFramework.m2mqtt) поддержка протокола MQTT. Протокол обмена сообщениями по шаблону издатель-подписчик (pub/sub)


Драйвера датчиков


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

Полный список поддерживаемых датчиков представлен в документации List and category of devices. Devices — nanoFramework. С примерами GitHub nanoFramework.IoT.Device/devices.

Установка расширения


Для разработки приложений для nanoFramework потребуется Microsoft Visual Studio Community 2019 Version 16.11, установленная платформа .NET, ОС Windows 10 (в Windows 7 не открывается панель Device Explorer). Расширение устанавливается стандартно, через меню: Extensions -> Manage Extensions. Название расширения: .NET nanoFramework VS2019 Extension.

Extension nanoFramework
Расширение nanoFramework для Microsoft Visual Studio

После установки расширения появится окно Device Explorer (меню View -> Other Windows -> Device Explorer). В этом окне наиболее важные всего три кнопки: Ping Device, Device Capabilities, Erase App.

nanoFramework Device Explorer
Панель Device Explorer расширения nanoFramework

Команды:
  • Ping Device — проверяет доступность подключенного устройства/микроконтроллера;
  • Device Capabilities — выводит в консоль список возможностей устройства;
  • Erase App — удаляет загруженное приложение (nanoFramework остается на месте).

Загрузка среды nanoFramework в микроконтроллер ESP-WROOM-32


Для возможности исполнения .NET кода на микроконтроллере, необходимо его прошить соответствующей прошивкой nanoFramework. Прошивка осуществляется с помощью утилиты nanoFirmwareFlasher. Установим драйвера для микроконтроллера, утилиту и прошьем устройство.

Шаг 1 — Установка драйвера для моста CP2102 USB to UART


Если при подключении отладочной платы ESP32 DevKit v1 по USB вы видите, что в Диспетчере устройств  микроконтроллер находится в узле Другие устройства, значит необходимо установить драйвер.

Device Manager ESP32
Диспетчер устройств

Загружаем драйвер с официального сайта CP210x USB to UART Bridge VCP Drivers и устанавливаем. После установки драйвера, микроконтроллер доступен на порту COM3.

Device Manager ESP32
Диспетчер устройств

Шаг 2 — Установка утилиты nanoFirmwareFlasher


Теперь устанавливаем утилиту nanoFirmwareFlasher, для этого запускаем командную строку от имени Администратора и выполняем команду:
dotnet tool install -g nanoff

Для вызова справки выполнить команду:
nanoff --help

Обновление утилиты выполняется следующей командой:
dotnet tool update -g nanoff


Шаг 3 — Вывод идентификационной информации для отладочной платы


Иногда бывает сложно понять, какой перед тобой микроконтроллер из серии ESP32, особенно если он пришел с китайской площадки. Поэтому до прошивки можно вывести идентификационную информацию на экран командой:
nanoff --platform esp32 --serialport COM3 --devicedetails

где параметр --platform указывает на Target платформы, --serialport — номер COM порта, в данном случае COM3.

Результат выполнения команды:

nanoFramework ESP32
Идентификационная информация отладочной платы

Когда будет появляться фиолетовая строка "*** Hold down the BOOT/FLASH button in ESP32 board ***", то в этот момент необходимо нажать на плате кнопку Boot, иначе команда не выполнится.

Из вывода видим, что на плате установлен чип ESP32-D0WDQ6 с 4 Мб Flash памяти, на борту есть Wi-Fi и BT.

Шаг 4 — Выбор прошивки


Теперь переходим к самому сложному шагу. Для серии ESP32 существует несколько различных прошивок (ESP32 Firmware versions). Espressif выпускает чипы SoC, затем на их основе формирует модули. Обратимся к описанию ESP32-S Series на официальном сайте. Модули серии ESP32 выпускаются на базе чипов:
  • ESP32-D0WD-V3 (третья версия/ревизия);
  • ESP32-D0WD (первая версия/ревизия — старый вариант);
  • ESP32-D0WDQ6 (первая версия/ревизия — старый вариант);
  • и другие.

Чипы ESP32-D0WD и ESP32-D0WDQ6 по функциональности ничем не отличаются, различие заключается только в форм-факторе самого чипа.

Рассмотрим различия между модулями. Существуют модули версии ESP32-WROOM и ESP32-WROVER, эти модули выпускаются как на базе ESP32-D0WD-V3, так и на ESP32-D0WD. Модуль ESP32-WROVER отличается от ESP32-WROOM только наличием памяти PSRAM. PSRAM — это дополнительный напаянный чип RAM помимо встроенной памяти. Обычно указывается в описании к плате и бывает размером 2 или 8 Мб. Дополнительная оперативная память необходима, если подключаете дисплей для вывода UI используя WPF (поддерживается в модулях ESP-WROVER-KIT с LCD ILI9341 на SPI интерфейсе).

Доступные прошивки (target) nanoFramework:
  • ESP32_REV0 — (DEV) подходит для всех плат ESP32 без поддержки PSRAM;
  • ESP32_REV3 — (DEV) подходит для всех плат ESP32 с чипом ESP32 версии/ревизии 3 без поддержки PSRAM;
  • ESP32_PSRAM_REV0 — (DEV) подходит для всех плат ESP32 с поддержкой PSRAM;
  • ESP32_PSRAM_REV3 — (DEV) подходит для всех плат ESP32 с чипом ESP32 версии/ревизии 3 и поддержкой PSRAM;
  • ESP32_WROOM_32 — подходит для всех плат ESP32 c поддержкой PSRAM, но не поддерживает Bluetooth BLE из-за ограничений памяти в разделе IRAM, вызванных исправлениями PSRAM;
  • ESP32_WROOM_32_BLE — подходит для всех плат ESP32, поддерживает Bluetooth BLE, но PSRAM отключен;
  • ESP32_WROOM_32_V3_BLE — подходит для всех плат ESP32 с чипом ESP32 версии/ревизии 3, одновременно поддерживается PSRAM и Bluetooth BLE;
  • ESP32_PSRAM_REV3_ILI9341 — (упоминается в документации, но прошивка не найдена) подходит для всех плат ESP32 с чипом ESP32 версии/ревизии 3 и поддержкой PSRAM, включает драйвер для LCD ILI9341;
  • ESP32_PSRAM_REV3_ILI9342 — (упоминается в документации, но прошивка не найдена) подходит для всех плат ESP32 с чипом ESP32 версии/ревизии 3 и поддержкой PSRAM, включает драйвер для LCD ILI9342;
  • ESP_WROVER_KIT — специальный вариант для отладочной платы ESP WROVER KIT. Включает в себя функции UI, поддержку PSRAM и драйвер для SPI LCD ILI9341;
  • ESP32_PICO — подходит для всех плат ESP32 с ESP32 PICO без поддержки PSRAM, например ESP32-PICO-KIT и M5Stack ATOM;
  • ESP32_PICO_ST7735S — (упоминается в документации, но прошивка не найдена) подходит для платы ESP32 PICO, включает драйвер для LCD ST7735S;
  • ESP32_PICO_ST7789V — (упоминается в документации, но прошивка не найдена) подходит платы для M5Stick C Plus, включает драйвер для LCD ST7789V;
  • ESP32_REV0_ILI9342 — (упоминается в документации, но прошивка не найдена) подходит платы для M5Stack, включает драйвер для ILI9342;
  • ESP32_LILYGO — специальный вариант для отладочной платы LilyGO ESP32, включает поддержку Ethernet PHY.

Перенесем из документации сводную таблицу основных прошивок с описанием опций:
Название прошивки Wi-Fi Ethernet Bluetooth PSRAM (Large heap) ESP32 version
WROOM_32 ✔️ ✔️ 0 -> 3
WROOM_32_BLE ✔️ ✔️ 0 -> 3
WROOM_32_V3_BLE ✔️ ✔️ ✔️ version 3 only
ESP_WROVER_KIT ✔️ ✔️ 2 Mb heap + Graphics 0 -> 3
EP32_PICO ✔️ ✔️ 0 -> 3
ESP32_LILYGO ✔️ ✔️ ✔️ 0 -> 3

Рассмотрим информацию о чипе модуля ESP32 DevKit v1 (скриншот в предыдущем шаге):
  • Отладочная плата построена на чипе ESP32-D0WDQ6 первой ревизии;
  • Включена поддержка Wi-Fi, BT;
  • Модуль PSRAM недоступен.

Исходя из полученной информации, подойдут прошивки: ESP32_REV0 и ESP32_WROOM_32_BLE. Из двух прошивок выбираем ESP32_WROOM_32_BLE, т. к. поддержка Bluetooth BLE будет не лишней.

Если вы не знаете какую прошивку выбрать, то подойдет универсальная прошивка ESP32_REV0 и ESP32_PSRAM_REV0.

Полный каталог прошивок представлен в Repository: nanoframework-images. Список прошивок только для серии Espressif ESP32 Series. Общий список прошивок GitHub nanoframework/nf-interpreter.

Шаг 5 — Прошивка ESP-WROOM-32


Для прошивки необходимо подключить отладочную плату и выполнить команду:
nanoff --update --target ESP32_WROOM_32_BLE --serialport COM3

где параметр --target указывает на идентификатор прошивки, --serialport — номер COM порта, в данном случае COM3.

Результат выполнения команды:

nanoFramework firmware ESP-WROOM-32
Прошивка ESP-WROOM-32

Если прошивка не загрузится с репозитория, то можно повторить операцию или загрузить её со страницы ESP32_WROOM_32_BLE, и распаковать, например по пути: «c:\nanofw». В архиве будет несколько файлов:

nanoFramework firmware ESP-WROOM-32
Распакованная прошивка для ESP-WROOM-32

Для прошивки устройства, используя локальную прошивку, выполнить команду:
nanoff --update --clrfile "C:\nanofw\nanoCLR.bin" --serialport COM3

где параметр --clrfile — путь к файлу nanoCLR.bin, --serialport — номер COM порта, в данном случае COM3.

Не забываем во время прошивки нажимать на кнопку «Boot». Устройство готово для загрузки .NET программ!

Создание первого приложения


Запустим Visual Studio 2019 Community Edition и откроем окно Device Explorer. Выполним команду Device Capabilities. В результате выполнения команды в консоль будет выведена информация о возможностях микроконтроллера.

nanoFramework ESP-WROOM-32
Информация о возможностях ESP-WROOM-32

Полный список вывода команды Device Capabilities для ESP-WROOM-32
System Information
HAL build info: nanoFramework running @ ESP32
Target: ESP32_WROOM_32_BLE
Platform: ESP32

Firmware build Info:
Date: Aug 25 2021
Type: MinSizeRel build with IDF v3.3.5
CLR Version: 1.7.0.618
Compiler: GNU ARM GCC v5.2.0

OEM Product codes (vendor, model, SKU): 0, 0, 0

Serial Numbers (module, system):
00000000000000000000000000000000
0000000000000000

Target capabilities:
Has nanoBooter: NO
IFU capable: NO
Has proprietary bootloader: YES

AppDomains:

Assemblies:

Native Assemblies:
mscorlib v100.5.0.12, checksum 0x132BDB6F
nanoFramework.Runtime.Native v100.0.8.0, checksum 0x2307A8F3
nanoFramework.Hardware.Esp32 v100.0.7.2, checksum 0x1B75B894
nanoFramework.Hardware.Esp32.Rmt v100.0.3.0, checksum 0x9A53BB44
nanoFramework.Hardware.Esp32.Ble v100.0.0.0, checksum 0x1B75B894
nanoFramework.Devices.OneWire v100.0.3.4, checksum 0xA5C172BD
nanoFramework.Networking.Sntp v100.0.4.4, checksum 0xE2D9BDED
nanoFramework.ResourceManager v100.0.0.1, checksum 0xDCD7DF4D
nanoFramework.System.Collections v100.0.0.1, checksum 0x5A31313D
nanoFramework.System.Text v100.0.0.1, checksum 0x8E6EB73D
nanoFramework.Runtime.Events v100.0.8.0, checksum 0x0EAB00C9
EventSink v1.0.0.0, checksum 0xF32F4C3E
System.IO.FileSystem v1.0.0.0, checksum 0x3112D24C
System.Math v100.0.5.2, checksum 0xC9E0AB13
System.Net v100.1.3.4, checksum 0xC74796C2
Windows.Devices.Adc v100.1.3.3, checksum 0xCA03579A
System.Device.Dac v100.0.0.6, checksum 0x02B3E860
System.Device.Gpio v100.1.0.4, checksum 0xB6D0ACC1
Windows.Devices.Gpio v100.1.2.2, checksum 0xC41539BE
Windows.Devices.I2c v100.2.0.2, checksum 0x79EDBF71
System.Device.I2c v100.0.0.1, checksum 0xFA806D33
Windows.Devices.Pwm v100.1.3.3, checksum 0xBA2E2251
Windows.Devices.SerialCommunication v100.1.1.2, checksum 0x34BAF06E
System.IO.Ports v100.1.1.3, checksum 0x61B8380C
Windows.Devices.Spi v100.1.4.2, checksum 0x360239F1
System.Device.Spi v100.1.0.0, checksum 0x48031DC5
Windows.Devices.Wifi v100.0.6.2, checksum 0xA94A849E
Windows.Storage v100.0.2.0, checksum 0x954A4192

++++++++++++++++++++++++++++++++
++ Memory Map ++
++++++++++++++++++++++++++++++++
Type Start Size
++++++++++++++++++++++++++++++++
RAM 0x3ffe436c 0x00016800
FLASH 0x00000000 0x00400000

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ Flash Sector Map ++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Region Start Blocks Bytes/Block Usage
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0 0x00010000 1 0x180000 nanoCLR
1 0x00190000 1 0x230000 Deployment
2 0x003C0000 1 0x040000 Configuration

+++++++++++++++++++++++++++++++++++++++++++++++++++
++ Storage Usage Map ++
+++++++++++++++++++++++++++++++++++++++++++++++++++
Start Size (kB) Usage
+++++++++++++++++++++++++++++++++++++++++++++++++++
0x003C0000 0x040000 (256kB) Configuration
0x00010000 0x180000 (1536kB) nanoCLR
0x00190000 0x230000 (2240kB) Deployment

Deployment Map
Empty

Из полученных данных наиболее важен список Native Assemblies. Данный список содержит сборки, которые мы можем использовать в своем проекте, все остальные библиотеки необходимо включать в проект в виде исходного кода. Дополнительно можно сформировать прошивку со своими нативными сборками на C++, но как это сделать будет в продолжении.

Создадим новое приложение, выберем тип проекта: Blank Application (nanoFramework).

nanoFramework Blank Application
Шаблон проекта Blank Application (nanoFramework)

Шаблонный проект выведет отладочное сообщение в консоль.

nanoFramework Blank Application
Шаблонный проект nanoFramework

Запустим проект на отладку

debugging nanoFramework
Отладка проекта nanoFramework

В окне отладки будет выведено сообщение: «Hello from nanoFramework!».

Отлично, первое приложение запущено! Далее запустим стандартную программу мигания светодиодом.

Мигаем встроенным светодиодом


На плате ESP32 DevKit v1 размещён встроенный светодиод, подключенный к контакту GPIO2. Запустим программу Blink, аналогичную как на Arduino. Для этого создадим новый проект nanoframework-esp32-blink, и добавим Nuget-пакет: nanoFramework.System.Device.Gpio. Исходный код возьмем из проекта GitHub nanoframework/Samples — Blinky.

Файл Program.cs.
public class Program
{
  private static GpioController s_GpioController;
  public static void Main()
    {
      s_GpioController = new GpioController();
      // ESP32 DevKit: 4 is a valid GPIO pin in, some boards 
      // like Xiuxin ESP32 may require GPIO Pin 2 instead.
      GpioPin led = s_GpioController.OpenPin(2,PinMode.Output);
      led.Write(PinValue.Low);
      while (true)
      {
        led.Write(PinValue.High);
        Thread.Sleep(1000);
        led.Write(PinValue.Low);
        Thread.Sleep(1000);
      }
    }
}

Разберем пример:
  • s_GpioController = new GpioController() — инициализирует объект контроллера доступа к GPIO;
  • GpioPin led = s_GpioController.OpenPin(2,PinMode.Output) — метод OpenPin переводит контакт GPIO2 в режим вывода;
  • led.Write(PinValue.Low) — подает логический «0» на контакт;
  • led.Write(PinValue.High) — логическая «1», подано напряжение в 3.3V.

Демонстрация работы программного кода:

Любое устройство взаимодействует с внешним миром и нуждается в управлении, теперь добавим кнопку и реализуем новую логику.

Использование событий, устройство — кнопка


К микроконтроллеру подключим кнопку и реализуем следующую логику: встроенный светодиод загорается и остается в положение включено при удержании нажатой кнопки. При отпускание кнопки светодиод гаснет. Светодиод будем использовать тот же контакт GPIO2. Кнопку подключим к контакту GPIO25, на плате обозначен как "D25". Создадим новый проект nanoframework-esp32-button, и добавим Nuget-пакет: nanoFramework.System.Device.Gpio.

nanoFramework ESP32 STM32
Отладочная плата ESP32 DevKit v1 с подключенной кнопкой

Схема подключения кнопки к контакту D25 отладочной платы ESP32 DevKit v1
ESP32 DevKit button

Файл Program.cs.
using System;
using System.Diagnostics;
using System.Threading;
using System.Device.Gpio;

namespace nanoframework_esp32_button
{   
  public class Program
  {
    //Board: ESP32 DevKit
    static GpioController s_GpioController;
    static int s_BluePinNumber=2;    
    static int s_UserButtonPinNumber=25;
    public static void Main()
    {
      s_GpioController = new GpioController();
      //setup blue LED
      s_GpioController.OpenPin(s_BluePinNumber, PinMode.Output);
      s_GpioController.Write(s_BluePinNumber, PinValue.Low);
      //setup user button      
      s_GpioController.OpenPin(s_UserButtonPinNumber, PinMode.Input);
      //s_GpioController.OpenPin(s_UserButtonPinNumber, PinMode.InputPullUp);
      //Event registration
      s_GpioController.RegisterCallbackForPinValueChangedEvent(
        s_UserButtonPinNumber,
        PinEventTypes.Falling | PinEventTypes.Rising,
        UserButton_ValueChanged);      
      //Infinite
      Thread.Sleep(Timeout.Infinite);      
    }

    private static void UserButton_ValueChanged(object sender, PinValueChangedEventArgs e)
    {
      // read Gpio pin value from event
      Debug.WriteLine("USER BUTTON (event) : " + e.ChangeType.ToString());
      Debug.WriteLine("USER BUTTON (event) : " + ((((int)e.ChangeType) == 1) ? "Rising" : "Falling"));
      //if (e.ChangeType != PinEventTypes.Rising) //for DFRobot
      if (e.ChangeType == PinEventTypes.Rising)
      {
        s_GpioController.Write(s_BluePinNumber, PinValue.High);
      }
      else
      {
        s_GpioController.Write(s_BluePinNumber, PinValue.Low);
      }
    }
  }
}

Разберем пример:
  • s_GpioController.OpenPin(s_UserButtonPinNumber, PinMode.Input) — открывает контакт кнопки и выставляет режим работы на ввод (сигнал поступает от кнопки). Если необходимо исключить считывание внешних наводок, то можно использовать подтяжку к питанию PinMode.InputPullUp (не все контакты ввода поддерживают);
  • s_GpioController.RegisterCallbackForPinValueChangedEvent — обработка прерывания реализуется путем добавление Callback на изменение состояние контакта. Callback регистрируется в контроллере GPIO. Указываем номер контакта -  s_UserButtonPinNumber, событие срабатывание — Falling (изменение с «1» на «0») или Rising (изменение с «0» на «1»), название функции обработки — UserButton_ValueChanged.

Демонстрация работы программного кода:

Основной принцип работы с nanoFramework понятен, теперь вернемся к микроконтроллеру ST Nucleo64 F411RE и прошьем его средой nanoFramework, и запустим простую программу использующую светодиод и кнопку.

Загрузка среды nanoFramework в микроконтроллер ST Nucleo64 F411RE


Шаг 1 — Подключение ST Nucleo64 F411RE


До подключение микроконтроллеров STM32 необходимо установить драйвер для отладчика/программатора ST-Link, для этого устанавливаем драйвер ST-LINK USB driver signed for Windows 7-10 и подключаем устройство. После подключения в Диспетчере устройств должно появиться устройство ST-Link Debug.

Device Manager STM32
Диспетчер устройств

Выполним команду обнаружения устройств ST-Link:
nanoff --listjtag

Результат выполнения команды:

Device Manager STM32 ST-Link
Обнаруженные устройства ST-Link

Если плата появилась в списке, то можно переходить к следующему шагу.

Шаг 2 — Обновление прошивки ST-Link


Если мы попытаемся загрузить nanoFramework в микроконтроллер, то возможно появится подобная ошибка, которая говорит о необходимости обновления прошивки ST-Link Debug.

update ST-Link Debug
Сообщение о необходимости обновления прошивки ST-Link Debug

Загружаем и запускаем STM32 ST-LINK utility. Выбираем в меню ST-LINK -> Firmware update.

update ST-Link Debug
STM32 ST-LINK utility

Нажимаем на кнопку Device Connect, затем Yes >>>>

update ST-Link Debug
STM32 ST-LINK utility

Если прошивка успешно загрузиться будет сообщение Update succesfull.

update ST-Link Debug
STM32 ST-LINK utility

Если на этом этапе возникнут трудности, то можете посмотреть видео-инструкцию ST Link Update — Web learning.

Шаг 3 — Прошивка ST Nucleo64 F411RE


Для прошивки необходимо выполнить команду:
nanoff --update --target ST_NUCLEO64_F411RE_NF --jtag

где параметр --target указывает на идентификатор прошивки ST_NUCLEO64_F411RE_NF.

nanoFramework ST Nucleo64 F411RE
Прошивка ST Nucleo64 F411RE

Теперь запустим Visual Studio Community и выполним команду Device Capabilities.

nanoFramework ST Nucleo64 F411RE
Информация о возможностях ST Nucleo64 F411RE

Полный список вывода команды Device Capabilities для ST Nucleo64 F411RE
System Information
HAL build info: nanoCLR running @ ST_NUCLEO64_F411RE_NF
Target: ST_NUCLEO64_F411RE_NF
Platform: STM32F4

Firmware build Info:
Date: Oct 22 2021
Type: MinSizeRel build with ChibiOS v21.6.0.6
CLR Version: 1.7.0.96
Compiler: GNU ARM GCC v9.3.1

OEM Product codes (vendor, model, SKU): 0, 0, 0

Serial Numbers (module, system):
00000000000000000000000000000000
0000000000000000

Target capabilities:
Has nanoBooter: YES
nanoBooter: v21845.21845.21845.21845
IFU capable: NO
Has proprietary bootloader: NO

AppDomains:

Assemblies:
nanoframework_stm32_button, 1.0.0.0
mscorlib, 1.10.5.4
nanoFramework.Runtime.Events, 1.9.1.3
Windows.Devices.Gpio, 1.5.2.3

Native Assemblies:
mscorlib v100.5.0.12, checksum 0x132BDB6F
nanoFramework.Runtime.Native v100.0.8.0, checksum 0x2307A8F3
nanoFramework.Hardware.Stm32 v100.0.4.4, checksum 0x0874B6FE
nanoFramework.ResourceManager v100.0.0.1, checksum 0xDCD7DF4D
nanoFramework.System.Collections v100.0.0.1, checksum 0x5A31313D
nanoFramework.System.Text v100.0.0.1, checksum 0x8E6EB73D
nanoFramework.Runtime.Events v100.0.8.0, checksum 0x0EAB00C9
EventSink v1.0.0.0, checksum 0xF32F4C3E
System.Math v100.0.5.2, checksum 0xC9E0AB13
Windows.Devices.Adc v100.1.3.3, checksum 0xCA03579A
Windows.Devices.Gpio v100.1.2.2, checksum 0xC41539BE
Windows.Devices.I2c v100.2.0.2, checksum 0x79EDBF71
System.Device.I2c v100.0.0.1, checksum 0xFA806D33
Windows.Devices.SerialCommunication v100.1.1.2, checksum 0x34BAF06E
System.IO.Ports v100.1.2.0, checksum 0x564F2452
Windows.Devices.Spi v100.1.4.2, checksum 0x360239F1
System.Device.Spi v100.1.0.0, checksum 0x48031DC5

++++++++++++++++++++++++++++++++
++ Memory Map ++
++++++++++++++++++++++++++++++++
Type Start Size
++++++++++++++++++++++++++++++++
RAM 0x20000000 0x00020000
FLASH 0x08000000 0x00080000

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ Flash Sector Map ++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Region Start Blocks Bytes/Block Usage
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0 0x08000000 1 0x004000 nanoBooter
1 0x08004000 3 0x004000 nanoCLR
2 0x08010000 1 0x010000 nanoCLR
3 0x08020000 1 0x020000 nanoCLR
4 0x08040000 2 0x020000 Deployment

+++++++++++++++++++++++++++++++++++++++++++++++++++
++ Storage Usage Map ++
+++++++++++++++++++++++++++++++++++++++++++++++++++
Start Size (kB) Usage
+++++++++++++++++++++++++++++++++++++++++++++++++++
0x08000000 0x004000 (16kB) nanoBooter
0x08004000 0x03C000 (240kB) nanoCLR
0x08040000 0x040000 (256kB) Deployment

Deployment Map
Empty

Из полученных данных видно, что nanoCLR работает на ChibiOS v21.6.

Запуск тестового примера со светодиодом и кнопкой на ST Nucleo64 F411RE


В отличие от ESP32, на плате дополнительно ещё размещена кнопка, которую можно программировать под свои задачи. Светодиод на плате обозначен меткой LD2 (Green LED), кнопка — B1 (USER). Добавим немного другую логику работы отличную от примера для ESP32, встроенный светодиод загорается и выключается по нажатию на кнопку.

ST Nucleo64 F411RE led button
Светодиод LD2 (Green LED) и кнопка B1 USER на плате ST Nucleo64 F411RE

Создадим новый проект nanoframework-stm32-button, и добавим Nuget-пакет: nanoFramework.Windows.Devices.Gpio. Обратите внимание, пакет отличается от предыдущего примера, название — nanoFramework.Windows.*. Как было сказано выше, API библиотек в которых присутствует Windows.*, совпадают с .NET на Windows IoT Core, которая работает на Raspberry Pi. Поэтому возьмем готовый код Push button — Raspberry Pi, с сайта MS. Из изменений в коде будут только другие номера контактов (c Raspberry Pi не совпадают).

Светодиод LD2 (Green LED) подключен к контакту Arduino D13, что соответствует STM32 I/O PA5 (pin 21). Контакт кнопки  B1 USER соответствует STM32 I/O PC13 (pin 2). В STM32 принято обращение к контактам по названию. Контакт PA5, где P — port, A-литера порта, 5 — номер контакта. Поэтому в программный код дополнительно будет добавлена функция конвертации буквенного обозначения контактов в номерной — int PinNumber(char port, byte pin). Описание контактов GitHub nanoframework/nf-Community-Targets/ChibiOS/ST_NUCLEO64_F411RE_NF/.

Файл Program.cs.
using System;
using System.Diagnostics;
using System.Threading;
using Windows.Devices.Gpio;

namespace nanoframework_stm32_button
{
  public class Program
  {
    private static int LED_PIN;
    private static int BUTTON_PIN;
    private static GpioPin ledPin;
    private static GpioPin buttonPin;    
    private static GpioPinValue ledPinValue = GpioPinValue.High;
    public static void Main()
    {      
      // ST Nucleo64 F411RE: PA5 is LED_GREEN
      LED_PIN = PinNumber('A', 5);
      // ST Nucleo64 F411RE: PC13 is B1_USER
      BUTTON_PIN = PinNumber('C', 13);
      //Next as .NET for Raspberry Pi, Windows IoT Core
      //Controller
      var gpio = new GpioController();
      //Init
      ledPin = gpio.OpenPin(LED_PIN);
      ledPin.SetDriveMode(GpioPinDriveMode.Output);
      buttonPin = gpio.OpenPin(BUTTON_PIN);
      buttonPin.SetDriveMode(GpioPinDriveMode.Input);
      // Initialize LED to the OFF state by first writing a HIGH value
      // We write HIGH because the LED is wired in a active LOW configuration
      ledPin.Write(ledPinValue);      
      // Check if input pull-up resistors are supported
      if (buttonPin.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
        buttonPin.SetDriveMode(GpioPinDriveMode.InputPullUp);
      else
        buttonPin.SetDriveMode(GpioPinDriveMode.Input);
      // Set a debounce timeout to filter out switch bounce noise from a button press
      buttonPin.DebounceTimeout = TimeSpan.FromMilliseconds(50);
      // Register for the ValueChanged event so our buttonPin_ValueChanged 
      // function is called when the button is pressed
      buttonPin.ValueChanged += buttonPin_ValueChanged;
      //Infinite
      Thread.Sleep(Timeout.Infinite);
    }

    static void buttonPin_ValueChanged(object sender, GpioPinValueChangedEventArgs e)
    {
      Debug.WriteLine("USER BUTTON (event) : " + ((e.Edge ==GpioPinEdge.RisingEdge)? "RisingEdge" : "FallingEdge"));      
      // toggle the state of the LED every time the button is pressed
      if (e.Edge == GpioPinEdge.FallingEdge)
      {
        ledPinValue = (ledPinValue == GpioPinValue.Low) ?
          GpioPinValue.High : GpioPinValue.Low;
        ledPin.Write(ledPinValue);
      }
    }
      
    static int PinNumber(char port, byte pin)
    {
      if (port < 'A' || port > 'J')
        throw new ArgumentException();
      return ((port - 'A') * 16) + pin;
    }
  }
}

Разберем пример:
  • int PinNumber(char port, byte pin) — функция конвертации буквенного обозначения контактов в номерной;
  • gpio.OpenPin(LED_PIN) — открывает контакт для его использования;
  • ledPin.SetDriveMode(GpioPinDriveMode.Output) — установка направления работы контакта — вход/выход (GpioPinDriveMode.Input/GpioPinDriveMode.Output);
  • ledPin.Write(ledPinValue) — подает логический «0»GpioPinValue.Low или «1»(GpioPinValue.High) на контакт;
  • buttonPin.IsDriveModeSupported(GpioPinDriveMode.InputPullUp) — проверка наличия подтягивающего резистора (pull-up);
  • buttonPin.SetDriveMode(GpioPinDriveMode.InputPullUp) — включение режима работы контакта на ввод с поддержкой pull-up;
  • buttonPin.DebounceTimeout — интервал в течение которого не будут регистрироваться события (необходимо для исключения дребезга контактов);
  • buttonPin.ValueChanged — подпись на событие изменения состояния;
  • void buttonPin_ValueChanged — функция, которая вызывается при изменение состояния кнопки. Свойство e.Edge принимает значение GpioPinEdge.RisingEdge(изменение с «0» на «1»), или GpioPinEdge.FallingEdge (изменение с «1» на «0»).

Демонстрация работы программного кода:

Подключение датчика BME280 к шине I2C


Модуль BME280 фирмы Bosch Sensortec предназначен для измерения атмосферного давления, температуры и влажности. По сравнению с первыми датчиками серии (BMP085 и BMP180), он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.

Назначение контактов:
  • VCC — питание модуля 3.3 В или 5 В;
  • GND —  Ground;
  • SCL — линия тактирования (Serial CLock);
  • SDA — линия данных (Serial Data).

Модуль работает по двухпроводному интерфейсу I2C, адрес по умолчанию 0x76. Данный датчик уже был использован в проекте Метеостанция на Banana Pi M64 (Linux, C#, Docker, RabbitMQ, AvaloniaUI), поэтому детальнее ознакомится с характеристиками и шиной I2C можно по вышеуказанной ссылке. Подключим датчик BME280 к отладочной плате ESP32 DevKit v1.

ESP32 DevKit BME280
Отладочная плата ESP32 DevKit v1 с датчиком BME280

Схема подключения BME280 к шине I2C отладочной платы ESP32 DevKit v1
ESP32 DevKit BME280

Создадим новый проект nanoframework-esp32-bme280, и добавим для работы с шиной I2C Nuget-пакет: nanoFramework.System.Device.I2c. Драйвер для работы с BME280 возьмем с каталога драйверов nanoFramework.IoT.Device — BMxx80 Device Family. Перенесем драйвер в папку /libs/. Дополнительно команда разработчиков nanoFramework для работы с физическими величинами используют библиотеку UnitsNet.

Файл Program.cs. Инициализация датчика BME280.
// when connecting to an ESP32 device, need to configure the I2C GPIOs
// used for the bus
Configuration.SetPinFunction(21, DeviceFunction.I2C1_DATA);
Configuration.SetPinFunction(22, DeviceFunction.I2C1_CLOCK);
// bus id on the MCU
const int busId = 1;
I2cConnectionSettings i2cSettings = new(busId, Bme280.SecondaryI2cAddress);
  
using I2cDevice i2cDevice = I2cDevice.Create(i2cSettings);
using Bme280 bme80 = new Bme280(i2cDevice)
{
  // set higher sampling
  TemperatureSampling = Sampling.LowPower,
  PressureSampling = Sampling.UltraHighResolution,
  HumiditySampling = Sampling.Standard,
};

// set this to the current sea level pressure in the area for correct altitude readings
Pressure defaultSeaLevelPressure = WeatherHelper.MeanSeaLevel;

Разберем пример:
  • Configuration.SetPinFunction(21, DeviceFunction.I2C1_DATA) — функция из пространства имен nanoFramework.Hardware.Esp32. В связи с работой nanoFramework на различных микроконтроллерах, например для работы с I2C, требуется дополнительное  конфигурирования контактов. В данном случае для шины I2C с идентификатором «1», передача данных DATA определяется на GPIO21;
  • busId = 1 — идентификатор шины I2C — 1;
  • new I2cConnectionSettings(busId, Bme280.SecondaryI2cAddress) — создание конфигурации устройства I2C, указывается идентификатор шины I2C и адрес устройства(0x76);
  • I2cDevice.Create(i2cSettings) — создание I2C устройства;
  • new Bme280(i2cDevice) — инициализация датчика BME280;
  • TemperatureSampling, PressureSampling, HumiditySampling — указание точности измерений физических величин;
  • WeatherHelper.MeanSeaLevel — для определения уровня высоты указывается точка отсчета от уровня моря.

Файл Program.cs. Чтение данных с датчика BME280.
// Perform a synchronous measurement
var readResult = bme80.Read();

// Note that if you already have the pressure value and the temperature, you could also calculate altitude by using
// var altValue = WeatherHelper.CalculateAltitude(preValue, defaultSeaLevelPressure, tempValue) which would be more performant.
bme80.TryReadAltitude(defaultSeaLevelPressure, out var altValue);

Debug.WriteLine($"Temperature: {readResult.Temperature.DegreesCelsius}\u00B0C");
Debug.WriteLine($"Pressure: {readResult.Pressure.Hectopascals}hPa");
Debug.WriteLine($"Altitude: {altValue.Meters}m");
Debug.WriteLine($"Relative humidity: {readResult.Humidity.Percent}%");

Разберем пример:
  • bme80.Read() — чтение показаний датчика;
  • bme80.TryReadAltitude — получение значения высоты над уровнем моря;
  • readResult.Temperature, readResult.Pressure, readResult.Humidity — получение данных температуры, давления, влажности.

Запустим проект:

nanoFramework BME280
Чтение данных с датчика BME280 на nanoFramework

Для вывода данных планировалось подключить OLED-дисплей SSD1306 с разрешением 128х64 точек. Но как оказалось, не все так просто. Существует два варианта данного дисплея, только с шиной I2C и шиной I2C/SPI. Именно второй вариант был приобретен. Особенностью управления по шине I2C варианта I2C/SPI являлось наличие дополнительного контакта для инициализации. Была перенесена логика инициализации с примера для Arduino, но видимо что-то пошло не так и инициализация не удалась. Поэтому при использовании в проектах nanoFramework подключайте SSD1306 только с шиной I2C (драйвер — SSD13xx & SSH1106 OLED display family). Вместо датчика BME280 можно использовать альтернативный более простой BMP180 — barometer, altitude and temperature sensor.

Сравнение переносимости кода между проектами .NET IoT для Linux и nanoFramework


Основой для nanoFramework послужил проект .NET Micro Framework, который впоследствии Microsoft прекратила развивать. Компания GHI Electronics единственная продолжательница исходного .NET Micro Framework сохранившая преемственность старого кода. Разработчики nanoFramework поступила иначе, они взяли главную идею и структуру внутренней реализации, но откинув прошлое, реализовали платформу совместимую по интерфейсам API с «большим» фреймворком .NET IoT. Это сразу решило множество задач:
  • Разработчики решений .NET IoT могут писать код для nanoFramework без необходимости переучивания;
  • Драйвера к датчикам из .NET IoT практически без изменений можно перенести в nanoFramework;
  • Объединенная кодовая база дает двойное преимущество. В одном устройстве можно реализовать сопряжение одноплатного компьютера и микроконтроллера используя платформу .NET с общими классами.

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

В качестве примера проверки совместимости, для проекта на .NET IoT был взял драйвер/класс кнопки Button (nanoFramework.IoT.Device), позволяющий подписываться на события одиночного и двойного клика, с фильтрацией дребезга кнопки. Классы драйвера Button в проект dotnet-iot-button-from-nanoframework были перенесены без какого либо изменения, располагаются по пути /libs/Button/.

dotnet iot button
Кнопка для проекта dotnet-iot-button-from-nanoframework

Кнопка подключена на контакт GPIO38 одноплатного компьютера Banana Pi BPI-M64, как и в проекте Управляем контактами GPIO из C# .NET 5 в Linux на одноплатном компьютере Banana Pi M64 (ARM64) и Cubietruck (ARM32). В Program.cs добавим следующий код:

Файл Program.cs.
//for Linux
const int GPIOCHIP = 1;
const int BUTTON_PIN = 38;
GpioController controller;
var drvGpio = new LibGpiodDriver(GPIOCHIP);
controller = new GpioController(PinNumberingScheme.Logical, drvGpio);

// Initialize a new button with the corresponding button pin
GpioButton button = new(buttonPin: BUTTON_PIN,controller);

Debug.WriteLine("Button is initialized, starting to read state");
....

Единственное отличие от nanoFramework, исключая другие номера контактов, заключается в выборе драйвера для доступа к GPIO. В ОС в качестве драйвера можно выбирать: LibGpiodDriver, RaspberryPi3Driver и  SysFsDriver. Далее со строки GpioButton button = new(buttonPin: BUTTON_PIN,controller), все вызовы функций  в исходном коде не отличаются от реализации для nanoFramework. Все работает без исключений!

dotnet iot Visual Studio Code
Запуск проекта в Visual Studio Code с драйвером Button из nanoFramework в проекте .NET IoT для Linux

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

Итог


В свое время проект Arduino взорвал рынок программирования для микроконтроллеров, в одно мгновение выяснилось, что для управления контактами GPIO, работы с шиной I2C и сетью, не требуется мозга размером с вселенную. Разрабатывать небольшие устройства могут и школьники, то что раньше было просто невозможно, оказалось вполне себе реализуемым. Большой популярностью Arduino обязан двум вещам, это скрытие сложной внутренней реализации без ущерба функциональности управления устройством и легкости программирования, используя Arduino IDE. Проект nanoFramework достиг той же высоты. Теперь до прошивки устройства, вы можете выяснить спецификацию и выбрать подходящую прошивку. Процесс прошивки не требует особых познаний, главное установить драйвера для моста UART и вовремя нажимать на кнопку Boot, а в некоторых случаях и этого не требуется.  Для написания кода  необходимо установить бесплатную Visual Studio 2019 Community и расширение .NET nanoFramework VS2019 Extension. В Visual Studio доступна интерактивная отладка с просмотром содержимого переменных, что более чем достаточно для комфортного кодинга. Управление устройствами в nanoFramework так же удобно, как и в решение GHI Electronics, за исключение работы не ниже ОС Windows 10.

Сама платформа nanoFramework дает возможность работы с различными микроконтроллерами, скрывая всю  сложную реализацию. Причем если используете микроконтроллеры на ChibiOS, то на уровне ОС можете реализовать модули требующие более быстрого отклика, и вызывать необходимые функции ОС из nanoFramework, сочетая быструю скорость вместе с удобным программирование на C#.

Проект nanoFramework быстро развивается, поэтому документирование новых функций пока не поспевает за темпами разработки. Из отрицательных моментов, не понравилась структура проектов-драйверы для датчиков  — GitHub nanoFramework.IoT.Device/devices. Драйверы ссылаются на классы из папки /src/, которые можно было разместить в общих сборках для nanoFramework. Это несколько ломает красивую структуру. Некоторые драйверы (для BME280), содержат лишние зависимости пакетов, например на — Nerdbank.GitVersioning. Это удобно, если вы занимаетесь тестирование и сборкой проектов для CI и публикации, но если вам необходимо просто скачать и добавить драйвер для своего проекта под ESP32, то это лишние проблемы и сложности, в особенности для новичков.

Очень порадовало существенное расширение перечня микроконтроллеров серии ESP32. Теперь вы можете выбрать себе отладочную плату на свой вкус и цвет.

Что дальше?


Одной из сильных сторон nanoFramework заключается в отличной поддержки сетевых протоколов из коробки. Даже есть «упрощенная версия» ASP.NET — библиотека nanoFramework.WebServer. Создание Wi-Fi сканера, Web API, отправка данных в облако, работа с брокерами сообщений RabbitMQ, будет в продолжении. И конечно же подключим LCD экран для интерактивного взаимодействия с устройством.

Дополнение. Отладочная плата TTGO T-Energy с модулем ESP32-WROVER-B


Когда пост уже был закончен пришла отладочная плата на базе модуля ESP32-WROVER-B. Полное наименование платы — LILYGO TTGO T-Energy ESP32 8MByte PSRAM WiFi & Bluetooth Module 18650 Battery ESP32-WROVER-B Development Board.

nanoFramework ESP32-WROVER-B ESP32-D0WD-V3
Идентификационная информация отладочной платы

На скриншоте можно увидеть наименование чипа ESP32-D0WD-V3 последней версии/ревизии чипа ESP32. Утилита почему-то не распознала наличие PSRAM в модуле объемом 8 Мбайт.

Ресурсы




Комментарии (115)


  1. neco
    18.11.2021 13:11
    +1

    а отладка в студии работает? breakpoint, watch, по шагам и т.д...?


    1. devzona Автор
      18.11.2021 16:54

      Конечно. Первый скриншот как раз показывает точку останова и просмотр текущих значений переменных во время работы. Единственное необходимо помнить, что не все платы поддерживаемые сообществом реализуют все функции nanoFramework, включая отладку.


  1. GospodinKolhoznik
    18.11.2021 13:33
    +7

    Нет ничего лучше, чем научиться разрабатывать приложения на C# для микроконтроллеров, где у тебя нет гигабайтов оперативной памяти и n-количества ядер процессора

    Есть кое что лучше - научиться разрабатывать такие приложения, которые умеют с пользой задействовать n ядер процессора.


    1. devzona Автор
      18.11.2021 23:50

      Подразумевалась естественная мотивация для написания более оптимального кода, не учёл рассмотрение этого момента с другой стороны)


      1. GospodinKolhoznik
        19.11.2021 19:09
        +1

        Да вы всё правильно написали. Это я так, о наболевшем - параллельные и конкурентные программы зело сложны!


      1. Shvedov
        01.12.2021 09:09

        Там не может быть оптимального кода, там интерпретатор... ардуино рвёт его в клочья.

        А так, да, память экономить можно, и процессорные циклы. В nF каждый If стоит столько, что диву даёшься.


        1. devzona Автор
          01.12.2021 18:58

          Я так посмотрю Вы прям эксперт в области программирования, особенно понравилась фраза "ардуино рвёт его в клочья". У вас есть конкретные результаты тестов или вы как попугай повторяете что уже было сказано? Нет там никакого интерпретатора, и быть не может. Сборка компилируется в байт-код для среды исполнения nanoCLR.


          1. Shvedov
            01.12.2021 19:11

            Я в старой статье писал уже Вам, что разберитесь сначала, как оно работает. Байт-код как раз и интерпретируется. Экспертом Вы тут прикидываетесь...

            Если код читать не умеете, то посмотрите на название репозитория: https://github.com/nanoframework/nf-interpreter


            1. devzona Автор
              01.12.2021 19:20

              А результаты тестов будут? Если Вы такой грамотей, то что в вашем портфолио нет ни одного поста? Вы же себя считаете профессионалом. Или вы написать пост не в состоянии, максимум интеллекта хватает только строчить комментарии?


              1. Shvedov
                01.12.2021 19:43

                А результаты тестов будут?

                https://github.com/nanoframework/CoreLibrary/pull/12/commits/f8bfad4e9ba656d669fcaf16d5345efbc5c225de

                Если Вы такой грамотей, то что в вашем портфолио нет ни одного поста?

                А не люблю я посты писать, что ж поделать, таким уродился... Или это неотъемлемая часть становления человека?

                Вы же себя считаете профессионалом

                Простите, где я такое писал? Считать себя профессионалом это звёздочку словить, ЧСВ тешить. Профессионалом не сам становишься, а другие величать начинают.

                Или вы написать пост не в состоянии

                Зачем? Вы же написали, спасибо Вам за это, я просто указал на неточности. Хотите можем приватно подискутировать, приглашаю на официальный Discord nanoFramework. Там можно много чего узнать про реализацию nF.

                максимум интеллекта хватает только строчить комментарии?

                Ох, юношеский максимализм, простите, что поджёг Вам пукан.


                1. devzona Автор
                  01.12.2021 20:05

                  https://github.com/nanoframework/CoreLibrary/pull/12/commits/f8bfad4e9ba656d669fcaf16d5345efbc5c225de

                  Что-то по вашей ссылке нет никаких тестов сравнения платформ, вообще она ссылается на commit.

                  Или это неотъемлемая часть становления человека?

                  Безусловно. Иначе цена его жизни = 0. Каждый человек в течение жизни получает полезный опыт который он может передать потомкам или поведать обществу, или что-то должен сделать значимое. Если Вам поведать не о чем, тогда понятно.


                  1. Shvedov
                    02.12.2021 00:41

                    Что-то по вашей ссылке нет никаких тестов сравнения платформ, вообще она ссылается на commit.

                    Там и написано, что компилированный код работает в 5 раз быстрее интерпретируемого. И причём тут платформа, когда я говорил об Arduino на ESP32. Посмотрите код библиотеки, везде вызывается компилированный C, а на C# всего несколько функций, включая мой коммит.

                    Каждый человек в течение жизни получает полезный опыт который он может передать потомкам или поведать обществу, или что-то должен сделать значимое.

                    Тут я с Вами полностью согласен, но один из главных критериев, что опыт должен быть положительный. А Ваша статья вводит людей в заблуждение, так сказать искажает его черед призму и амбиции рассказчика, позволяет сделать не верные выводы. Результат статьи потраченное время зря, как и большинство материалов в Интернет. Комментарии под статьёй подтверждают мои выводы. При этом nF очень хорош для прототипирования и DIY, но реально коммерцию делать можно на простых задачах, аля современные стартапы по формуле 1 идея = 1 девайс. У nF ещё очень много ограничений, с которыми будет не приятно столкнуться в проде, но о которых Вы красиво умолчали... И на всякий случай, я пишу на нём, мне нравится, но я прекрасно осознаю его нишу.

                    Если Вам поведать не о чем, тогда понятно.

                    То есть у меня нет статей на хабре и мне поведать не о чём получается? Лол, у Вас какой-то узкий слишком мирок. Ну и смотря на Ваш ограниченный круг мышления, что тот же сталевар, не пишет статьи, значит он бесполезен? Профессию можно заменить на любую другую, не из современных.


                    1. devzona Автор
                      06.12.2021 03:20

                      При этом nF очень хорош для прототипирования и DIY, но реально коммерцию делать можно на простых задачах, аля современные стартапы по формуле 1 идея = 1 девайс.

                      Время покажет.

                      У nF ещё очень много ограничений, с которыми будет не приятно столкнуться в проде, но о которых Вы красиво умолчали

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

                      тот же сталевар, не пишет статьи, значит он бесполезен

                      Сталевар в отличие от Вас конкретным делом занимается и приносит людям пользу.


                      1. Shvedov
                        06.12.2021 14:01

                        Сталевар в отличие от Вас конкретным делом занимается и приносит людям пользу.

                        Так и я не программист :)


                    1. devzona Автор
                      06.12.2021 03:25

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

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


                      1. Shvedov
                        06.12.2021 14:17

                        Спасибо за уделённую честь, но это уже лишнее...


          1. predator86
            01.12.2021 22:42

            Сборка компилируется в байт-код для среды исполнения nanoCLR.
            Почему не стали компилировать в машинный код?


            1. Shvedov
              02.12.2021 00:43

              Не умеет, только интерпретация. Иначе бы порты рождались с муками в десятилетия.


              1. predator86
                02.12.2021 01:22

                Ни кто не пробовал сравнить с TinyCLR? Интересно кто лучше?


                1. Shvedov
                  02.12.2021 02:46

                  А как? Там вендорлок на их SITCore и закрытый код. Я бы в продакт не запустил, они переобуваются на лету. Тем более они все из .NET Micro Framework выросли.


                  1. devzona Автор
                    06.12.2021 03:31

                    Но не смотря на это кто-то же покупает модули для разработки, наверное, им стоило бы Вас послушать что так делать не надо.


  1. Carburn
    18.11.2021 13:50
    +3

    Нет ничего лучше, чем научиться разрабатывать приложения на C# для микроконтроллеров, где у тебя нет гигабайтов оперативной памяти и n-количества ядер процессора

    Зачем для моргания светодиодов гигабайты оперативной памяти?


    1. fedorro
      18.11.2021 14:06
      +7

      Абстракции хранить.


      1. GospodinKolhoznik
        18.11.2021 14:44
        +5

        Light-Emitting Diode Enterprise Edition


  1. PR200SD
    18.11.2021 14:08
    +1

    Есть же ESP-IDF с кучей готовых примеров, поддержкой от производителя, почему все пытаются начать программировать esp на php, js...?


    1. Illivion
      18.11.2021 14:26
      +3

      Код на таких языках как C# писать много быстрее и проще. Сам писал под ESP и на C++ и на C#, и для себя решил, что C++ это боль. Создавая код на C++ постоянно раздражаешься от излишних сложностей. Даже такие мелочи как объявления методов отдельно от реализации, необходимость соблюдения порядка методов в классе в порядке их вызова начинают бесить после опыта с C#. Ну и отсутствие нормальных проверенных библиотек для C++ IoT приводит к трате тонн времени на написание и отладку собственных велосипедов. В итоге постоянно прорубаешься через джунгли с мачете вместо того чтобы проехать по шоссе эффективной разработки с C#.

      А так как большинство задач IoT сейчас совсем не про экономию памяти или тактов процессора, а про скорость разработки, наглядность и доступность в изучении, то потому и выбор в основном в сторону более доступных языков и платформ.


      1. Evengard
        18.11.2021 15:07
        +2

        Вы забыли наверное самое главное - автоматическое управление памятью.


        1. Illivion
          18.11.2021 15:36

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


      1. Carburn
        20.11.2021 19:58

        Почему в Arduino не разрабатывал? Там можно вызывать методы до объявления и заголовочные файлы не нужны.


        1. Illivion
          20.11.2021 20:18

          Arduino это уже чересчур примитивно для более-менее серьезной задумки. IDE в целом никакая, а уж организация проекта в виде одного файла это вообще непонятно какими инвалидами придумано.


          1. Carburn
            20.11.2021 20:35

            Что значит организация проекта в виде одного файла? В Arduino IDE можно добавить вкладки для нескольких файлов.


    1. devzona Автор
      18.11.2021 17:09
      +1

      Потому что такие платформы как nanoFramework позволяют обеспечить кроссплатформенность между различными микроконтроллерами. Рассмотрим такую ситуацию. Допустим, некий предприниматель нанял разработчиков для создания одного устройства и в качестве МК выбрали один из серии ESP32. В какой-то момент времени главный разработчик сказал предпринимателю, что возможностей ESP32 им не хватает, необходимо использовать STM32. Что в этом случае делать предпринимателю? Сделать в устройстве гибрид двух МК ESP32 и STM32, или все заново переписать? Возможность переноса кода между различными аппаратными платформами существенно развязывает руки в первую очередь бизнесу. Если вдруг поставщик МК существенно повысит цены, то можно с минимальными потерями перейти на другой МК. Мало того, программный код переносим между МК и .NET IoT под Linux. Вы можете написать код на C# и перенести его с Raspberry Pi на nanoFramework, и наоборот. С нативной платформой от производителя МК вы таких фокусов не добьетесь.


      1. mctMaks
        19.11.2021 10:49

        и в качестве МК выбрали один из серии ESP32. В какой-то момент времени главный разработчик сказал предпринимателю, что возможностей ESP32 им не хватает, необходимо использовать STM32. 

        не совсем корректно такое сравнение, но имеет право быть. Не коректно потому что, ESP32 это все же про WiFi в первую очередь. STM32 же на борту радиомодуля не имеет. НО, как пример переноса между архитектурами это хорошо.

        Если вдруг поставщик МК существенно повысит цены, то можно с минимальными потерями перейти на другой МК

        Скорее в условиях дефицита приходится брать что есть, а не то что дешево. Тут пока заказ по электронной почте шел в отдел снабжения 6000 stm32l476 внезапно исчезло из продажи. Подбираешь новой и опять лотерея, успеешь купить или нет.

        Мало того, программный код переносим между МК и .NET IoT под Linux. Вы можете написать код на C# и перенести его с Raspberry Pi на nanoFramework, и наоборот. С нативной платформой от производителя МК вы таких фокусов не добьетесь.

        ммм, код верхнего уровня и алгоритмы можно переносить спокойно. Отличаться же будет нижний слой, где идет доступ в регистры. я некоторые алгоритмы в Qt отлаживал при программировании ses


  1. Druj
    18.11.2021 15:30
    +1

    Я правильно понимаю что они просто заливают внутрь ChibiOS и под неё уже пишут на шарпе? Ну извините, так можно с любым языком сделать, было бы желание.
    UPD. Прочитал первую часть, так оно и есть.


    1. usa_habro_user
      18.11.2021 20:44
      +1

      Не совсем по теме обсуждения, но в свете "можно с любым языком сделать", не могу не запостить "баянистую" картинку (а, может, даже кто-то и не видел?)


    1. Shvedov
      01.12.2021 09:12

      Там немного сложнее, для ESP32 в частности, так как ChibiOS не поддерживается/


  1. ibrin
    18.11.2021 16:08
    +3

    о, боже, чибиос, рантайм, сборщик мусора, дотнеты... в stm32! Там для интернета вещей mbed есть, чтоб сразу в браузере кодить, а потом бинарь как на флэшку в микроконтроллер залил и дело сделано!


    1. devzona Автор
      18.11.2021 17:17

      Кодить в браузере, дело вкуса на мой взгляд. Разработка в VS под nanoFramework мне очень понравилась, все работает из коробки включая отладку.


      1. ibrin
        19.11.2021 17:38
        +1

        в браузере кодить под mbed - это фича самого mbed, но можно его поставить локально как фреймворк и работать в IDE, это дело вкуса. Я к тому, что mbed для STM32 и есть тот самый слой абстракции для IoT и прочих модных вещиц, любезно предоставленный самой ST.


        1. devzona Автор
          19.11.2021 17:54

          Так мы говорим об одних и тех же вещах, о создание абстракций для разработчиков. mbed прекрасная платформа, сам немного программировал. Мне очень понравилась функция подтягивания необходимой библиотеки из общего репозитория в свой проект. nanoFramework в каком то смысле альтернатива платформе mbed. На мой взгляд наличие выбора платформ исходя из запросов пользователей только делает лучше и привлекательнее разработку для встраиваемых систем.


  1. usa_habro_user
    18.11.2021 16:28
    +4

    Чем хороша "ардуина", так тем, что скачал и установил за пять минут (ну, если нужно "подтянуть" ESP32 или что-то другое, то чуть дольше), открыл первый же пример, подключил свою "ардуину" или ESP32, добавил LED, запустил программку и "наслаждаешься" мигающей лампочкой - то бишь уровень вхождения практически "околонулевой". Плюс - просто гигантская кодовая база, с кучей библиотек практически под всё, огромное количество готовых решений, "работающих из коробки", прекрасная переносимость кода под разные контроллеры, куча правильных ответов на всевозможные возникающие вопросы на форумах/SO и т.д. и т.п.

    Для тех, кого не устраивает спартанская простота Arduino IDE, есть несколько других IDE с куда большими возможностями; для тех, кто предпочитает Visual Studio, есть VisualMicro по вполне доступной для "хоббиста" (чуть не написал хоббита) цене.

    А миграция "чистого" C#-ка (хотя вряд-ли такие существуют) на C++, особенно, в том стиле, в котором написано большинство библиотек для Arduino (т.е. без "мозговыносящих" многомегабайтных темплейтов etc.) довольно легка, и не вызывает особых проблем.

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


    1. devzona Автор
      18.11.2021 17:26

      Первый абзац Вашего комментария тоже применим и к nanoFramework. Кодовая база с библиотеками появится позже, Arduino старше, исторически так сложилось. Про переносимость библиотек на Arduino не скажу что так прекрасно, в большинстве случаев да, но вы забываете про тайминги. Иногда библиотеки все же приходится править. Крупные разработчики микроконтроллеров всерьез не рассматривали появление Arduino, а зря. Когда подход Arduino начал их теснить, сами вынуждены были примкнуть. В результате так появилась серия отладочных плат ST Nucleo с Arduino совместимыми контактами.


    1. dimaaannn
      18.11.2021 23:43

      открыл первый же пример, подключил свою "ардуину" или ESP32, добавил LED, запустил программку и "наслаждаешься" мигающей лампочкой

      Но.... Зачем? Всё это конечно может быть весело, но очень быстро наскучивает, потому что трудозатраты на решение "прикладных" задач гораздо выше покупки готового устройства.


      1. usa_habro_user
        19.11.2021 03:44

        Но.... Зачем? 

        Что "зачем"? Зачем вообще "ардуинить", т.е. заниматься DIY homebrew проектами на ESPxxx и Arduino? Для удовольствия, для дешевого решения практических проблем, для открытой и понятной лично вам имплементации "прикладных задач".

        Не поленитесь, загляните в некоторые мои статьи о домашних DIY поделках - получите ответ на вопрос "зачем".

        Ну, и в плане "трудозатрат" - это как раз то, о чем я говорю. Трудозатраты на реализацию, при использовании Arduino SDK/IDE (ну, или портированных под Arduino SoC), будут гораздо меньше, нежели, чем при использовании обсуждаемого в этой статье nanoFramework. @devzonaпишет, что "всё работает из коробки", но тут лишь дело в этом самом "всём" - потребуется ему подключить неподдерживаемый на данный момент дисплей, или там servo bridge, или LED strip (не знаю, не смотрел, что поддерживается, но на 100% уверен, что намного меньше, нежели чем для оригинальных Arduino/ESP32/etc. & so on на C++), а "нэту"... И придется либо самому писать либо портировать, либо просто "курить табак".


        1. devzona Автор
          19.11.2021 17:02

          Вы рассматриваете "трудозатраты" достаточно однобоко. Если нет драйвера под новый датчик, то пошел нафиг с новым годом. Под платформу Arduino безусловно существует несоразмерно гораздо больше различных драйверов для датчиков, чем под nanoFramework. Сейчас если пользователю необходимо быстро прикрутить датчик, то скорее всего он возьмет Arduino. Но давайте рассмотрим nanoFramework с позиции бизнеса. Для любого предприятия необходимы разработчики. Прелесть nanoFramework заключается уже в наличие практически готовых разработчиках на рынке труда. Любой .NET разработчик может писать код под nanoFramework, ему нет необходимости изучать отдельно Arduino C-подобный код. И еще раз повторюсь про переносимость кода между nanoFramework и .NET IoT для Linux, вообще считаю шикарной вещью. Кодовая база для больших приложений уже готова, и в этом случае написание драйвера уже становится не насколько значимой вещью.


          1. usa_habro_user
            19.11.2021 18:28

            Но давайте рассмотрим nanoFramework с позиции бизнеса. Для любого предприятия необходимы разработчики. Прелесть nanoFramework заключается уже в наличие практически готовых разработчиках на рынке труда.

            Гмм, вы рассматриваете какую-то уж больно фантастическую ситуацию: если бизнесу потребуется создание IoT дивайса (да любого microcontroller based), то просто наймут эмбедщика(ов), который напишет bare metal firmware (ну, или любое другое профессиональное решение) - про "ардуиненье" там речь вообще не идет, никто всерьез даже рассматривать такое не будет, что с Arduino SDK/IDE, что с nanoFramework.

            Arduino - это для энтузиастов, домашних "самодельщиков", которым нужно сделать что-то быстро и с минимальными затратами времени (вот хороший пример, кстати - человек написал рабочее решение с нулевым опытом программирования Arduino).

            нет необходимости изучать отдельно Arduino C-подобный код

            Вас кто-то обманул ;) - там обычный C++ код, а не "C-подобный"; похоже, вы так "убоялись сложностей" программирования на "C-подобном коде", что даже не попробовали его сначала. Уверяю вас, даже если у вас "нулевой" опыт работы на C или C++, а есть лишь "десктопный" C# опыт, то разобраться и написать готовое решение займет у вас лишь немного дольше времени, чем у "гуру" программирования Arduino - синтаксисы языков уж больно похожи, и никто вас не заставляет писать в стиле "красивого и молодежного C++" - можно писать в good old C style, почти как на C# (но LINQ там не будет, да... Интересно, сможете ли вы придумать реальный пример, когда LINQ нужен для "ардуины"?)


            1. devzona Автор
              19.11.2021 18:48

              Ничего фантастического, только факты и ничего более. В первой части был приведен пример решения компании OrgPal.Iot, перейдите и почитайте. Я так полагаю эта компания и является основным спонсором развития платформы.

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

              Я уже молчу про истоки платформы в лице компании GHI Electronics

               GHI Electronics с 2008 года, построила весь свой бизнес на разработке микроконтроллеров и решений на базе .NET Micro Framework. В портфолио GHI Electronics были небольшие микроконтроллеры в стиле Arduino — FEZ Domino и весьма производительные с несколькими мегабайтами ОЗУ (для микроконтроллеров это весьма круто).

              То что касается C++ кода, так в Arduino это своя реализация, тут момент скорее всего сугубо академический, вопрос соответствия конкретной версии стандарта. Если вам нравиться писать весь код на C++, пожалуйста, вам же никто не запрещает. А у меня другой подход. Тем более нужно не забывать, что для nanoFramework некоторые "особо важные" задачи можно реализовать на C++, а потом их дергать из C#. Поэтому сравнение лоб в лоб C# и C++ не совсем уместно.


              1. usa_habro_user
                19.11.2021 19:05

                Пример не очень-то показательный; иногда компании (порой довольно большие) выбирают довольно странные пути решений: например, промышленные роботы Mitsubishi Electric программируются на диалекте Бейсика - и, кстати, вполне успешно, большего там и не нужно. Другая компания, производящая hi-tech решения для профессиональной астрономии, для своих весьма дорогих приборов, стоящих десятки тысяч долларов, использует... BASIC Stamp (это, грубо говоря, "PIC в обертке") - просто, когда создавали компанию, друг "отца-основателя", электронщик-"самодельщик", "умел немного" только "в BASIC Stamp" (они тогда только появились, а до Arduino оставалось еще несколько лет) - меня они наняли, когда потребовалось более серьезное firmware, чем они могли написать сами. И таки да, все работает и аж до сих пор (я поддерживаю чисто дружеские контакты с этими ребятами).

                Я вас "не агитирую за советскую власть", просто изложил свое мнение, что nanoFramework "не взлетит", по крайней мере, массово: слишком сложный bootstrap для "самодельщиков", моментального выигрыша никто не получит, а, скорее, лишь проигрыш.


                1. devzona Автор
                  19.11.2021 19:57
                  -1

                  Как только привел аргументы, так начинается, ну это другое. Они настолько глупые, что ничего не понимают. Взлетит или не взлетит nanoFramework покажет время. Но я знаю точно, если сидеть сложа руки и ничего не делать, то ничего не взлетит. И вы не привели никаких аргументов причин "не взлета".

                  слишком сложный bootstrap для "самодельщиков", моментального выигрыша никто не получит,

                  Звучит очень надумано и не конкретно. Да пока платформа не настолько массовая как Arduino. Но лидерами не рождаются, а становятся.

                  Посмотрел ваш пример про магический шар, достаточно простой пример. Из оборудования у меня все есть, я думаю лучше сделать немного другой более интересный пример раскрывающий платформу nanoFramework. Устройство GPS-трекер с шагомером и отправкой данных в облако, например в Google Fit, вот это будет гораздо более интересно, чем простой банальный шар.


                  1. usa_habro_user
                    19.11.2021 20:21

                    чем простой банальный шар.

                    Вас за язык никто не тянул, сами предложили ;) И, рискну предположить, что отнюдь не из-за "простоты" и "банальности", а просто из-за отсутствия нужного кода для поддержки дисплея и mp3 плеера (надеюсь, что банальный MPU-6050 в nanoFramework уж поддерживается?)

                    Устройство GPS-трекер с шагомером и отправкой данных в облако, например в Google Fit

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

                    Они настолько глупые, что ничего не понимают.

                    Мне кажется, что переходить к оскорблениям диспутантов - не самая лучшая идея. Мне ваши аргументы тоже показались... ну, не слишком уж гениальными (мягко говоря), но я не стал это подчеркивать, а привел свои доводы: сложность настройки, малая распространенность, отсутствие драйверов, эфемерность выгоды - в общем, чисто "фанатская" поделка для "фанатов" C#, но я не люблю голого и необоснованного фанатизма.


                    1. devzona Автор
                      19.11.2021 21:36

                      1) Поддержка устройств. Отсутствие поддержки MPU-6050 не является проблемой, если на реализацию драйвера уйдет не более ~5% времени общего времени от написания приложения. У меня есть несколько подобный датчиков, посмотрю из того что имеется в наличие.

                      2) Сравнивать DIY с промышленным решением по энергоэффективности просто глупость. По той банальной причине, что я не смогу сделать промышленный дизаин платы с напаяным модулем и всем остальным как в серийном производстве, у меня просто нет соответствующего оборудования и минифабрики. Вот когда выпущу на рынок свое мелкосерийное устройство, вот тогда и можно будет сравнить.

                      3) С другими подобными DIY сравнить можно, без проблем.

                      4) Код причем будет написан с учетом запуска на .NET 6 Linux на одноплатном компьютере без каких-либо изменений. Вот и поговорим об эфемерности выгоды, как вы потом сделаете тоже самое на Arduino с запуском на Linux.

                      5) "малая распространенность, отсутствие драйверов" - дело наживное, постепенно появится.

                      6) "сложность настройки, ..." - вот не понял что сложного в настройке? Приведите конкретный пункт из поста, который у вас вызвал сложность. На мой взгляд, все пункты по настройке в посте вполне осуществимы, даже школьниками. Сложно залить прошивку, установить VS, открыть окошко в VS, вообще непонятно.


                      1. usa_habro_user
                        19.11.2021 22:29

                        У меня есть несколько подобный датчиков, посмотрю из того что имеется в наличие.

                        Да пожалуйста! Шар не нужен, батарейки/кнопки тоже: реализуйте лишь основную функциональность - вывод анимации на дисплей, обработку жестов для UI, да вывод голоса ;) И засеките, сколько у вас уйдет времени - если, конечно, вам вообще это удастся реализовать.

                        С другими подобными DIY сравнить можно, без проблем.

                        Когда/если соберете, дайте мне знать через "личку" - постараюсь найти и кинуть пример, реализованный на классическом bare metal (если, правда, кто-то подобной ерундой занимается), с использованием всех возможностей чипа по deep sleep, и прочим "фокусам" эффективного энергосбережения. Впрочем, и это изначально глупая задача - нет сомнений, что ваша сборка будет намного менее эффективна, может быть, даже на порядок (или порядки).

                        ... посмотрю ...
                        ... будет написан ...

                        ... постепенно появится ...

                        Что-то мне это сильно напоминает ;)

                        Приведите конкретный пункт из поста, который у вас вызвал сложность.

                        Лично у меня нет сложностей ни с чем, поскольку я занимаюсь программированием уже более 30 лет, да и "ардуиню" немало так. Но вот у целевой аудитории пользователей платформы Arduino, 100% возникнут сложности в работе с командной строкой, выбором и прошивкой нужного firmware, да даже в работе с Visual Studio - Arduino IDE на порядок проще и примитивнее.

                        Собственно, достаточно лишь взглянуть на "популярность" этого проекта на GitHub, чтобы все стало абсолютно понятно (а проект-то существует без малого уже 4 года!).


                      1. devzona Автор
                        20.11.2021 01:50

                        Когда/если соберете, дайте мне знать через "личку" - постараюсь найти и кинуть пример, реализованный на классическом bare metal (если, правда, кто-то подобной ерундой занимается), с использованием всех возможностей чипа по deep sleep, и прочим "фокусам" эффективного энергосбережения.

                        Без проблем. Промежуточные результаты могу опубликовать в своем блоге. Чужие примеры мне не нужны, вы отвечайте своим кодом. Сами напишите deep sleep, и прочие "фокусы", чужими работами каждый может хвастаться, для этого особого интеллекта не требуется.


                      1. usa_habro_user
                        20.11.2021 04:28

                        "Без проблем" портируйте сначала код Magic8Ball один к одному, покажите работающий прототип - вот тогда и "поглядим, какой это Сухов" (c). Свои "промежуточные результаты" можете хоть на лбу у себя публиковать - мне они абсолютно не интересны. Результат покажите, ну, или просто "слейтесь", и больше не трепите языком впустую.


                      1. devzona Автор
                        21.11.2021 18:35

                        А вы не считаете свой тон оскорбительным "можете хоть на лбу у себя публиковать"? Наверное, в шатах для таких профессионалов как вы, такой тон разговора норма. Я то сделаю существенно более серьезнее решение чем ваш шар, у меня все равно подобная задача была в планах. Весь вопрос как Вы будете выглядеть после заявления "Результат покажите, ну, или просто "слейтесь", и больше не трепите языком впустую".


                    1. devzona Автор
                      19.11.2021 21:44
                      +1

                      Мне кажется, что переходить к оскорблениям диспутантов

                      Никто Вас не оскорблял. Просто как бы у бизнеса несколько свои причины использования той или иной платформы, которые возможно не столь значимы при разработке DIY, и которые вы не учитываете. Отсутствие драйвера для очередного датчика для бизнеса не будет препятствием. А вот возможность переноса существующего кода на C# "большого" .NET практически один-к-одному на nanoFramework это существенный аргумент для бизнеса. Потому что позволяет быстро надергать необходимый код, и быстро найти разработчиков.


                      1. usa_habro_user
                        19.11.2021 22:13

                        Извините, но вы абсолютно не понимаете, как работает "бизнес"! Никто не проектирует платформу, в особенности, программно-аппаратные решения, исходя из "а сколько дешевых C# "формолепщиков" есть на рынке? А, может, набрать JS студентов - их еще больше, а, значит, будет еще дешевле?"

                        Никакой бизнес не проектирует подобные платформы на "ардуинах", будь то C# или C++.

                        Всегда, при проектировании, исходят из:

                        • соответствия выбранного hardware задаче и спецификациям

                        • доступности на рынке сейчас и в будущем

                        • цены

                        • наличия и доступности производственных мощностей inhouse, или у third party

                        А потом набирается команда "электронщиков" и "эмбеддщиков" (если нет своих) под проект. Так это работало, работает и будет работать в обозримом будущем.

                        Ваши же фантазии, типа: "У нас есть старый проверенный кадр John/Вася, который умеет только "в C#/Java/FORTRAN/1С" - давайте проектировать, исходя из умений John-а/Васи" не имеют к реальности ни малейшего отношения.

                        Я, правда, не живу в России и не знаю, как у вас там все устроено: рассказываю, исходя из моего 24-летнего опыта работы в Штатах, в различных компаниях, занимающихся как раз "программно-аппаратным" производством во всевозможных областях техники. Но я сильно сомневаюсь, что в России обстоят дела иначе - иначе просто невозможно.


                      1. devzona Автор
                        20.11.2021 01:43

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

                        Второе, именно таких молодых с гибким мышлением как John/Вася, профессионально владеющих .NET платформой и чувствующих себя в Visual Studio как рыба в воде, буду нанимать себе в команду вместо людей с большим опытом в возрасте. Потому что двух недель прокачки под микроконтроллеры nanoFramework будет достаточно для готовности писать код под мк на nanoFramework.

                        Никакой бизнес не проектирует подобные платформы на "ардуинах", будь то C# или C++

                        Привел два примера серьезных компаний с многолетним стажем работы, ага никто не делает и никому не нужны. Это уже просто без комментариев, это не ко мне.

                        100% возникнут сложности в работе с командной строкой, выбором и прошивкой нужного firmware, да даже в работе с Visual Studio

                        Людей совсем за идиотов тоже не надо считать. Значит разбираться с регистрами памяти в мк это просто, а тыкать в окошки и менюшки VS это сложно. Я работал несколько лет преподавателем информационных дисциплин в колледже. Вел занятия у более 10 групп, где в каждой группе было от 18 до 28 человек. Если бы я им сказал, что практический материал в этом посте это на зачет по предмету, да они плакали бы от счастья. Например, одна из лабораторных включала в себя установку IIS, установку .NET и конфигурирование под ASP.NET приложения, развертывание ASP.NET приложения с определенными настройками (мое приложение). И это выполняли студенты у которых компьютер дома появился всего лишь пару лет назад, было конечно же сложно, но все они сдали работы успешно.


                      1. usa_habro_user
                        20.11.2021 04:37

                        Года для меня лишь показатель сколько времени прожил человек на бренной земле, но не более того.
                        ...
                         Я работал несколько лет преподавателем информационных дисциплин в колледже.

                        А я работал последние двадцать лет высокооплачиваемым (не по российским, а американским меркам (для east coast) консультантом, с реальными embedded (и не только) проектами, и знаю, о чем говорю.

                        И года, в данном случае, означают опыт, притом личный.

                        Привел два примера серьезных компаний с многолетним стажем работы

                        Серьезных?! "Лолшто"?! Они даже по российским местечковым параметрам просто мелкие "старые стартапы" из нескольких человек и с копеечным оборотом: тыц и тыц.

                        P.S. Вы не умеете прислушиваться к чужому мнению, не умеете аргументировать, не скатываясь на оскорбления и переход на личности, приводите либо абсолютно инфантильные, либо полностью непрофессиональные (либо откровенно ошибочные) доводы. На этом я дискуссию с вами прекращаю; хотите остаться "с последним словом" - be my guest ;)


                      1. devzona Автор
                        21.11.2021 18:39

                        И года, в данном случае, означают опыт, притом личный.

                        Без какого-либо подтверждения это пустые слова. Напишите пост о своей работе, тем более раз за вашими плечами такой большой опыт. Гарантированно тогда вам есть, чем поделиться с молодой аудиторией. Напишите чем занимались, какие проекты выполняли, что особенного было в решение задач. Вот это и будет подтверждением вашей квалификации.


                      1. devzona Автор
                        21.11.2021 18:46

                        Вы не умеете прислушиваться к чужому мнению

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


                      1. devzona Автор
                        21.11.2021 22:13
                        -1

                        Серьезных?! "Лолшто"?! Они даже по российским местечковым параметрам просто мелкие "старые стартапы" из нескольких человек и с копеечным оборотом: тыц и тыц.

                        С вас финансовый аналитик как с меня балерина. Источник этих данных указан? Там есть налоговая отчетность? Исходя из этого источника получается, что в компании работает меньше 25 человек. Вы серьезно так думаете? То железо и представленный софт способно сделать менее 25 человек из которых руководитель, бухгалтер, юрист, кадровик? Привели в пример какой-то желтый сайт, просто детский сад.


                1. devzona Автор
                  19.11.2021 20:04

                  Кстати, благодарю за хорошую наводку на следующую тему про nanoFramework, создание GPS-трекера с шагомером и загрузкой данных в облако.


                1. v0stok86
                  20.11.2021 03:22

                  Сложно сказать, что «взлетит» или «не взлетит». .net framework тоже все пророчили скорую гибель. Однако вот уже .NET 5-6 с GRPC и ProtoBuf в коробке.

                  Да и как вы сами сказали: некоторые крупные корпорации иногда используют «странное» в мк.


                  1. usa_habro_user
                    20.11.2021 04:43

                    Ну, вы сравнили "что-то с пальцем"! Смеха ради, не поленитесь и зайдите на гитхабовскую страничку проекта - imho, опытному человеку определить популярность данного поделия не должно составить труда.

                    некоторые крупные корпорации

                    Некоторые используют, да, но отнюдь не в этом случае. "Серьезные компании", по примеру фанбоя, оказались крохотными конторками с копеечным оборотом - даже смешно такое всерьез рассматривать!


                    1. v0stok86
                      20.11.2021 04:55

                      Какого проекта? Этого nanoFramework? Ну так и apple начиналась с гаража :) А сам дотнет так вообще «буквально вчера» появился на гитхабе. Так что спорный показатель эта «народная любовь». К тому же корпорациям до неё не всегда есть дело.

                      Тут у ребят, как я понял, ещё даже не релизная версия, так что рано хоронить.


                      1. usa_habro_user
                        20.11.2021 09:05

                        Проекту уже почти 4 года; за такое время реально популярные и востребованные решения набирают десятки тысяч "звезд" и сотни форков.

                        Собственно, основные недостатки этого проекта я описал выше, не хочу повторяться. Для профессионального применения это "ноль" (никто не использует "ардуину" для этого), для DIY тоже "ноль", в силу уже описанного мной. Наивные надежды что, дескать, "дайте время, и появятся драйверы и поддержка огромного множества ардуинной периферии" можно объяснить лишь застарелой инфантильностью и недостатком жизненного опыта и ума - никто из производителей не станет тратить время, а, главное, деньги, поддерживая непопулярный "фан-прожект", главная "идея" которого "армяны лучше чем грузины!" "C# лучше C++!"


                      1. v0stok86
                        20.11.2021 11:01

                        Да, честно говоря, все аргументы у вас это лишь набор «жизненного опыта». Ну ок, я понял. Тема закрыта.


                      1. usa_habro_user
                        20.11.2021 11:32

                        Да, честно говоря, все аргументы у вас это лишь набор «жизненного опыта».

                        Хамить собеседнику - отнюдь не лучший путь доказать свою правоту (но, возможно, впрочем, принятый тут, на хабре, способ "почесать ЧСВ"). Я привел весьма резонные доводы, почему данный фреймворк обречен на неудачу, но вам, видимо, просто лениво было их перечитать.

                        А вот представьте: решили вы, например, "сваять" программку для своего воздушного шара на "новом, молодежном C# .NET фреймворке". Только вот начали писать, а надо подключить датчик, который прекрасно работал у вас на "старой и убогой C++ ардуине" (будучи подключенным практически автоматически, а код вы просто скопипастили из сэмпла, и все заработало "искаропки"). А тут вот незадача - нет ни драйвера, ни сэмплов! Ну, никто не удосужился (и не удосужится, уж будьте уверены!) написать. Ваши действия?

                        Да, можно, конечно, портировать C++ код (благо, практически все идет в open source), но нужно его еще оттестировать, отладить etc. & so on. Насколько это вас приблизит к следующему запуску шара, и не могли бы вы потратить это время более продуктивно?


                      1. v0stok86
                        20.11.2021 11:36

                        Да кто вам хамит то? :) Я и то вон пропустил мимо ушей ваш пируэт про «наличие ума» :) Не вижу смысла дальше разговаривать по теме, удачи.


                      1. usa_habro_user
                        20.11.2021 11:47
                        -1

                        Я, вроде, выделил вашу сентенцию: "все аргументы у вас это лишь набор «жизненного опыта»"

                        Я ведь тоже мог написать что-то вроде "мнение человека, специализирующегося на надувании пузырей, не может быть принято всерьез профессионалами", но не написал ведь? :D

                        P.S. И вам удачи в запусках "пузырей" :P


                      1. v0stok86
                        20.11.2021 12:00
                        +1

                        Ваша проблема в том, что вы ошибочно считаете себя профессионалом. Ваши же «сентенции» про «потешить своё ЧСВ» скорее применительно к вам. Я лишь указал на то, что определять будущее того или иного проекта - не в вашей и не в моей компетенции.

                        Ну ок, давайте разберём «проблему» с драйверами для шара. Нет нужного драйвера для дотнета? Подключу библиотеку/драйвер на C++. Благо дотнет это не запрещает. Эта проблема решена. Далее.

                        Нужно использовать узкоспециальные платформенные фичи? Дотнет это уровень абстракции, который не закрывает нижележащие слои. Можно прям посреди C# начать писать хоть на ассемблере, хоть на OS API (если есть ОС). Да, вы лишаетесь мультиплатформенности, точно так же, как и при использовании нативного апи. Так что это не аргумент. Откройте ради интереса код любого крупного приложения на дотнет (да даже сам дотнет) и посмотрите - он весь утыкан директивами прекомпилятора для использования платформозависимых фич.

                        Так что вся оптимизация - это по большей части мастерство оптимизатора. Дотнет позволяет быстрее написать медленный код, в то время как нативный язык позволяет быстрее отстрелить себе ногу.


                      1. usa_habro_user
                        20.11.2021 12:09
                        -1

                        Ваша проблема в том, что вы ошибочно считаете себя профессионалом.

                        Ваша проблема в том же. Лучше просто запускайте ваши пузыри (в чем, кстати, вы тоже не очень-то преуспели, по "гамбургскому счету").

                        А все эти "бла-бла-бла" не стоят ни цента. Сделайте и покажите - вот единственный критерий.


                      1. v0stok86
                        20.11.2021 12:12
                        +1

                        Покоя вам не даёт мой шар :) Хорошо хоть я шар могу показать, а что можете показать вы? Все ваши «проблемы» дотнета я только что решил за 0.5наносек в комментарии выше. Я боюсь что не вам судить об успешности запусков стратостатов.


                      1. usa_habro_user
                        20.11.2021 12:18
                        -1

                        Вы "языком" решаете "проблемы", цена такому решению - dev/null.

                        А "успешность запусков стратостатов" находится простым гуглением; вам, несмотря на весь ваш апломб, ничего не светит даже в региональных соревнованиях - да, это "хобби" не вы придумали, как ни странно! :D Ваши "достижения" не тянут даже на пост в reddit-е - "засмеютЪ"


                      1. v0stok86
                        20.11.2021 12:28

                        Немного странно слышать от человека про решение проблем «языком» когда все его достижения - это перепечатывание новостей на хабре.

                        Нуштош, хобби придумал не я. В соревнованиях я ни в каких и не участвовал, цель проекта была в другом: составить инструкцию по самостоятельной сборке и запуску (с полным циклом и разрешениями) на территории РФ. Эта цель достигнута. И такого больше нет нигде. Не верите? Ну, погуглите :) Все что вы найдёте это посты в духе ваших: «некий Вася запустил стратостат на 700км». Как запустил, что запустил, куда ходил? Как мне, простому человеку, имея ничего, сесть и сделать «такое же»? Поищите, а я подожду.

                        Раз уж вы в самом деле решили опуститься до попыток принизить чьи-то достижения (хотя весь этот тред вы именно с них и начали), то вам, для начала, следовало бы обзавестись какими-то контрмерами. Пока что вы просто поливаете всех подряд г@вном, не принимая во внимание контраргументов и не имея ничего «за спиной»


                      1. usa_habro_user
                        20.11.2021 12:32
                        -3

                        Вам лучше к доктору обратиться, а не ко мне. А мой гитхаб профайл находится в пару кликов (правда, там нет каких-то особых "достижений", но есть то, чего в вашем профайле вряд ли есть ;)

                        P.S. Ну, и по стратостатам: вот первый же линк с гугла (вас там, похоже, забанили). Почувствуйте разницу... Еще находится 100500 постов/видео etc. & so on, в сравнении с которыми ваши "достижения" просто смешны.


                      1. v0stok86
                        20.11.2021 12:50

                        Ясно, комент/статью не читай - комментарий пиши :) ну и где там инструкция? :) ну, соберите по ней хоть что-то. Где там про разрешение на ИВП? Где полетный план? Где ПО? Где ссылки на комплектующие? Где описание процесса сборки? Эх, это даже смешно.


                      1. Carburn
                        20.11.2021 20:16

                        просто в новом проекте перед покупкой проверять совместимость нужно.


                  1. Mike-M
                    21.11.2021 03:02

                    .net framework тоже все пророчили скорую гибель.
                    Если подразумевать проприетарную версию Microsoft, то так и произошло — пал смертью open-source :-)


                1. Carburn
                  20.11.2021 19:42
                  +1

                  А MicroPython и Espruino взлетели?


            1. Carburn
              20.11.2021 19:30

              В Си в коде есть какие-то непонятные символы * и &.


  1. maquefel
    18.11.2021 16:32

    А каков итог по размеру - интересно ?

    Может уже проще NOMMU Linux туда запихать как собственно на ESP32 и сделали ?


  1. DonAgosto
    18.11.2021 17:35
    +1

    /off
    Windows Commander 5.0 — Gold Soft 2002 (на скриншоте)
    где вы это откопали? это такая пасхалка или вы реально им пользуетесь? :)


    1. devzona Автор
      18.11.2021 17:47

      Все работы выполнялись в VMWare Workstation по причине невозможности работы Device explorer в Windows 7. А Windows 10 вместе с VS в виртуальной машине не сказать что шустро работают, поэтому минимизирую нагрузку на CPU. Можно использовать Far, он еще быстрее работает.


    1. predator86
      18.11.2021 22:22
      +1

      это такая пасхалка

      Первый релиз C# был в 2002 году.


    1. PR200SD
      19.11.2021 09:55

      Сам уже лет 15 использую Total Comander 7.04, это первое что переношу на новый ПК или после установки системы :), причем даже без инсталляции, просто копирую папку.


      1. DonAgosto
        19.11.2021 11:49

        тоже сборка от Gold Soft? :)
        На FreeCommander или DoubleCommander не пытались перейти?


  1. WhiteWhiteWalker
    18.11.2021 19:37
    +1

    Можно же взять плату с интерпретатором Javascript https://habr.com/ru/company/amperka/blog/392399/, установить эмулятор x86 https://habr.com/ru/post/198192/, поставить любимую ос и писать на чистом ассемблере и не использовать всякие медленные высокоуровневые языки.


    1. devzona Автор
      19.11.2021 00:05

      Причем тут Javascript? Особенно учитывая факт крайней ограниченности языка. Когда рассматривал вариант выбора языка для расширения VSCode между Javascript и TypeScript, выбор пал на TypeScript безоговорочно.

      Писать на чистом ассемблере? Если это шутка, то это плохая шутка. Что-то я не вижу веб-приложений реализованных на ассемблере как и множества других приложений.


  1. KislyFan
    19.11.2021 00:06
    +2

    Не хватает самого главного, а именно сравнения потребляемых ресурсов и перформанса. Было бы очень интересно увидеть сравнение размеров и производительности какого-нибудь сферического бенча на pure с, arduino, nanoNet и microPython.


    1. devzona Автор
      19.11.2021 00:24
      -3

      Это не настолько главный параметр. Создание бенчмарка для микроконтроллеров не простая задача. Если у вас есть какой-нибудь подобный тест для всех платформ, тогда обязательно попробую его исполнить. Каждый слой в программном обеспечении съедает аппаратные ресурсы и увеличивает время отклика, по другому не бывает. Весь вопрос, что вы получаете взамен. Для примера возьмем Windows 11 и Windows 7. Для меня Windows 11 не привносит в мою работу ничего нового, зато сжирает неимоверно много аппаратных ресурсов и еще принудительно обновляется. А если взамен вы получаете существенное сокращение времени разработки решения, переносимость кода между микроконтроллерами включая .NET IoT, то есть смысл жертвовать ресурсами, тем более учитывая экстенсивный путь развития электроники, еще больше ядер и больше ОЗУ. И в какой-то момент времени потеря производительности уже граничит на уровне погрешности.


      1. KislyFan
        19.11.2021 10:29
        +1

        тем более учитывая экстенсивный путь развития электроники, еще больше ядер и больше ОЗУ. И в какой-то момент времени потеря производительности уже граничит на уровне погрешности

        Я думаю, что вы путаете причину и следствие. По факту нежелание изучать традиционные для uC языки вынуждает вас брать все более жирные камни. Не наоборот. По итогу мы имеем дичь вроде arduino совместимых плат на чипах Cortex A серии.. а это как микроскопом гвозди забивать, т.е. очень очень очень неэффективно.


        1. devzona Автор
          19.11.2021 17:13
          -2

          Я не путаю причину со следствием, просто вы очень однобоко рассматриваете данный момент. До массового распространения микроконтроллеров радиолюбители тоже говорили зачем использовать мк когда тоже самое можно сделать на транзисторах. Но однако микроэлектроника пришла к программируемым чипам и упаковки всего и вся в отдельные готовые микросхемы. Теперь мы не занимаемся пайкой усилителя радиосигнала, а просто вставляем в плату готовый чип. Просто вы не учитываете что стоимость человека-часа разработчика с течением времени увеличивается, и появляется потребность в предоставления более высокой абстракции для более быстрой разработки. Ключевой фактор увеличение производительности мк и появления nanoFramework это желание сократить время на разработку и тем самым сократить расходы человека-часов. Кто быстрее вытолкнет на рынок отличный девайс, того и тапки. А вы попробуйте "получать удовольствие" разрабатывая сложное устройство только на С, посчитайте сколько у вас уйдет времени.


      1. Amomum
        19.11.2021 18:08
        +1

        Главный или нет, но сравнение все равно было бы интересно увидеть :)


        1. devzona Автор
          19.11.2021 18:23
          -1

          Основная задача мк управлять контактами GPIO и осуществлять передачу данных по имеющимся шинам. На мой взгляд, единственный наиболее репрезентативный тест заключается в оценки скорости переключения контактов GPIO. Сравнение на одном и том же мк, например ESP32/STM32, какая будет частота переключения на коде Arduino, FreeRTOS, и C# (nanoFramework). Можно будет замерить дельту приращения времени которая добавляется слоем nanoCLR. Подобный вопрос в комментариях поднимался и для .NET IoT для Linux. У меня пока нет достаточно точных контрольно-измерительных устройств для проведения замеров.


          1. Amomum
            19.11.2021 22:30
            +2

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

            >У меня пока нет достаточно точных контрольно-измерительных устройств для проведения замеров.

            У вас нет осциллографа?


            1. devzona Автор
              24.11.2021 17:01

              Есть только мультиметр


              1. Amomum
                24.11.2021 17:08
                +1

                Сочувствую..

                Но рискну предположить, в таком случае, что вы делаете какие-то _не очень_ критичные по времени выполнения вещи, и в таком случае вам, действительно, не очень важно, насколько C# медленнее. Не вижу в этом ничего плохого :)


  1. HOMPAIN
    19.11.2021 01:10
    +1

    Спасибо. Давно знал про nanoFramework, но всегда боялся пробовать его ставить, для меня казалось это(установка и настройка) больно сложным и муторным. Теперь тоже хочу его попробовать.

    Сейчас прогаю в стунии на с++ с visualmicro. Это удобно, но порой с++ просто выводит из себя, когда для простейших задач надо десяток лишних операций сделать. Иметь возможность использовать С# для некоторых задач, это то что надо.


    1. devzona Автор
      19.11.2021 17:15

      Еще пол года назад было не так удобно, но в последнее время команда разработчиков nanoFramework серьезно продвинулась. Они уже подготовили Preview версию плагина для новой Visual Studio 2022


    1. usa_habro_user
      19.11.2021 18:31

      когда для простейших задач надо десяток лишних операций сделать.

      А "пример в студию" можно? Никогда с таким не сталкивался; можно даже сказать, наоборот - C++ синтаксис чуть более компактный, нежели даже у современного C#.


      1. devzona Автор
        19.11.2021 18:51

        Должен вам заметить разница весьма ощутимая между C++ и C#


      1. devzona Автор
        19.11.2021 18:53

        А приведите свой пример законченного приложения для мк на C++, а я его перепишу под nanoFramework, вот и сравним.


        1. usa_habro_user
          19.11.2021 19:09

          Ну, вот, например (я писал про него в статье), хотя там C++ не много - как, впрочем, во многих ардуинных проектах.


          1. Carburn
            20.11.2021 20:41

            чем ino файл не с++?


            1. usa_habro_user
              21.11.2021 19:38

              В моем коде, собственно, "C++"-ного почти ничего нет - просто "добрый старый C" (а большего и не нужно). Хотя Arduino SDK, безусловно, написан на C++, и можно использовать практически все C++-ные "фичи", включая многие стандартные и популярные библиотеки.


      1. HOMPAIN
        19.11.2021 19:03

        Банально создать класс. Надо создать h фаил, там дифайны от двойного включения, прототипы функций. Какой-то смысловой нагрузки все эти действия не несут.

        Второй пример, это event из функции одного класса в другом классе. С++ для этого надо делать глобальную функцию или с биндами мудрить. В добавок стандарты везде разные и каждый раз что-то не работает и приходится делать по другому.


        1. usa_habro_user
          19.11.2021 19:15

          Банально создать класс. Надо создать h фаил

          Совершенно необязательно! Так просто принято в C/C++ мире для удобства и лучшей читаемости, но никто не мешает вам все "напихать" в один файл.

          Второй пример, это event из функции одного класса в другом классе. С++ для этого надо делать глобальную функцию или с биндами мудрить.

          Ничего не понял, если честно.


          1. HOMPAIN
            19.11.2021 19:29
            +1

            Без прототипа у вас на некоторых компиляторах не будут видны функции и классы, которые находятся ниже того, где вы их используете.

            По второму. Пример. У вас есть класс программного таймера, у него есть событие по окончанию. И второй класс, который, например, поливает растение. Мне нужно подписаться второй класс на событие срабатывания таймера, что бы включить полив.


            1. usa_habro_user
              19.11.2021 19:39

              находятся ниже того

              Дык, опишите выше ) Вообще, какая-то очень странная постановка вопроса, попахивает "холиваром C++ vs C#" - сорри, но я в таком не участвую. Я пишу и на C#, и на C, и на C++ (также "могу" еще в парочку языков), и не вижу в этом какой-то принципиальной проблемы - пишу, на чем удобнее мне для данной платформы.

              Мне нужно подписаться второй класс на событие срабатывания таймера, что бы включить полив.

              И что мешает в, например, событие arduino-timer (возьмем первый попавшийся) передать, в качестве параметра, указатель на объект класса "поливалки" и прокастить? В чем принципиальное отличие от C#?
              Я, честно говоря, ожидал, что вы заговорите о generic-ах и бОльшей читаемости кода (аргумент тоже так себе, но все-таки).


          1. Carburn
            20.11.2021 20:48

            а зачем вообще эти объявления, если то же самое в самой функции написано. сами объявления нужны же.


  1. v0stok86
    20.11.2021 03:01

    Это прям очень хорошо :) Раньше видел только кривые реализации недо-шарпа без фреймворка.

    Только может где-то проглядел, какая версия C# поддерживается?


  1. Mike-M
    21.11.2021 03:20

    Не знаю, что будет дальше с nanoFramework, но знаю, что microFramework под крылом Microsoft так и не взлетел.


  1. RogerPaladin
    24.11.2021 16:53

    Была задача использую плату ESP32-WROOM оцифровать звук с микрофона. Для этого читал аналоговый сигнал с пина подключенного к микрофону. Чтобы охватить весь слышимый диапазон нужно читать с частотой 44кГц. При использовании nanoFramework удалось достичь только 3кГц, что очень мало. Espruino показал вообще 0.25кГц. Arduino справился лучше всех - 12 кГц.