
Привет, Хабр! Мы — братья Лев и Марк Григорьевы. В рамках нашего R&D-проекта мы разрабатываем бортовую систему предиктивной диагностики для тяжелого коммерческого транспорта (тягачи, спецтехника).
Задачи в нашей небольшой команде разделены строго: Лев отвечает за аппаратную часть, схемотехнику и проект в целом, а Марк — за инженерию данных, разметку виброакустических датасетов и алгоритмы каскадной фильтрации.
В этой статье мы хотим поделиться набитыми шишками при проектировании прототипа: почему стримить аудио работающего двигателя фуры в облако — это экономическая утопия, как организовать непрерывный сбор данных без блокировки процессорного ядра и почему перенос цифровой обработки сигналов (DSP) на борт микроконтроллера стал для нас единственным выходом.
«Облачные» вычисления – это же хорошо?
Когда мы только приступили к проектированию, первой (и самой наивной) мыслью было создание классического IoT-сенсора. Концепция выглядела просто: берем качественный МЭМС-акселерометр, крепим на коробку передач, подключаем GSM-модем и непрерывно транслируем сырые данные на наш сервер. А уже там Python-скрипты строят спектрограммы и выявляют аномалии.
Но физика быстро скорректировала наши планы. Когда Марк сел просчитывать математику дата-трафика, цифры оказались безжалостными.
Для адекватного анализа высокочастотных гармоник (например, зарождающегося питтинга на зубьях шестерен) теорема Котельникова диктует нам частоту дискретизации , которая должна минимум вдвое превышать максимальную частоту исследуемого сигнала
:
На практике нам нужна частота дискретизации порядка 10–20 кГц.
10 000 измерений в секунду × 3 оси (X, Y, Z) × 16 бит = ~60 КБ/сек.
За час непрерывной езды один тягач сгенерирует около 200 Мегабайт сырой вибрации.
Учитывая, что грузовики ходят по трассам Сибири и Урала, где покрытие сотовой сети крайне нестабильно, модем будет постоянно терять связь, а счета за M2M-трафик для парка из сотен машин сделают юнит-экономику проекта отрицательной.
Вывод напрашивался сам собой: сырые высокочастотные данные вообще не должны покидать борт автомобиля. Возникла необходимость в реализации граничных вычислений.
Как слушать и считать одновременно?
Вся математика должна выполняться локально на микроконтроллере (в нашем случае это ARM Cortex-M). Задача чипа — непрерывно собирать данные с датчика, применять оконные функции, выполнять Быстрое преобразование Фурье (БПФ) и лишь раз в сутки отправлять на сервер диспетчера JSON весом в несколько байт (с вердиктом об остаточном ресурсе агрегата).
Главная аппаратная проблема, с которой мы столкнулись: процессор не может одновременно опрашивать датчик по цифровой шине в цикле и считать «сложную» математику. Пока ядро занято расчетом Фурье, мы пропускаем критически важные такты вибрации. В результате на спектрограмме неизбежно возникают фантомные частоты , сводящие на нет всю диагностику.
Решение: Мы выстроили связку контроллера прямого доступа к памяти и двойного кольцевого буфера. Периферия аппаратно, без малейшего участия CPU, складывает новые сырые данные от датчика в первую половину буфера (Ping). Как только она заполняется, генерируется аппаратное прерывание. DMA автоматически переключается на запись во вторую половину (Pong), а ядро процессора в это время спокойно забирает данные из первой половины и запускает над ними вычисления (используя библиотеку CMSIS-DSP). Процесс идет непрерывно, без пропущенных тактов, а процессор выступает исключительно в роли математического сопроцессора.
Яма на дороге или износ КПП?
Пока писался код инициализации прерываний и буферов, Марк решал фундаментальную логическую задачу проекта: как научить алгоритм отличать удар колеса в колдобину от хруста шестерни внутри агрегата?
Удар в дорожную яму — это низкочастотное, высокоамплитудное апериодическое событие. Дефект подшипника — это высокочастотный, периодический звон, модулированный частотой вращения вала.
Разрешение спектра при цифровой обработке зависит от частоты дискретизации () и размера окна БПФ (N):
Чтобы алгоритмы работали корректно, Марку пришлось выстроить фильтрацию:
На первом этапе мы задействуем встроенные High-Pass фильтры (ФВЧ) самого МЭМС-датчика, аппаратно «срезая» всё, что находится ниже 50 Гц. Большая часть дорожного рельефа просто не доходит до процессора.
Микроконтроллер переводит сигнал в частотную область (FFT).
На этапе обучения моделей Марк агрегирует спектрограммы, отсматривает логи и вручную размечает аномалии, сопоставляя их с телеметрией классического G-сенсора. Если происходит мощный аномальный удар подвески (ускорение выходит за пределы нормы), алгоритм фиксирует пик перегрузки, но игнорирует этот этап при расчете износа шестерен. Датасет остается чистым.
Как мы уперлись в 5000 об/мин
А теперь о физике, с которой мы столкнулись на этапе стендовых испытаний прототипа. Чтобы отладить первичный сбор данных и дать Марку материал для работы с алгоритмами, мы тестировали макет на бензиновом ДВС малого объема.
На холостых и средних оборотах система работала как часы. Данные шли стабильно, графики спектрограмм четко отражали работу механизмов. Но как только мы раскрутили двигатель до 5000 об/мин, массивы с АЦП превратились в нечитаемую высокочастотную кашу.
Сначала мы искали ошибку в коде: винили программный алиасинг, переписывали настройки оверсэмплинга, пытались вычистить шум цифровыми фильтрами. Ничего не помогало.
Причина оказалась сугубо аппаратной — Электромагнитные помехи. Мощнейшие наводки от катушек системы зажигания на высоких оборотах били по неэкранированным дорожкам базовых протоколов (I2C) связи между датчиком и контроллером, искажая цифровой сигнал прямо в процессе передачи. Единицы превращались в нули на физическом уровне.
Работа над ошибками:
Сейчас мы находимся на стадии подготовки к тестам на дизельных тягачах, поэтому кардинально пересматриваем схемотехнику:
Отказываемся от I2C в пользу промышленных МЭМС-датчиков с изолированным интерфейсом SPI или дифференциальной передачей.
Интегрируем гальваническую развязку сигнальных линий.
Переходим на SLA-печать герметичных виброзащищенных корпусов (стандарт IP67), так как дорожные реагенты и перепады температур не оставляют шансов открытой электронике.
Заключение
Разработка hardware-продуктов в B2B — это постоянный поиск компромиссов, где математика регулярно разбивается о физику, а инженерам постоянно требуются чистые данные. Но когда аппарат в реальном времени вычленяет звуки износа из рева двигателя — это оправдывает все бессонные ночи.
Лев Григорьев (Руководитель проекта)
Марк Григорьев (дата-инженер, алгоритмы)
Разработчики ПАК СПД-1
Комментарии (8)

MG220
09.03.2026 09:19Если фура едет по глухой тайге без связи, и в этот момент ваш алгоритм на борту вычисляет, что коробка начала разваливаться. Отправить JSON в облако не выходит. Что происходит дальше? Уведомление просто теряется, или прибор как-то накапливает эти данные до появления связи?

Lev_Gr Автор
09.03.2026 09:19Отличный вопрос. Ответ короткий: ни один байт не теряется, всё работает по принципу "черного ящика".
Так как математику процессор считает локально, на выходе получается не огромный аудиофайл, а крошечный текстовый лог на пару байт: дата, узел, процент износа. В зоне без связи этот лог пишется во внутреннюю память нашего блока и дублируется в штатный ГЛОНАСС-трекер тягача. Как только появляется нестабильный 2G - весь накопленный архив за секунду улетает на сервер диспетчера.
Ну и главное - физика износа металла. От появления первых микротрещин в шестерне до реального клина агрегата проходят недели. Поэтому, даже если прибор нашел дефект в глухом лесу, а завгар получил уведомление только через 3 дня - у автопарка всё равно останется фора в пару недель, чтобы спокойно купить запчасти к возвращению машины на базу.
tmxx
добро пожаловать в Automotive
Lev_Gr Автор
Еще поставили датчик на КПП
tmxx
Я вам советую в плане схемотехнических решений немного прокачать стандарты типа AEQ и т.п., иначе рискуете попасть на непрерывные переделки во время эксплуатации.
Синхронный интерфейс SPI не предназначен для протяженных линий, не советую его использовать. Для быстрого восстановления I2C (который тоже не предназначен) можно попробовать использовать усилители шины и экранирование. Для прототипа должно сойти, в дальнейшем советую перейти на какую-нибудь суровую шину типа MIL-STD 1553.
Lev_Gr Автор
Большое спасибо за развернутый и экспертный фидбек!
По стандартам абсолютно с вами согласен, вы, видимо, имели в виду AEC-Q (100/200). В макете собирали из того, что было под рукой "здесь и сейчас", но в ТЗ на предсерийную кастомную плату (ПАК СПД-1) закладываем именно Automotive Grade. Иначе при -30°C плата не выживет.
Про I2C/SPI на проводах - это были те самые грабли, на которые нам нужно было наступить самим, чтобы подтвердить теорию практикой. За идею с усилителем I2C и хорошим экраном отдельное спасибо!
MIL-STD 1553 - легенда, но мы делаем коммерческий продукт. Стоимость уже очень кусается. Клиенты нас не поймут)
Поэтомусмотрим в сторону классики: либо уход в аналоговый сигнал от точки съема (стандарт IEPE / токовая петля) с оцифровкой уже в защищенном основном блоке, либо вынос АЦП к датчику и передача "наверх" по изолированному RS-485 / CAN.
Как считаете, что из этого будет оптимальнее по соотношению цена/надежность?
tmxx
Аналоговый сигнал - вряд ли получится избавиться от помех. Поэтому я бы даже не рассматривал. Даже если вам удастся сделать нормально на тестовом подключении, вы же хотите массовый продукт делать - значит надо рассчитывать на обычную квалификацию установщиков.
Вам нужна пропускная способность с каждого датчика 1Мб/с, насколько я понял. Скорее всего, с синхронизацией по времени. В условиях помех.
Как вариант: CAN FD.
На RS-485 придется навешивать протокол с контрольными суммами, подтверждением приема, повторами и т.п. Значит, придется метки времени ставить, это дополнительная нагрузка. Интерфейс точка-точка. Иначе накладные расходы на адресацию всю пропускную способность съедят. Значит, увеличение количества приемопередатчиков (и цены) в центральном модуле.
В принципе, данные можно сжимать на датчике. Думаю, раз в 10 получится уменьшить объем. Но увеличатся требования к процессорам.
Также советую стенд в лаборатории собрать - пропустить шины между десятком мощных реле, которые асинхронно коммутируют 12 В от автомобильного аккумулятора 10-100 Гц. Это позволит быстро оценивать варианты по BER.
Самый дешевый и надежный вариант - переход в частотную область. На датчиках поставить ГУН (можно цифровой), на центральном модуле ЧМ детектор. Будут проблемы с калибровкой и компенсацией по температуре, но их можно решить.
Lev_Gr Автор
Огромное спасибо за глубокий комментарий!
Идея со стендом из коммутирующих реле для стресс-теста на BER — это просто золото. Обязательно заложим в наш R&D план.
По поводу аналогового сигнала - согласен на 100%. Кабель обязательно пережмут пластиковой стяжкой, экран лопнет, и тд. Оцифровывать нужно строго в точке съема.
А вот дальше начинается самая интересная развилка:
Путь А: Делаем MCU (с модулем FPU) на одной плате с МЭМС-датчиком. Сигнал никуда не бежит, сжимается локально (БПФ), и по длинному кабелю в кабину летит только короткий текстовый статус. И вот для него RS-485 хватает с запасом.
Главный минус: Физика и кондуктивный теплообмен. Чтобы поймать ВЧ-акустику (микротрещины), мы прикручиваем алюминиевый корпус стальным болтом к чугуну ДВС. Через этот тепловой мост плата мгновенно нагреется до температуры мотора, обдув воздухом не спасет. Ставить сложный MCU в классе AEC-Q100 Grade 1 или 0 - значит ударить себестоимости продукта.
Путь Б: Оставляем на горячем картере только МЭМС-датчик + АЦП + Трансивер (легко достать в исполнении до 125°C). А вычислительный MCU выносим на 1-2 метра на раму (в холодную зону АКБ), где можно ставить дешевые промышленные процессоры. И вот здесь ваша идея с CAN FD как нельзя кстати! Гнать 1 Мб/с сырого аудиопотока от горячей точки съема до холодных "мозгов" по RS-485 - боль, а CAN FD проглотит это спокойно.
Будем тестить тему с реле и связку "АЦП -> CAN FD -> Выносной MCU". Еще раз огромное спасибо за крутой консалтинг!