DIY-прибор на лодку
Фуф, в последнее время я в основном пишу в Телеграм-канале этого блога, пора бы уже перебить этот дурацкий тренд и вернуться к чему-то более живому.
Некоторые из вас знают, что я периодически пытаюсь программировать что-то для себя. От этого я не становлюсь программистом, но считаю, что это довольно полезный опыт.
Поскольку в этом году мне, наконец, удалось доставить мою лодку из Финляндии, а на ней нет ничего из современного оборудования, я решил перед покупкой полноценных навигационных инструментов (что весьма дорого) попробовать изобрести велосипед сделать собственный аналог — на базе доступных датчиков, с учётом моих возможностей и умений, ну и опыта работы над полноценными навигационными системами. Особенно учитывая, что в данном случае я не ограничен бизнес-требованиями, а только своими представлениями о прекрасном. Что, конечно, не хорошо, если бы я пытался делать потенциально полезную штуку для других — но у меня сейчас нет такой цели.
В этой активности мне, разумеется, интересно поиграться с интерфейсами, выжав максимум, чтобы я получал все эти сведения с наибольшей эффективностью для моего восприятия и взаимодействия. Сама реализация в коде заставит поржать любого джуниор-разработчика, но если это не влияет на «эксплуатационную пригодность», как перевели юзабилити в одном стандарте, то и всё равно.
Думаю, мои опыты с этой штуковиной могут быть интересны не только из любопытства, но и потому, что создание такого прибора (даже делая скидку на «гаражность») в общем-то мало отличается от проектирования настоящих профессиональных систем по некоторым классам задач — работе в реальном времени, взаимодействию с помощью физических органов управления, интерпретации и представлении имеющихся сырых данных наилучшим образом, требованиями к различным специфическим контекстам эксплуатации и так далее. Буду периодически отписываться об успехах и неудачах, благо я выждал почти полгода с начала первых экспериментов и понимаю, что пока не заброшу.
В качестве введения, в этом посте расскажу что к чему.
Суть идеи
По сути это комбинированный инструмент, обрабатывающий и визуализирующий данные с датчиков. Он будет обладать небольшим сенсорным экраном, и устанавливаться в кокпите яхты. В настоящий момент, в целях обкатки технологии и своих навыков, я ограничился следующими возможностями:
- Отображение основной информации о движении — текущие и средние скорость и курс, а также координаты (в том числе потому, что береговые службы часто вызывают нас, не имеющих активного транспондера, по этим параметрам)
- Отображение данных об окружающих судах и их параметрах движения с AIS-приёмника, что немного помогает для предотвращения столкновений (на самом деле должен быть радар, но для меня это слишком дорого).
- Сведения о погоде. Сейчас у меня нет всех необходимых полноценных бортовых сенсоров, поэтому прибор будет получать информацию о текущей погоде по координатам из интернета. А также показывать прогноз погоды по текущей локации — как некий мотиватор открыть полноценный сеточный прогноз в более профессиональных приложениях на телефоне.
- Ну и получение и визуализация данных с некоторых других сенсоров. Сейчас это датчики влажности, температуры и давления, но по пути с Алиэкспресса идут акселерометр и цифровые вольтметры и амперметры. С их помощью я смогу удалённо и на месте оценивать состояние лодки — заряд батарей, а также как её швыряет у причала при штормовой погоде или прохождении катеров, нарушающих скоростной режим.
- Также будет сплошная запись (логирование) всех этих данных и трансляция их в облако при наличии подключения к интернету — как самому себе, так и родне и друзьям, чтобы они видели треки моих путешествий. Потом я еще хочу научиться экспортировать это в более подходящие форматы для подготовки отчётов о моих поездках — например, рисовать треки на картах с ключевыми точками путешествия.
Если мне получится (хотя уже получается, см. далее) реализовать этот функционал, дальше я был бы не против подключить к прибору эхолот, ветроуказатель, плюс добавить возможность FM-радио и аудиоплеера (то есть не только напевать, но и слушать Riders On The Storm под проливным дождём — плата FM-радио с цифровым управлением уже прибыла). В идеале бы ещё сделать функционал управления моим автопилотом с прибора — но это я буду делать в последнюю очередь, когда заматерею, ибо это довольно сложно и критично к багам. Хочется и другие фичи попроще, но пока оставим эти темы.
Учитывая возможности и контекст использования, прибор должен также удовлетворять ряду требований:
- Быть по возможности влагозащищенным, хотя бы от дождя и сырости
- Управление кнопками. Поскольку в дождь доступные мне ёмкостные сенсорные экраны не работают, у него, вероятно, должно быть простое дублирование физическими органами управления
- Корпус, крепеж и разъемы для подключения. Так как я пока не уверен, что у меня получится сделать что-то настолько хорошее, что это можно будет врезать в перегородку лодки, он должен быть достаточно компактным и легко устанавливаться и сниматься с помощью какого-нибудь крепежа, например, на поручни у входного люка. Задача не цифровая, но вполне про пользовательский опыт и эргономику, и даже промдизайн (но тут я не рассчитываю на красоту, важна юзабельность).
- Экономия энергии. Разумеется, всё это должно быть достаточно энергоэффективным, чтобы при моём отсутствии на лодке в течение недели, компьютер и сенсоры не выжрали заряд аккумуляторов.
Техчасть
В качестве основы взяты Raspberry Pi, Arduino, старенький AIS-ресивер с GPS, передающий данные по протоколу NMEA0183 (по сути, по серийному порту), а также набор сенсоров для Arduino. Программируется это всё на C++ с использованием Qt.
Корпус с разъемами для подключения всего необходимого я после проектирования хочу напечатать на 3D-принтере, прогерметизировав резиновыми прокладками. Пока еще думаю, стоит ли делать отдельные корпуса для процессорного модуля (связки Rasp Pi и Arduino) и экрана, или же объединить всё в один блок — есть плюсы и минусы у обоих подходов.
Скорее всего, вначале сделаю примитивный и страшный корпус для задач тестирования и обкатки, а потом уже заморочусь с аппаратными органами управления и намного более продуманной эргономикой.
Что я уже сделал?
На данный момент я прикинул архитектуру системы, некоторые макеты интерфейсов (учитывая описанный выше ограниченный функционал), и собрал нечто криво работающее на Qt.
Макеты
Интерфейсы устройства сейчас нарисованы примерно так:
Всё еще тысячу раз поменяется и дополнится, но уже могу сказать, что надо работать над цветовыми палитрами для различного времени суток — оптимизировать текущую для яркого дневного цвета, а также попробовать сделать красную палитру для поддержки ночного зрения. Ещё хочется оптимизировать представления от AIS. Но поскольку это не традиционный процесс разработки, здесь я делаю всё просто и быстро, чтобы уделять время программированию — эджайл для DIY куда критичнее, иначе, делая сразу более совершенные макеты, я закопаюсь в их реализации и потеряю мотивацию продолжать. Мне это не очень нравится, но что поделать.
Архитекутра
Поскольку я не программист, архитектура примитивная (хотя я уже и прошел несколько итераций) — есть некое подобие ядра, а также модули, работающие с ним.
Ядро отвечает за настройки, подключение и получение данных с сенсоров, отправку их в модули, а также агрегацию общего текущего информационного состояния (то есть уже обработанных модулями данных) и последующую их отправку — будь то логи, «черный ящик», либо облачный сервер. Также у ядра есть набор других общих объектов и библиотек (типа конвертаций величин и работы с геолокациями), которые частные модули могут использовать для своих нужд. Вероятно, потом будет единый механизм тревог (оповещений пользователя), но до этого еще ой как далеко.
Модули же отвечают за свою частную функциональность — парсинг, процессинг и визуализацию параметров движения или погоды, обработку сообщений с AIS приёмника и так далее.
Очевидно, что архитектура должна быть отказоустойчивой даже в условиях моих примитивных навыков — например, выдернув сенсор из порта, система должна выругаться, что значения больше не валидны, но при восстановлении соединения сразу получать их снова и соответствующим образом информировать пользователя, то бишь меня. К слову, это самая трудоёмкая и при этом невидимая часть работы, после которой начинаешь смотреть на работу программистов и тестировщиков совсем иначе.
Сборка
Сборка прибора уже умеет показывать данные с GPS, имеющихся погодных сенсоров, данных о текущей погоде из интернета и, главное моё достижение, из AIS-приёмника. Она не во всём соответствует макетам, но уже близка (запись видео сделана с компьютера на тестовых данных, при испытаниях на яхте не понял как записать — поэтому видно курсоры мыши и заголовок окна, коих не будет в реальности)
Проблем на уровне дизайна, функциональности и осмысленности ещё пруд пруди, но функционал работает и даёт примерное представление о том, что хочется в итоге получить. Поэтому же мне хочется побыстрее сделать черновой корпус — несколько задолбало возить икеевскую сумку с пачкой проводов, плат, плюс ещё и бояться разбить дисплей.
Что дальше?
В начале октября я буду доставать яхту из воды, и у меня будет относительно продолжительный переход до места зимней стоянки. К этому моменту я хочу закончить ключевой функционал для записи всех тестовых данных — это поможет мне продолжать работу над проработкой UX и её реализацией в продукте в зимнее время. Поэтому пока, к сожалению, не совсем до удобства использования.
Но в следующей статье про прибор я опишу подходы к решению отмеченной ранее (и очевидной по вводной фотографии к посту) проблемы — недостаточные яркость имеющегося экрана и контраст выбранной цветовой схемы приводят к тому, что под прямым дневным светом мало что видно. Это крайне типичная история для «уличной» работы, но которая далеко не всегда прорабатывается.
До связи!