CV-Meter — Простой проект (начало)

Решил поделиться неторопливым ходом разработки своего небольшого проекта, который будет полезен для любой категории разработчиков. Это комплексный проект, который состоит из 3-х более мелких проектов, а именно: софт для ПК (скриншот которого ниже), различное железо измерителей CV и, собственно, прошивки для этих CV-измерителей. Обо всём постараюсь по порядку рассказать и показать, в каком состоянии оно сейчас находится, а также уже можно посмотреть мой говно-код, собрать простую версию измерителя на коленке и опробовать всё самому.

B90-1

Софт для ПК

Начнём с софта. Почему с него? Да просто с чего-то надо начать, а лучше уж начать с более-менее красиво оформленной части. :D Написан он в Visual Studio 2017, на С#, WPF (кто бы сомневался).

Управляющий софт как раз объединяет различные варианты железа и должен поддерживать их возможное многообразие (USB, LAN, в дальнейшем можно добавить COM, Bluetooth типы устройств).

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

В основном приложении есть сейчас 3 окна:

  • MainWindow — в нем отображается единственная MainPage на данный момент;
  • SettingsWindow — окно всех настроек;
  • SpectrumAnalyzerWindow — отображение скользящего БПФ для тока.

B90-2

Приложение, как можно заметить по названиям классов, написано по шаблону проектирования MVVM (Model-View-ViewModel), что позволяет разделять модель данных\устройства и прочего (Model) от логики работы (ViewModel), а также отделять это всё от интерфейса (View), т. е. я могу сначала набросать вид приложения, никак не завязываясь на логике и не описывая её (кроме имён публичных свойств, команд, но и то не обязательно), потом вдумчиво описать само устройство\данные (модель), и уже в конце дописать логику работы всего приложения, либо всё это делать в произвольном порядке, а приложение уже можно будет запускать, отлаживать без какой-либо составляющей MVVM-шаблона.

Вкратце же, DataContext (ViewModel) в MainPage (View) задаётся экземпляром класса MainPageViewModel, в котором содержится основная логика работы приложения, публичные свойства, команды, перечисление доступных устройств всех типов (наследников базового абстрактного класса устройств измерителей CVDeviceBasic) и ссылка на выбранное устройство (на это публичное свойство, собственно, и ссылается окно настроек по параметрам выбранного устройства).

Для оставшихся двух окон SettingsWindow и SpectrumAnalyzerWindow я схитрил (схалявил или, может, это лайфхак ёпта): DataContext я задаю всё тот же экземпляр MainPageViewModel и, соответственно, мне не требуется париться о синхронизации свойств и прочем… Конечно, можно сделать по-крутому, с применением используемого уже Prism (правда, по минимуму, для команд, привязок и просто упрощения биндинга) и его триггерами, регионами и прочим, о чём можно почитать здесь — Руководство разработчика Prism — часть 7, создание пользовательского интерфейса, но для такого простого приложения нужно ли оно… я посчитал, что нет.

Абстрактный класс CVDeviceBasic — это, собственно, минимальный скелет класса измерителя для какого-либо интерфейса, где описаны основные свойства, события и публичные методы, которые используются уже в MainPageViewModel. Собственно, посмотрев код CVDeviceEmulator или CVDeviceUSB (как наиболее дописанный на данный момент), можно быстро понять логику работы этих классов, а также написать новые для любого другого интерфейса, практически не меняя ничего в MainPageViewModel (только добавить опрос доступных устройств нового интерфейса, но, думаю, и это можно автоматизировать).

Для USB используется библиотека UsbHid, насколько я помню, я давным-давно её взял на CodeProject или аналогичном сайте, с того времени она немало переписывалась, создавался её проект заново (используя частично изначальный код), и она адаптирована под WPF уже. Ещё есть, конечно, проблемы и недоработки, но большая часть проблем первоначальной библиотеки решена. Автора не помню, но можно найти при желании…

Для LAN используется библиотека Tmds.MDns — переименована и немного модифицирована. Надеюсь, автор (Tom Deseyn) меня простит. :)

Да, я ни в коем случае не присваиваю лавры используемых и модифицированных библиотек себе, эти библиотеки являются творческим трудом их авторов, а я поступил как можно проще (для меня) — модифицировал, как мне нужно было, и выкладываю, как есть.

B90-3

Для графиков я буду использовать SciChart v.5.4.0.12119 — в плане графиков это наилучшая библиотека из всех, что я перепробовал (как триал, так и опенсорс), отображает без лагов огромные (по количеству) объёмы замеров, удобное управление, великолепный зум и корректное отображение накопленных данных в превью (т. е. форма сигналов минимально искажается и выглядит корректно при отдалении). А также для 5-й версии в целом гуглятся «волшебные буквы». ;)

В остальном же модели, типы данных и прочее вы можете сами уже изучить в репозитории проекта — CV_Meter\Software.

Примечание: про «волшебные буквы» — в файле App.xaml.cs необходимо ввести лицензию (Runtime License) SciChart для запуска ПО в полноценном (не trial) режиме. Также есть лицензия для отладки (Development License), её нужно активировать посредством официальной утилиты SciChart.LicensingWizard.exe (ставится вместе с примерами SDK). Лицензию можно купить официально тут (или… я нашел на форумах сгенерированную лицензию для разработки и запуска, посмотреть ИСКЛЮЧИТЕЛЬНО в ознакомительных целях для 2D и 3D графиков можно на пастабэн.к0м / vVq2Emk7 — кому надо, тот поймёт ссылку, но я настоятельно РЕКОМЕНДУЮ использовать только купленную лицензию SciChart ;) ). Скачать примеры SDK, демо-приложение и утилиту активации лицензии можно здесь — Install_Me_SciChart_v5.4.0.12119 (скачано с официального сайта, там просто требуется аккаунт для скачивания).

Бомж-вариант железа измерителя на коленке

Изначально я тестировал софт на моём старом железе на основе STM32F407VGT6 (отладочная плата Discovery) + LAN8720A (готовая плата с разъёмом и обвесом, Ethernet 10\100 Мбит) + AD7177-2BRUZ (платы измерителя c АЦП 32-бита на 1 канал и необходимым обвесом для измерений мА, мкА). Выглядит это всё добро как-то так:

Это слайд-шоу требует JavaScript.

В целом оно даже работает, автоматически находится в сети по mDNS, управляется, но есть куча нерешённых проблем, как по измерительной части (измерение тока работает адекватно только когда на измеряемой шине есть 2,4 В и выше, калибровка, не очень удачное решение с однополярным питанием, поэтому и замеры около нуля не очень хороши), так и банально не очень продуманное решение изначально — недешево, требуется аж 3 платы и просто на столе не очень удобно держать такой клубок плат для отладки.

На альтернативный вариант меня натолкнул проект STM32INA2xxPowerProfiler — практически из хлама, который есть в столе\ящике у каждого сейчас, можно собрать CV-измеритель, не занимающий много места, не имеющий особых проблем с измерительной частью и замерам которого можно доверять (для начала; про прецизионность пока не заикаемся). В итоге так я и поступил, взял блупил (парочку которых прикупил давным давно, помогли в своё время, да сейчас так и валяются без дела, известнейшая плата на STM32F103C8T6, правда, сейчас на ней уже что только не присылают, и клоны, и отбраковку, хуже адурино стала из-за популярности) и готовую плату с INA219 (тоже куплено было 2 на ebay, в итоге оказалось, что на одной из них INA219 дохлый…я запарился, весь вечер убил, думал, чего у меня I2C банальный не работает, потом взял другую — всё заработало сразу), подключил по аналогичной проекту PowerProfiler схеме:

B90-7

Да, единственное — на плате блупила я подтяжку USB DP 1,5 кОм оторвал от +3,3 В и подключил к GPIO (в моём случае это был PA0, но можно цеплять на любой другой свободный пин), чтобы устройство могло включать и отключать USB по необходимости (если плата подключена по USB, вы её перепрошиваете, то устройство не будет проходить процесс энумерации в системе, т. к. физически-то не было переподключения устройства, и ОС считает, что это то же самое устройство, если подтяжка DP всегда подключена к +3,3 В).

В проекте STM32CubeMX можно посмотреть все пины предполагаемых интерфейсов, но по факту используются только отмеченные:

B90-12

Нарисовал банальный корпус-держатель за 10 минут, чтобы ничего не коротило на столе (с допусками чуть, правда, ошибся, там надо было добавить примерно 0,2 мм для плат дополнительно места, пришлось их напильником чуть-чуть доработать):

B90-8

Печатаем держатель, припаиваем провода к платам и собираем всё вместе:

Это слайд-шоу требует JavaScript.

Простенько, но функционально и занимает мало места. Доступно сходу +5 В (с USB) и +3,3 В (с LDO на плате блупила) на выход, измерять можно десятые доли мА (но младшие биты шумноваты, а если перепаять шунт, то и мкА можно измерять).

Прошивка

Прошивка написана в Visual Studio Code + GCC (об этом процессе можно прочитать здесь) и в себе ничего особенно не содержит, разве что подрывает пуканы некоторым людям …

B90-11

Написана быстро (пару вечеров свободного времени, один из них, как я уже выше написал, был убит на поиск проблем с нерабочим INA219), работает по следующему алгоритму: в общем цикле по флагу происходит отправка данных в хост (накопленный буфер измерений), по прерываниям от USB выполняются команды (установка параметров, старт\стоп таймера измерений) и по прерыванию таймера запрашиваются данные с INA219.

Изначально думал сделать что-то типа универсального драйвера, чтобы можно было задавать и интерфейс и тип датчика при инициализации, но запал быстро угас, для этого варианта я пока что реализовывать подобное не буду. Реализован только минимум необходимого. Почему? Да потому что родилась идея, как сделать такой простой измеритель более грамотно, но об этом чуть позже…

Проект прошивки здесь — F103N219.

Первый тест

Итак, прошиваем, подключаем измеритель по USB, запускаем софт — перед нами основное окно приложения:

B90-13

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

B90-14

Основные элементы управления здесь:

B90-15

  1. Подключение\отключение к выбранному в настройках измерителю (если подключение успешно, то блокируется выбор другого измерителя и становятся доступны элементы управления выбранным измерителем).
  2. Старт\стоп измерений.
  3. Сохранение данных в файл (CSV или другой) — ещё не реализовано!
  4. Сохранение скриншота в выбранную папку с указанным форматом имени (по умолчанию диалог сохранения не показывается, скриншоты сохраняются автоматически при нажатии).
  5. Режим FIFO — скролятся постоянно последние данные, размер FIFO можно выбрать в настройках.
  6. Автоматически масштабировать по оси X.
  7. Автоматически масштабировать по оси Y.
  8. Отобразить\скрыть окно БФП.
  9. Включить режим зума.
  10. Включить режим перетаскивания.
  11. Отображать простой курсор.
  12. Отображать маркеры и значение поверх графика.

Дополнительное окно БФП выглядит следующим образом:

B90-16

Пример сохранения скриншота, вот так выглядит выбранный участок замеров (да, так же можно менять размеры между двумя графиками, посредине между графиками мышкой можно тянуть вверх или вниз):

B90-17

А вот так выглядит файл png:

B90-18

Последний немаловажный элемент управления — вызов окна настроек по этой кнопке (рядом с ней отображается IP вашего ПК в локальной сети, а также есть ссылка на бложик в заголовке :D):

B90-19

Окно настроек:

B90-20

Тут много чего может поменяться, пока нет смысла описывать пункты, которые и так (вроде бы) логично и однозначно названы. Просто выбираем вместо эмулятора USB-измеритель и поехали…

Пример старта и подключения к измерителю маломощного моторчика (и торможение его пальцами во второй половине видео):

Примечание: зум регулируется колесом мыши на том графике, над которым находится курсор, также двойной ЛКМ на графике — авто масштаб всех данных.

Нескучные темы для графиков:

Пример непрерывного замера без автоматического масштаба по осям и зуммирования на принимаемых замерах:

В общем, как-то так.

Продвинутый вариант (в разработке)

Как небольшая затравка — это будет продолжение бомж-варианта измерителя, на дешевых ЭРИ и со встроенным регулируемым источником напряжения, а также переключаемым замером мА \ мкА — аккурат для проверки небольших модулей Wi-Fi, Bluetooth и подобного.

Выглядит разрабатываемая плата вот так:

B90-24

Схему и прочее пока не буду приводить, всё в работе, и плата ещё не разведена до конца даже. Скажу только, что МК — STM32F042, измеритель тока — INA226. В следующей статье расскажу уже об этом варианте (и не только этом!) подробней.

Краткий итог

Далеко не всё ещё реализовано как хочется, особенно в плане железа самих измерителей. Хочется добавить:

  • вход для заведения детектирования фронта или спада сброса (по нему стартовать или останавливать измерения);
  • выход для отображения статуса работы, который можно подключать как сброс на измеряемом модуле;
  • опробовать и добавить возможность измерения мкА;
  • возможно, повысить sample rate, на данный момент минимально возможный — 1 мс;
  • возможность сохранять данные в различных форматах (а не только скриншотах) для последующей их обработки, к примеру, в MATLAB & Simulink.

Примечание: Идея с GPIO будет опробована в продвинутом варианте измерителя в совмещённом виде, с остальными пока не так просто всё.

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

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

Спасибо, что прочитали! ;)

Ссылки

  • CV_Meter — репозиторий проекта;
  • Visual Studio Code — написание и отладка прошивок для ARM Cortex-M;
  • SciChart WPF — просто великолепные графики для WPF C# (и не только);
  • Install_Me_SciChart_v5.4.0.12119 — примеры SDK, демо-приложение и утилита активации лицензии;
  • STM32INA2xxPowerProfiler — схожий проект, STM32F103 + INA219\INA226.

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s