Основная идея
Скейтборд это не только средство передвижения, но и спортивный снаряд, с которым можно выполнять различные трюки. Пожалуй, наиболее известный трюк это kickflip, но существует и множество и других.
Целью нашего девайса будет определение качества и количества сделанных трюков. Потом эти данные можно собрать в статистику и инфографику и отобразить в мобильном приложении, где можно будет отслеживать свой прогресс и делиться им с друзьями. Устройство должно крепиться на сам скейтборд. Так проще определять, что с ним происходит.
Грубо говоря, большинство трюков –– это некое изменение пространственного положения доски с ходом времени и по определённому сценарию. Для отслеживания движений можно использовать MEMS-датчики и компас. Для скейт-трюков это необходимое, но не достаточное условие, но чисто теоретически, самые базовые элементы типа ollie и kickflip с их помощью можно определять.
Мне удалось нагуглить только два похожих проекта, но статус обоих превращает эту часть статьи в небольшой некролог. 1) RideBlock. Проект скейтборд-трекера с мобильным приложением. Использует IMU (9DoF) для сбора данных. Был запущен в инкубаторе в Лос-Анджелесе 4-5 лет назад, в 2017 году не собрал нужную сумму на Indiegogo, с тех пор признаков жизни не подаёт. 2) Syrmo. Аналогичный проект из Долины, с более удачным местом установки на подвеске. Размещение сбоку под осью уберегает устройство от возможных ударов и не препятствует выполнению ряда трюков. Для измерения высоты прыжков использует высокоточный барометр, для остального - 6DoF IMU. Последние новости о проекте датируются 2015 годом. Провалились ли эти проекты? Я считаю, что да. Почему? Трудно сказать, ведь никто из их создателей не делился публично тем, что же пошло не так. Можно предположить, что:
Целевая аудитория (скейтеры) не захотели тратить деньги на устройство к скейту, когда на эту же сумму можно купить новую доску или кеды, ведь у скейтеров это дорогой расходный материал, который нужен всегда Возникли какие-то непреодолимые трудности в реализации идеи. Вдруг в принципе невозможно при текущем развитии технологий добиться желаемого результата в точности определения трюков или в качестве полученных данных? Не хватило капитала на реализацию идеи: денежного либо человеческого Оба проекта были мошенничеством в том или ином виде и служили лишь целью быстрого получения денег Лично я настроен оптимистично и не имею никакого давления со стороны (инвесторы, зарплаты сотрудников), так как проект некоммерческий и делается в свободное время, быть может это позволит ему остаться на плаву?Что-то подобное уже существует?
Скейт-трюки
Дальше по тексту на глаза могут попасться названия трюков, которые могут быть не знакомы тем из читателей, кто не катается или не играл в THPS или Skate 3. Под спойлером небольшой раздел с илюстрацией трюков.
Хотя катание на скейте и несёт в себе креативный и развлекательный аспекты, некая система всё же присутствует. Известные трюки имеют устоявшиеся названия, вот самые базовые из них (в исполнении вашего покорного слуги):Скейтборд-ликбез
Kickflip
Heelflip
Pop shove-it
Беря во внимание основную идею, можем сформулировать базовые требования к устройству.
Требования к железу
-
Компактность. На скейтборде не так много места, куда можно было бы закрепить устройство так, чтобы оно не пострадало
-
Питание от батареи. Батарея должна быть перезаряжаемая и компактная, но достаточной ёмкости, чтобы протянуть минимум одну типичную скейт-сессию (у меня это 2-3 часа)
-
Необходимые датчики: акселерометр, гироскоп, магнитометр и др.
-
Наличие беспроводной связи. Так как устройство призвано генерировать много данных, нужен удобный способ эти данные получить
-
Минимальный пользовательский интерфейс помимо беспроводного. Например, парочка светодиодов и кнопка. Нам не нужен черный ящик
-
(Желательно) Водонепроницаемость, вибро- и ударостойкость. Трюки получаются не всегда с первой попытки и доска может упасть, сильно и много раз удариться о землю. На асфальте так же могут быть лужи, грязь и влага, которые могут навредить электронике устройства
-
(Желательно) Отделяемый блок батареи, чтобы не «заряжать доску»
Требования к прошивке
Сформулируем некий минимум того, что мы хотим от прошивки устройства:
-
Опрос датчиков и сбор данных. Собираем и обрабатываем данные с гироскопа, акселерометра, и т.д.
-
Обеспечение работы BLE, формирование пакетов данных
-
Отслеживание состояния и уровня заряда батареи. Общаемся с контроллером заряда, оцениваем когда батарея заряжена и сколько осталось заряда
-
Обеспечение низкого энергопотребления. Что не нужно в данный момент –– выключаем, что нужно, но не часто –– регулируем частоту срабатываний
-
Индикация и взаимодействие с пользователем. Реагируем на кнопку, сообщаем о текущем состоянии и нештатных ситуациях
Подбираем компоненты
В этом разделе рассмотрим самые ключевые компоненты, не беря во внимание мелочь типа пассивных компонентов, кнопок или разъемов.
Микроконтроллер
Сердцем устройства должен стать шустрый, но малоопотребляющий микроконтроллер. Из-за требований к компактности, хочется, чтобы этот чип был системой на кристалле со встроенным радио.
Выбирал между:
-
Nordic Semi nRF52x –– зарекомендовавшие себя на рынке системы на кристалле с Cortex-M4F и отличной поддержкой BLE/Bluetooth 5. Преимущества этих чипов известны: очень продуманная и простая в использовании периферия, возможность назначать её на любые выводы, что освобождает руки при разводке платы. Проверенная временем экосистема драйверов, документации и примеров. В том числе и на языке Rust.
-
ST STM32WBx5 –– относительная «новинка» на рынке беспроводных SoC.
Отличительные особенности:
1) Два ядра: Cortex-M4F как основное и Cortex-M0+ как ядро для радио-стека
2) Периферия унаследована от STM32L4, можно переиспользовать код и опыт
3) Высокочастотный кварц можно подключать без нагрузочных конденсаторов, они встроены в чип
4) Есть поддержка USB, у Nordic она только в самом продвинутом nRF52840 и супер-новом двухъядерном (2 x Cortex-M33) nRF5340
Изначально выбрал Nordic, но как только в широкой продаже появился STM32WB, решил попробовать его. В отличие от нордика, под STM32 чип не было экосистемы драйверов и библиотек и пришлось написать свои1,2 и получить тонну опыта. Собственно, ради нового опыта я этот чип и выбрал, хотя и nRF52 всем устраивает.
Помимо этих двух чипов, довелось попробовать в работе чип NXP QN908x. Это довольно интересный чип с уникальными фишками типа встроенного сопроцессора (FSP) для sensor fusion и машинного обучения, USB, встроенных конденсаторов для кварцев, подключения внешней FLASH-памяти по (Q)SPI. Было дело, что я даже развёл и спаял плату под этот чип. Но столкнулся с сырой документацией и примерами, странными багами с отладочной платой и, видимо, отсутствие опыта с чипами NXP дало о себе знать.
Решил ставить STM32WB55. Сперва в исполнении с 1 МБ FLASH и 512 КБ RAM. Затем можно будет оптимизировать размер памяти.
Инерциальные датчики (IMU)
Здесь я решил пойти простым путем и взять что-то компактное и дающее нужные данные «из коробки».
Изначально выбор пал на Bosch Sensortec BNO055. Это SiP из акселерометра, гироскопа и магнитометра, а также Cortex-M0+ микроконтроллера. Чип идёт с проприетарной прошивкой, которая обеспечивает опрос датчиков и sensor fusion, что позволяет сильно разгрузить основной микроконтроллер. При этом размеры корпуса 5.2 x 3.8 мм. В ходе работы над драйвером обнаружился ряд несовершенств прошивки этого чипа (например, медленная скорость обновления данных либо кривые углы Эйлера после fusion-а).
Затем вышел более новый Hillcrest/CEVA BNO08x на базе того же железа, что и BNO055, но с более совершенной прошивкой и я решил использовать уже его. Разница между BNO080 и BNO085 лишь в версии прошивки, идущей в чипе.
Отдельно стоит упомянуть InvenSense/TDK ICM-20948, преемника очень популярного MPU9250 (который ныне NRND). Чип с хорошими характеристиками и тоже имеет встроенный sensor fusion (Motion Engine), но документация на него очень непрозрачная либо под NDA, что для хобби-проекта неприемлемо.
Поэтому ставим BNO08x, даже если это может быть немного оверкилл.
Контроллер питания, заряда батареи
Девайс будет работать от батареи. При этом хотелось бы, чтобы устройство:
-
Заряжало литиевую батарею
-
Мгновенно переключалось между источниками питания: от шнура при зарядке и от батареи, когда шнур отключен (power path selection)
-
Отслеживало, сколько в батарее осталось заряда (gas gauge)
-
Включало-выключало элементы схемы по команде главного контроллера
-
Обладало режимами «вкл»/«выкл»
-
Имело один или несколько преобразователей напряжения для питания остальных частей
Все желаемые функции так или иначе можно сделать из дискретных компонентов: микросхем заряда, gas gauge чипов, регуляторов напряжения, watchdog-чипов с кнопкой, транзисторов. Но из-за требований к компактности, идеальным вариантом было бы получить все перечисленные возможности, добавив лишь одну микросхему. И такие варианты есть, они входят в категорию микросхем под названием PMIC.
Что предлагает рынок?
Перечислим то, что удалось найти под наши требования. В скобках — число реализуемых конкретным чипом желаемых возможностей.
-
AMS AS3701 –– PP, 1 DC/DC, 2 LDO, WLCSP-20, charger, GPIO и кнопка (5/6)
-
Maxim MAX20353 –– PP, 3 DC/DC, 2 LDO, корпус WLP-56, charger, gas gauge, GPIO, кнопка (6/6)
-
Dialog DA9070 –– PP, 1 DC/DC, 3 LDO, WLCSP-42, charger, gas gauge (ADC), watchdog и кнопка (6/6)
-
TI TPS6572x –– PP, 1 DC/DC, 1 LDO, WQFN-32, DSBGA-25, charger, GPIO и кнопка (4/6)
-
Qorvo (Active Semi) ACT81460 –– PP, 4 DC/DC, 3 LDO, 1 HVB, WLCSP-49, charger, 4 GPIO, кнопка (5/6)
-
Microchip MCP73871 — PP, QFN-20, charger. Просто маленький зарядник + power path контроллер (2/6)
-
X-Powers AXP173 –– PP, 2 DC/DC, 4 LDO, QFN-32, charger, кнопка, gas gauge (6/6)
Из массы имеющихся вариантов, я сделал довольно странный, но по-итогу вполне логичный выбор –– это китайский чип X-Powers AXP173. Это оказался единственный чип, который включает всё что нужно и при этом представлен в QFN-корпусе. Наличие такого корпуса важно по причине требований к ударостойкости самого устройства, корпусы типа BGA/WLCSP известны низкой стойкостью к ударам и подверженностью возникновения трещин в шариках.
И это только если не задумываться о том, что WLCSP-корпуса с шагом 0.4/0.5мм сильно повышают требования к печатной плате, а также требуют инспекции во время производства (например, просвет рентгеном).
После гугл-перевода китайского даташита, оказалось вполне понятно как с AXP173 работать по I2C шине, был написан драйвер (Rust). Микросхему легко достать и в Китае она стоит мало, проблем с ней не возникало. Кстати, чипы этой фирмы используются почти во всех устройствах на базе решений Allwinner (планшеты, одноплатник Banana Pi и т.п.).
Хоть чип и предлагает несколько DC/DC, для экономии пространства на плате я ограничился использованием лишь трёх LDO: два на главный микроконтроллер и один на IMU.
Все LDO и DC/DC преобразователи позволяют регулировать их выходное напряжение через соответствующие регистры. Чип имеет несколько встроенных АЦП для измерения напряжения батареи, протекающего в/из батареи тока, интегратор тока (coulomb counter), который помогает отслеживать уровень заряда. Чип так же можно использовать с кнопкой, и настраивать реакцию на короткое и длинное нажатие. Например, выключать или включать устройство по длинному нажатию. На каждое нажатие кнопки чип выдаёт прерывание и указывает в одном из регистров, какое было нажатие. Выдаются прерывания и по началу/окончанию зарядки, подключению/отключению зарядного устройства и много чему ещё.
Ставим AXP173.
Батарея
За батареями можно ходить на Aliexpress, я заказывал максимально приближенный к размерам будущей платы литиевый элемент 301430 на 120 mAh.
Фото батареи
Радио
Следуя рекомендациям для STM32WB55 мы берём чип-фильтр гармоник ST MLPF-WB55-01E3:
Простоты ради я решил так же использовать маленькую и проверенную чип-антенну Johanson 2450AT18B100:
SoC имеет встроенный балун, поэтому он нам не нужен.
Светодиоды
В текущей ревизии устройства два светодиода:
-
Светодиод-чип желтого цвета American Bright BL-HKC37A-AV-TRB размера 0402 для индикации процесса зарядки. Он подключается напрямую к PMIC AXP173 и управляется ею же
-
Маленький чип RGB-светодиода 1x1mm Foshan NationStar FC-B1010RGBT-HG. Подключается к микроконтроллеру и используется для отладки и индикации процесса работы
Схемотехника
Теперь мы можем сформировать целостную картину основных блоков устройства:
Пройдёмся по основным блокам схемы, рассмотрев интересные на мой взгляд детали. На момент написания статьи была актуальна ревизия C (третья).
Схема рисовалась в онлайн-EDA Upverter (by Altium), ссылка на дизайн.
USB-порт, питание, батарея
На схеме видно, что MicroUSB-порт (J3
) и батарея (J2
) подключены к PMIC AXP173 (U3
).
Выходы регуляторов напряжения LDO1 и LDO2 через сдвоенный диод Шоттки питают основной микроконтроллер. Диоды нужны, чтобы оба LDO не перетягивали друг на друга одеяло и регулировали только свой выход.
Почему вообще два LDO на один чип? Чтобы обеспечить достаточный ток, так как LDO1 очень маломощный и рекомендуется производителем только для питания домена RTC. При этом LDO1 включен вообще всегда, а LDO2 включается программно, но почти сразу же.
LDO3 питает IMU и по-умолчанию выключен. Его будем включать только когда нужны данные с датчиков.
Кнопка не требует подтягивающего резистора, потому что подтяжка встроена в чип. Остальные компоненты подключены по даташиту и общим рекомендациям.
IMU
BNO08x (U2
) питается от VCC_IMU
и сидит на I2C шине (IMU_SCL
, IMU_SDA
). Также стоит внешний кварц на 32.768 Гц (Y3
) с нагрузочными конденсаторами (C17
, C18
) на 22 пФ.
В основном всё подключено по даташиту, но стоит резистор-перемычка R26
для тестирования работы чипа с внешним кварцем и без. На случай, если внешний кварц по каким-то причинам не заведётся, можно будет выбрать режим без него. Спойлер: кварц завёлся без проблем. DNP означает, что этот резистор не должен быть запаян по-умолчанию.
От IMU микроконтроллер через I2C шину получает данные, а кроме этого есть линия запроса на прерывание IMU_INT
. По отдельным линиям микроконтроллер также управляет сбросом чипа и режимом входа в загрузчик, если вдруг когда-нибудь можно будет обновлять прошивку чипа IMU (такая возможность есть, но она под NDA).
BNO08x поддерживает подключение дополнительных сенсоров типа барометра или датчика освещённости по собственной шине I2C, на которой он будет выступать ведущим. Эти сенсоры нам не нужны, поэтому просто подтягиваем линии внешнего I2C согласно даташиту.
Отдельно на схеме стоят также подтяжки (R21
, R22
) для I2C шины, на которой висит IMU. Эти подтяжки подключены к питанию IMU и неактивны (не потребляют ток) когда IMU обесточен путём отключения LDO3 PMIC, который питает VCC_IMU
. Отключая подтяжки вместе с чипом, мы экономим некоторую часть общего бюджета энергопотребления.
Почему для обмена данными с IMU выбрана шина I2C вместо гораздо более быстрой SPI? Всё просто: сэкономил ножки микроконтроллера. Две (SCL, SDA) против четырёх (MOSI, MISO, nCS, CLK). Микроконтроллер, чип IMU и подтяжки на 4.7 кОм позволяют шине I2C разгоняться до 400 кГц без особых проблем.
Теперь перейдём к
Микроконтроллер, радио, DC/DC (SMPS), внешние подтяжки I2C
Обвязка микроконтроллера STM32WB55 (U1
) согласно даташиту. Благодаря встроенным нагрузочным конденсаторам, кварцевый резонатор на 32 МГц Y2
подключается напрямую к чипу. В то время как низкочастотный кварц Y1
на 32.768 Гц подключается с нагрузочными конденсаторами на 12 пФ.
В плане подключения 2.4 GHz антенны для BLE всё тривиально, никаких диаграмм Смита пока не потребовалось. Антенна ANT1
подключена через фильтр FL1
. Выход SoC RF1
, фильтр и антенна рассчитаны на импеданс 50 Ом, поэтому согласующая цепь не применяется, достаточно соединить всё напрямую.
L1
, L2
, C1
–– внешние элементы для встроенного DC/DC преобразователя SMPS. Его использование позволяет снизить энергопотребление SoC при работающем радио и получить более «чистое» питание, уменьшив шум.
Подтяжки для шины I2C (R2
, R3
), к которой подключен PMIC, не подключаются сразу к линии питания. Вместо этого они подключены к выходу SoC I2C_PULLUPS
. Подтяжки включаются только при подаче на этот выход высокого лог. уровня и выключаются при переводе выхода в High-Z (высокоимпедансное, третье) состояние. Таким образом подтягивающие резисторы не потребляют энергию когда не нужны.
После того как схема более-менее готова, можно переходить к разводке платы. Как правило, два этих процесса взаимосвязаны и влияют друг на друга. Плата разводится по схеме, а схема изменяется под возможности разводки платы.
Разводка платы
Разводка платы точно так же выполнялась в EDA Upverter. В основном я использовал готовые футпринты компонентов из встроенной в Upverter библиотеки на базе Octopart, но для парочки деталей приходилось редактировать футпринт либо рисовать свой.
Процесс
Обычно я развожу платы по примерно такому плану:
-
Рисуем желаемую форму и задаём габариты платы
-
Задаём нужные слои, у нас их точно будет 4: верхний, земля, питание, нижний. Такой четырёхслойный стек является рекомендуемым1,2 для плат с RF, при этом слой земли должен быть следующим после слоя, на котором будет разведена RF часть. Кроме этого, работать с 4 слоями удобнее, особенно когда это касается подключения питания компонентов. Когда два внутренних слоя выделены для питания и земли, для запитывания чипов часто достаточно просто поставить переходное отверстие на соответствующий слой
-
Задаём автоматические правила проверки (DRC) согласно возможностям выбранного производителя плат (у меня это PCBWay): 5/5 mil (0.127 мм) проводник/зазор, 10 mil (0.254 мм) ширина отверстия, 4 mil внешнее кольцо переходного отверстия. При этом это минимально допустимые правила. Для большей надёжности я ставлю по-умолчанию минимальные размер дорожки и зазор в 6 mil (0.1524 мм)
-
Расставляем монтажные отверстия для крепления платы в корпусе. Лучше сделать это в самом начале, чем потом, когда места под них уже не останется
-
Расставляем те компоненты, которые точно должны быть с краю платы: разъёмы и антенну
-
Ставим на плату все микросхемы (
U1
–U3
) и их обвязку и двигаем-вращаем их, пока:-
Не станет как можно меньше пересечений «воздушных линий» (ratsnest) между компонентами. Это уменьшает число переходов на другие слои и в целом даёт идею об оптимальности взаимного расположения
-
Длина «воздушных линий» не станет минимальной (это уменьшает длину печатных проводников и помогает сэкономить площадь платы)
-
-
Расставляем/двигаем обвязочные компоненты по ходу разводки
-
Соединяем все цепи проводниками, заливаем полигон на слое земли. Сеть питания можно разводить на выделенном слое, желательно для линий питания использовать топологию «звезда»
-
Cтараемся держать все SMD компоненты на одном слое платы. Это позволит удешевить автоматический монтаж, потому что pick-and-place автомат сможет расставить все компоненты за один подход
Результат
Разводку удалось уместить в 35 х 15 мм, что вполне удовлетворяет нашим требованиям к компактности.
Скриншот платы (без полигонов, вид сверху)
Для наглядности, разметил топологию основных блоков после разводки:
Как обычно, тратим минимум несколько дней на сверку с даташитом/референсами и поиск ошибок, после чего можно переходить к генерированию файлов для отправки на производство.
Заказ производства
В этот раз получается не совсем «своими руками» –– я решил заказать производство плат вместе с монтажом компонентов. Чтобы сэкономить время и нервы, а заодно и попробовать что-то новое.
Для производства плат и поверхностного монтажа я выбрал сервис PCBWay по рекомендации знакомых.
Подготовка
Для производства устройств нужен следующий набор файлов:
-
Gerber-файлы, содержащие «рисунок» платы + drill файл с координатами отверстий
-
BOM, т.е. список компонентов с точным артикулом (part number) детали, количеством
-
XYRS-файл (centroid), содержащий координаты центра и ориентацию всех монтируемых компонентов
В Upverter есть специальный раздел для экспорта этих файлов, заходим туда и скачиваем. Все файлы, кроме BOM, не требуют никакой обработки и готовы к отправке. А вот BOM нужно будет подогнать под стандартный формат (.xlsx), предлагаемый PCBWay.
Пример BOM в формате PCBWay
В каждой строке количество деталей идёт в расчёте на одно устройство. При закупке компонентов это количество сотрудники PCBWay умножат на число собираемых устройств.
Заказываем платы
Заходим на сайт PCBWay и переходим в раздел Quote & Order. Там вводим основные параметры платы:
-
Режим «Всё Включено» (Turnkey): платы, трафареты, закупка, монтаж, всё делают они
-
Размер: 35 х 15 мм
-
Сторона монтажа SMD-компонентов: только верх
-
Количество плат: 5 (это минимум плат в заказе, сам монтаж можно сделать и на меньшем количестве)
-
Число слоёв: 4
-
Цвет паяльной маски: чёрный
-
Финиш поверхностей: HASL со свинцом (хороший вариант когда не надо самому паять)
Остальные параметры я оставил по-умолчанию.
Загружаем герберы, указываем, какой файл отвечает за какой слой, загружаем сверловку и XYRS, загружаем BOM. Отправляем и ждём ответа.
Через некоторое время в личном кабинете статус заказа меняется на «In Audit» и если всё хорошо, то заказ переходит в «Audit Passed» и начинается производство плат. Одновременно с этим на почту пишет сотрудник компании и уточняет наличие позиций в BOM, примерное время ожидания доставки компонента. Таблица дополняется столбцом стоимости каждой позиции умноженной на число устройств, а так же итоговой стоимостью компонентов. На этом этапе можно заменить отсутствующие на складе детали на аналоги, чтобы сократить время ожидания. Так же можно попросить специалиста подобрать компонент запросами типа «поставьте самый дешевый светодиод 0402 желтого цвета» или «самый доступный кварц в этом корпусе с точностью 50 ppm».
По моему опыту, проходит несколько рабочих дней от отправки файлов до первого email с уточнениями по BOM.
Производство
Хорошим признаком того, что всё идёт хорошо является тишина. Если производитель больше ничего не пишет, значит процесс идёт и проблем не возникло. Сам процесс можно отслеживать поэтапно в личном кабинете:
Когда производитель смонтировал самую первую плату (я так понял, что они делают это поштучно, а не панелями), наступает час Икс, когда на почту приходит письмо с фотографиями готовой платы и просьбой внимательно посмотреть и указать на недочёты:
«Предварительная» плата выглядела вполне себе ничего:
Фото платы в более высоком разрешении: клик.
У производителя возник вопрос по поводу полярности футпринта RGB-светодиода, ведь у них не было схемы, чтобы сверить, только герберы:
Фото светодиода с предположением о полярности
Сравнив со схемой я подтвердил, что всё верно и дал зелёный свет. Возможно, что данный вопрос бы не возник, если бы я удосужился разместить на шелкографии ключ компонента либо оставил полярность где-то в заметках, которые можно приложить к файлам.
Доставка
Доставляют по заранее указанному при заказе адресу выбранной службой. Можно изменить адрес доставки в любое время. Например, если успел переехать на другой адрес пока шло производство (у меня так было). Если цена доставки при этом становится выше, то просят доплатить.
До адреса в России фирмой EMS посылка шла где-то неделю.
Фото посылки я не делал, но сделал фото того, что оказалось внутри:
Экономика и цены
Удовольствие не из дешёвых, но затраты компенсируются огромной экономией времени и нервов. Вот, что получилось у меня (курс доллара на 2021 год):
-
Платы: 5 штук за $97 (7,200 ₽) в сумме
-
Монтаж: 5 устройств за $186 (13,800 ₽) в сумме. При стоимости монтажа в $30 (2,238 ₽), львиная доля стоимости это компоненты:
-
SoC: $11.5 x 5 = $55.75 (4,160 ₽) за 5 штук
-
IMU: $11.9 x 5 = $59.85 (4,466 ₽) за 5 штук
-
USB разъем molex: $1.2 x 5 = $6.3 (470 ₽)
-
Цены остальных компонентов меркнут по сравнению с первой тройкой
-
-
Доставка EMS: $28 (2,000 ₽)
Очевидно, что есть куда удешевлять. Вот некоторые идеи и low-hanging fruit по снижению стоимости:
-
Взять менее тонкий техпроцесс плат, наприме 6/6 mil вместо 5/5 mil, взять стандартный цвет маски (зелёный)
-
Снижение оверкиллов в дизайне: использовать младшие модели SoC с меньшим объемом памяти и периферией. Взять более дешевый IMU BNO080 вместо BNO085
-
Использовать USB разъем подешевле
Прошивка и софт
Что-ж, вот железо лежит на столе, подключенное к программатору и ждёт, когда в него вдохнут жизнь.
Приступив к программной части, я сформулировал следующий план действий:
-
Язык прошивки будет Rust. Исключительно на нём я пишу последние годы и уже порядком подзабыл Си, да и возвращаться к нему после раста совсем не хочется
-
Надо собрать в кучу или дописать драйверы для периферии, BLE-стека, IMU и PMIC
-
Помигать светодиодом
-
Написать простую прошивку, которая будет включать IMU и слать рассчитанные им кватернионы текущего положения устройства через последовательный порт
-
Написать программу для визуализации кватернионов положения
-
Написать прошивку посложнее, которая будет слать все данные с IMU через BLE
-
Написать программу на ПК для опроса по BLE и адаптировать визуализацию, добавив графики
Сбор данных
Хотелось как можно скорее прицепить девайс к доске хоть на скотч и приступить к сбору данных. Для этого сперва надо сориентировать оси IMU относительно скейтборда и выбрать, где расположить устройство:
Как только минимально рабочий софт был готов, я примотал устройство к нужному месту на подвеске доски и отправился в скейт-парк.
Мне удалось добиться стабильной передачи данных по BLE с частотой 15 Гц через характеристику с оповещением (Notify), несущую пакет данных из 20 байт. Если пытаться выставить частоту обновления выше, то перестаёт выдаваться прерывание от радио-сопроцессора. Особо глубоко пока не копал, но предполагаю, что боттлнеком является процедура обновления характеристики где-то в BLE стеке, работающем на сопроцессоре. Есть идея, например, в одно обновление характеристики упаковывать несколько пакетов, два или три за раз. Это нужно только на этапе сбора данных. В дальнейшем, все основные расчёты планируется вести на самом устройстве, поэтому канал BLE будет существенно разгружен.
Больше всего боялся, что устройство сразу же вырубится после первого же прыжка из-за тряски или удара, но обошлось:
На графике акселерометра (слева снизу) видно, когда доска отрывается от земли и когда она приземляется. Значительно возрастает ускорение по вертикальной оси Z (зелёная). Используя эти данные и время, можно придумать алгоритм расчета высоты прыжка. На графике справа показаны данные с гироскопа. Т.к. при ollie значительных вращений вокруг осей не происходит, график гироскопа здесь выглядит скучновато.
Ещё пример
Для определения трюков с вращениями очень полезны данные с гироскопа. Прекрасно видно, вокруг каких осей, как быстро и на сколько градусов вращается доска.
Например, kickflip это +360° вдоль оси Y, а heelflip это -360°. Меняем знаки местами если стойка скейтера меняется с regular на goofy. А pop shove-it будет выглядеть как вращение на 180° вдоль оси Z.
Заключение
За кадром этого поста остались детали разработки прошивки, поскольку она пока далека от завершения и может ещё много раз измениться кардинально. Более подробно я могу рассказать про код прошивки и ПО для ПК в следующем посте. Сейчас же ссылки на весь код можно найти в разделе ссылок в конце поста.
Полдела сделано и идея проверку проходит, осталось самое сложное — довести проект до конца. Вот некоторые планы на будущее (так сказать, roadmap):
-
Корпус! Пожалуй, это самая сложная часть проекта и источник прокрастинации для меня. Но корпус придётся делать, не приматывать же устройство скотчем каждый раз
-
Собрать ещё больше примеров данных с более высокой частотой, дабы иметь представление о тех вещах, которых не видно при 15 Гц дискретизации
-
Обратиться к литературе по алгоритмам определения высоты по акселерометру, машинному обучению и классификации по данным с IMU, например: 1, 2, 3, 4
-
Выполнять расчёты на самом устройстве, по BLE передавать лишь результаты
-
Оптимизация энергопотребления устройства
-
Мобильное приложение
-
Подумать над влаго- и ударо- защитой устройства. Это скорее относится к корпусу, но и с точки зрения электроники тоже можно попытаться на что-то повлиять. На ум приходит conformal coating платы, убрать, где возможно кварцевые, резонаторы, водонепроницаемый разъем для зарядки
Спасибо за внимание, с нетерпением жду ваших вопросов и комментариев!
Ссылки
-
Репозиторий с кодом прошивки, программ и документация
-
Схема и разводка платы на Upverter
Автор: eup