Эта история о том, как долг по зарплате привел меня к созданию портативного анализатора воздуха для Йельского университета, и почему теперь на полке пылятся еще две картонные коробки.
Это далеко не первый проект, созданный мной, но, почему-то, именно о нем хотелось бы рассказать в первую очередь.
В 2021 году, когда мир уже медленно отходил от пандемии, и казалось что все более-менее налаживается, я устроился в компанию, занимающуюся частными заказами по разработке электроники и ПО. Это был достаточно интересный опыт, как минимум, из-за разнообразия проектов и работы исключительно с зарубежными заказчиками. Моим основным направлением в ней была разработка "мозгов" вендинг-автомата и специального автоматического робота, для его загрузки (самоходная тележка на автопилоте). Проект был очень красивый с точки зрения дизайна, и когда-нибудь я обязательно о нем расскажу, но спустя какое-то время, в 2022 году все перевернулось с ног на голову и Россию отменили почти во всем мире. Блокировка международных переводов, скачок курса доллара... результатом чего была 4-х месячная задержка зарплаты. С директором компании у нас изначально сложились хорошие отношения, но долги и задержки очень сильно напрягали. В замен погашения долга он познакомил меня с одним из своих клиентов в США, проект которых оказался "долгостроем". Они согласились на погашение его долга передо мной и организацию моей последующей занятости, при условии, что я смогу доделать их проект и вести его поддержку. Так я разработал Анализатор химического загрязнения воздуха.
Идея проекта заключалась в создании портативного анализатора химического состава воздуха, который планировалось устанавливать в городах и другой местности для сбора данных и анализа загрязнений. Танцы с глобальным потеплением снова набирали обороты, в связи с чем новые гранты на эту тематику на западе выстреливали как из пушки. По техническому заданию прибор должен был контролировать содержание таких газов как CO, CO2, NO, NO2, SO2, O3, CH4, измерять влажность с температурой и наличие механических примесей в воздухе (пыль, зола, песок) разной дисперсии. Все данные должны были передаваться на сервер заказчика, где была возможность их отображения и анализа, через сеть интернет. В случае отсутствия стабильного подключения данные сохранялись в базу на самом устройстве.
Придя в проект, оказалось что это уже четвертая ревизия устройства. Вторая ревизия была успешной, но где-то не проходила по функционалу (был GSM модем, от которого в полях толку не было, а памяти для хранения было предусмотрено мало), да и половина компонентов была устаревшей, что ставило под вопрос поддержку и серийное производство. Третья же ревизия была промежуточной, с ошибками в топологии. Плата, что досталась мне для разработки прошивки, была построена на базе PSOC6, контроллера компании Cypress Semiconductor, ныне принадлежащей Infineon. Заказчик честно выполнил свои обещания по закрытию долга и я приступил к работе.

Третья ревизия плfты, которую прислал заказчик.
Первые запуски показали что связь между компонентами внутри платы не работает. Оказалось что предыдущий инженер допустил критические ошибки в разводке печатной платы: выводы интерфейсов связи были перепутаны, 3.3-вольтовые выводы контроллера соединялись с 5-вольтовыми датчиками, а чип WiFi/Bluetooth был разведен на совершенно неподходящие выводы контроллера. Достаточно долгое время заняли попытки как-то воскресить и минимально завести плату, Но проблема с трансивером поставила точку, так как плата была 6-ти слойной, и все дорожки этого чипа уходили в недра текстолита. Месяца два я предлагал переделать электронную часть проекта, на что получал отказы из-за опасения срыва сроков, мол, эта версия хоть как-то работает, а новую еще тестировать надо. В результате, на очередном пятничном созвоне я выдвинул условие - за выходные я собираю рабочий прототип устройства своего дизайна, либо я завершаю работу над проектом.
На коленке была собрана плата. Изготавливалась с помощью пленочного фоторезиста. Мозгом устройства была выбрана Raspberry Pi 4, так как надо было делать быстро, и чтоб работало с первого раза. К тому же microSD карта памяти и Linux легко решали проблему с хранением больших данных. Серверная часть у заказчика была собрана из "конструктора" на AWS (вэб сервисы Amazon) с использованием Grafana (открытое WEB приложение для графиков и прочей аналитики), поэтому не составило проблем собрать данные с датчиков с помощью нехитрого кода на Python, и пульнуть их на удаленный сервер. Прототип работал, заказчик был в восторге.
На основе этого прототипа была разработана уже боевая модель устройства, с заводской печатной платой. Изготовлены в количестве около 20 шт., доставлены заказчику для сборки фиолетовые (!!!) платы. Почему-то вот заказчик страсть как любил фиолетово-розовые оттенки.


Родной KiCAD делает вполне годные 3D модели😊

Как это выглядело на деле.
Из интересного по данному проекту:
- Впервые на практике столкнулся с воздушным пьезо насосом от Murata MZB1001T02. Схема его включения — это, по сути, мощный двухтактный УНЧ, замкнутый в мультивибратор через сам пьезоэлемент. Пришлось повозиться с RC-цепочкой обратной связи для стабильного запуска.
- Очень интересные датчики газов от производителя Alphasense, с не менее интересной схемой включения. Каждый сенсор устанавливался в свою индивидуальную плату с панелькой. На плате был разведен многокаскадный усилитель на ОУ и АЦП. В анализатор приходил уже сразу цифровой сигнал.
- PM-сенсор, или датчик твердых частиц. Достаточно интересная игрушка, хотя и является готовым решением. С ним была битва на уровне драйверов, библиотекой Serial в Python, чтобы нормально запустить его на Raspberry (serial0 интерфейс). Проблема была в каких-то не совпадающих таймингах, из-за чего я получал только 1 пакет адекватных данных, а дальше датчик присылал какой-то набор байт. Причем, если использовался USB-UART конвертер - все работало как надо. В результате, методом научного тыка пришлось подобрать старую версию библиотеки Serial, в которой эта проблема не наблюдалась. Вместе с этим пришлось и Python откатить до версии 2.7 (точно не помню). Было интересно понаблюдать за данными датчика, помещая его в разные среды (дым, пыль, пар, туман). Надо сказать, что запуск датчика у заказчика дома показал что там почти "стерильный" воздух, без даже 1мкм механических примесей. В отличии от моего офиса, где микроскопические частицы зашкаливали.
Собранные 20 экземпляров готовых устройств были переданы своим покупателям, среди которых был даже Йельский университет. Вся серверная часть тоже была мной переделана и оптимизирована. Вместо готовых решений от AWS был арендован удаленный сервер, на котором был построен весь Back-End. Все данные передавались через HTTP и MQTT запросы и сохранялись в InfluxDB базе данных. За это отвечал Python скрипт, который, собственно, и был Back-End решением на Flask. Функцию Front-End так же выполняла Grafana, со своей внутренней админкой, ролями и архитектурой. Она настраивалась так, что за пользователем закреплялись только его устройства (по серийным номерам), данные которых он мог видеть и скачивать. Протокол MQTT так же позволял удаленно администрировать любое устройство, находящееся в сети, это было предусмотрено в прошивке.
Само устройство тоже было своеобразным сервером. Имело WEB-интерфейс для настройки и работы, доступный при подключении по Ethernet и Wifi. С него можно было получить доступ ко всем необходимым параметрам, а так же к сохраненным данным. Обновление прошивки (по согласованию с заказчиком) было реализовано путем проверки и подтягивания релизных коммитов в мастер-ветке Git, из приватного репозитория. Заказчик был уведомлен что это не самое "безопасное" решение, так как ключи к репозиторию хранились в каком-то (хоть и зашифрованном) виде на устройстве, но тем не менее выбрал именно такой способ.
Так проект просуществовал несколько месяцев и появились первые запросы от покупателей на доработку. В основном это касалось автономности устройства, возможности питания от АКБ и солнечной батареи. Так же были запросы на увеличение количества датчиков, дополнение пневмо системы отдельными контурами и клапанами. Для этих целей была разработана вторая версия устройства, со всеми исправлениями и доработками.


В целом, по функционалу она не особо отличалась от предыдущей, за исключением доработок, но теперь ни о каких одноплатниках речь не шла. Сердцем стал чип ESP32-S3, код которого был написан на MicroPython. Весь функционал первого устройства был полностью повторен, соединение осуществлялось через WiFi и Ethernet (Wiznet W5500), потребление упало на столько, что он устройство могло несколько дней проработать в полях на одной небольшой сборке 18650 элементов. Но у компании заказчика случились какие-то непредвиденные обстоятельства, и финансирование проекта было решено прекратить, отложив все в долгий ящик. С этими новостями покинул проект и я, спустя около полутора лет плотной работы. И теперь только 2 картонных коробки с надписями MPM_PROJECT_V1 и MPM_PROJECT_V2 на стеллаже напоминают о том времени.
Итогом этой работы стало получение огромного количества знаний и практики в сфере WEB. Сейчас почти ни один проект у меня не обходится без этого стека технологий. Ну и, надо сказать, что это мой первый настолько обширный сольный (!!!) проект, который вполне увенчался успехом, и даже был реализован в каком-то количестве покупателям. Я же благодарю вас за прочтение данной статьи, надеюсь время было потрачено с пользой. А какой ваш проект, или просто задача, стал для вас значимым или стартовым? Приглашаю всех поделиться в группе в Телеграм.