Телеметрия для мотогонок. Часть 1 — прототип
Стоя на тренировочной площадке у размеченной трассы для мотоджимханы (вид мотоспорта, набирающий популярность) я наблюдал, как времена кругов замеряют на секундомер в смартфоне. Понятно, что точных данных так не получить. Дома валялось несколько ардуин, пара дисплеев и, казалось бы, всё, что нужно сборки автоматической телеметрии — найти пару подходящих датчиков, срабатывающих при проезде байка. Так началось множество бессонных ночей с паяльником, vim’ом, дремелем и местами даже болгаркой.
Забегая вперёд — всё получилось, устройства успешно отработали на всех трёх этапах чемпионата по мотоджимхане [G]-RSBK, и активно используются во время тренировок. Собраны в итоге были:
- контроллер для замера времени заезда
- датчики для контроллера
- табло для отображения результатов
- судейский пульт
а так же кое-что ещё!
Датчики были куплены и спустя пол-часа прототип уже мелькал цифрами на дисплее. Правда, я слегка ошибался полагая, что на всё остальное мне хватит нескольких вечеров.
В статье нет схем во Fritzing — руководств о подключении датчиков и дисплеев в сети полно, и нет исходников — (каждый уважающий себя программист всё равно всё выкинет и напишет с нуля) засечь интервал между сигналами с двух входов полагаю всем по силам. Гораздо более интересной задачей оказалось с помощью подручных средств и инструментов собрать сначала прототип в обувной коробке, пригодный к транспортировке, а позже — довести это до почти-продакшн вида.
Мотоджимхана — вид спорта, заключащийся в скоростном маневрировании на мотоцикле по трассе, отмеченной искуственными препятствиями. Точные рулёжка и торможение, углы наклонов с высеканием искр подножками об асфальт, и умеренные скорости делают джимхану и захватывающей, и достаточно безопасной. Кроме этого, соревнования проводятся на мотоциклах, пригодных для езды по дорогам общего пользования, т.е. не нужно выезжать на трек со специально подготовленным байком в прицепе — подходит тот мотоцикл, который у тебя есть.
На соревнованиях заезд начинается из ограниченного конусами стартового бокса, затем следует проезд по трассе, и финиш — тоже в ограниченный конусами бокс, расположенный рядом со стартом. Датчиков нужно два — пересечение старта и пересечение финиша. Пока решено засекать время прямо с выезда участника из бокса, в дальнейшем — по сигналу светофора, а датчик можно будет использовать для проверки фальшстарта.
Да, зрелищности добавляет проведение парных заездов по двум одинаковым трассам, а значит, комплектов аппаратуры должно быть два.
Датчики
Изучив ассортимент, нашёл и купил барьерные оптические датчики пересечения луча, состоящие из двух модулей — излучателя и приёмника. Широкий диапазон напряжения питания — 6–36В, сигнал с сенсора — NPN-выход. При тестах в помещении они показали себя отлично — дальность в несколько метров, хорошая фокусировка луча, скорость срабатывания — в пределах миллисекунды.
Годится, теперь нужно решить, как их питать, крепить и направлять. Всё IT-шники знают, что стандарты — это хорошо, поэтому питать буду от 12В, а крепить и направлять — стандартными фотоштативами.
Излучатели
По удивительному стечению обстоятельств размер излучателя совпал со размерами стандартного аккумулятора 18650. Решение напросилось само — взять корпус автономной зарядки! В торце просверлил отверстие под луч сенсора, добавил крепление на фотоштатив для GoPro со спиленным верхом, аккумулятор и миниатюрный повышающий DC-DC-преобразователь до 12В. Бонус — яркий зелёный светодиод, подсвечивающий кусочек силиконового шланга, обрамляющего отверстие для луча, светящийся во включенном состоянии.
Недостатков у конструкции — масса, даже если не брать в рассчёт последовательное двойное повышение напряжения DC-DC преобразователями — встроенным до 5В и подпаянным до 12В. Во-первых это активное устройство, неустойчивое к влаге и требующее зарядки. Во-вторых оказалось, что нагрузки от питания излучателя недостаточно, и спустя минуту электроника power-bank’а отключается.
После долгих разбирательств и отметания совсем уж костыльных вариантов выход нашёл — найти и заменить шунтующий резистор для токоизмерения, чтобы плата считала, что подключенное устройство ещё не зарядилось. Интуиция подсказала, что этот резистор должен быть самым большим на плате:
И неважно, что затем было аккуратно впаяно smd-сопротивление: в следующих купленных корпусах зарядок электрическая схема и логика работы оказались сильно изменёнными, став непригодными для моих целей: питание продолжало включаться кнопкой, а отключаться — стало только автоматически по снижению тока потребления подключенного устройства, что пригодно только для зарядки телефонов.
Тем не менее, несколько power-bank’ов с правильной логикой под рукой есть — на создание работающего прототипа хватит. Неоптимальность по энергопотреблению тоже некритична — аккумулятора хватило на двое суток непрерывной работы.
Приёмники
Зная про ненадёжных поставщиков, меняющих схемы, вывод сделал — чем доступнее и распространённее компонент, тем лучше. Значит, приёмники будут в других корпусах (первоначально была идея делать всё внутри power-bank’ов, и по радиоканалу передавать данные в контроллер с дисплеем).
Алюминиевый квадратный профиль, телефонный разъём 6P4C, штативное крепление для GoPro, заклёпки и много-много термоклея:
Для формовки кубиков термоклея с компонентами внутри использовал оправку из обрезка профиля, смазанную силиконовым спреем — после застывания заготовка выдавливается легким нажатием.
Дополнительно для удобства настройки к выходу сенсора подключено два мигающих светодиода, вплавленных в кубики: так при прицеливании датчиков можно будет сразу видеть статус, не смотря на дисплей контроллера.
Миссия выполнена — почти все компоненты можно купить в ближайшем строительном магазине! В результате стартовые ворота с установленными сенсорами на простейшие фотоштативы выглядят так:
Контроллер
Контроллер очень прост — при получении сигнала от первого датчика таймер запускается, от второго — останавливается. Время выводится на OLED-дисплей и отправляется по радиоканалу с помощью модуля nRF24L01. Схема тоже примитивна — дисплей подключен двумя проводами по I2C, nRF24L01 — четырьмя проводами через SPI, плюс земля и питание. Сигнальные провода от двух датчиков — через делители напряжения к двум входам с поддержкой аппаратных прерываний.
Первые заезды уже на подходе — с прототипом нужно поторопиться. Корпусом взял попавшийся под руку power-bank (на этот раз — с аппаратной кнопкой включения) на четыре банки. Место одного аккумулятора займёт дисплей с лицевой стороны, и телефонные разъёмы с обратной:
Место второго аккумулятора — распаянные на сделанной ЛУТом печатной плате Arduino Pro Mini, радиомодуль, и кучка резисторов. Налицо дефицит свободного места — впредь стоит учесть, что больше всего места занимают провода:
Как бы страшно это не выглядело — конструкция оказалась вполне рабочей, и спустя пол-года подвела плата самого power-bank’а.
Для удобства отладки и обновления прошивки — наружу вывел порт USB-serial переходника FT232RL, и подключил его к serial-порту Arduino Pro Mini. Чтобы одновременно через этот же разъём заряжать аккумуляторы — применил небольшой трюк: нужно запитать FTDI-модуль через VCC-вывод от внутренней цепи устройства, а ножку +5В от MiniUSB — перенаправить на вход для зарядки power-bank’а. Для этого достаточно выпаять нулевое сопротивление на переходнике, и сделать отвод питания от верхней контактной площадки:
Очевидный способ — соединить только GND, RX и TX не сработает: модуль будет получать питание через RX-пин.
Второй контроллер
Пробные заезды на улице проведены, время считается, датчики стабильно регистрируют пересечение — ура! А дальше — соревнования на носу, буквально через две недели. Значит времени в обрез: нужно собирать второй комплект датчиков по уже проверенной конструкции, и второй контроллер.
И вот за что я люблю Arduino — за быстрый старт и работу с огромным количеством железа без чтения даташитов.
Второй корпус и шикарный, но дорогой OLED-дисплей плюс аккумуляторы почта привезти не успеет. Взял то, что было под рукой: коробка для мелочей, телефонная розетка, четыре резистора, Arduino Nano, nRF24L01, какой-то дисплей, стабилизатор КР142ЕН5А (питание 12В на мототреке всегда найдется). Буквально три точки пайки, всё остальное — на макетных проводах, и спустя час второй комплект готов!
На сдачу — судейский пульт! Коробка для радиоаппаратуры, Arduino Uno, nRF24L01 и пару дисплеев с восемью семисегментными индикаторами. Соединил всё опять же макетными проводами. В корпусе просверлил отверстие под USB-порт для запитывания от внешнего power-bank’а или ноутбука, дисплеи — прикрепил термоклеем к прозрачной крышке. Принять пакет через радиомодуль и вывести на один из двух дисплеев — задача не сильно сложная, код написался быстро. Итог — судейский пульт, дублирующий информацию с контроллеров, и второй комплект телеметрии:
Соревнования
Перед соревнованиями ещё раз проверил все устройства, и не зря: в одном из контроллеров кварц был на стандартные 16МГц, а во втором — 16,384МГц! Нужно ли говорить, что и время они считали по-разному.
Зарядил аккумуляторы и проверил связь — радиомодули отлично себя показали, транслируя данные на десятки метров с антенной, разведённой на печатной плате. Всё устройства вместе выглядят уже более внушительно:
На удачу день заездов выдался тёплый и сухой — аппаратура выживет. Пока размечается трасса — расставляю оборудование:
Начинаются первые заезды и — ура, всё работает чётко! Ложных срабатываний нет, время отсекается точно. Девушки на старте помогают спортсменам разместить байк в стартовых воротах и фиксируют результат на финише. Переносной судейский пульт помогает изрядно — при солнечном свете светодиодных индикаторов лежащего на асфальте контроллера почти не видно.
Затея себя оправдала: проведено почти сто параллельных заездов (а это две сотни зафиксированных времён), сбоев нет, а разница между первыми двумя местами в классе дорожных мотоциклов — 0.1 секунды, что вручную измерить непросто. А значит решено: проекту — быть!