14.09.2021 — DIY

DIY-прибор на лодку

Фуф, в последнее время я в основном пишу в Телеграм-канале этого блога, пора бы уже перебить этот дурацкий тренд и вернуться к чему-то более живому.

Некоторые из вас знают, что я периодически пытаюсь программировать что-то для себя. От этого я не становлюсь программистом, но считаю, что это довольно полезный опыт.

Поскольку в этом году мне, наконец, удалось доставить мою лодку из Финляндии, а на ней нет ничего из современного оборудования, я решил перед покупкой полноценных навигационных инструментов (что весьма дорого) попробовать изобрести велосипед сделать собственный аналог — на базе доступных датчиков, с учётом моих возможностей и умений, ну и опыта работы над полноценными навигационными системами. Особенно учитывая, что в данном случае я не ограничен бизнес-требованиями, а только своими представлениями о прекрасном. Что, конечно, не хорошо, если бы я пытался делать потенциально полезную штуку для других — но у меня сейчас нет такой цели.

В этой активности мне, разумеется, интересно поиграться с интерфейсами, выжав максимум, чтобы я получал все эти сведения с наибольшей эффективностью для моего восприятия и взаимодействия. Сама реализация в коде заставит поржать любого джуниор-разработчика, но если это не влияет на «эксплуатационную пригодность», как перевели юзабилити в одном стандарте, то и всё равно.

Думаю, мои опыты с этой штуковиной могут быть интересны не только из любопытства, но и потому, что создание такого прибора (даже делая скидку на «гаражность») в общем-то мало отличается от проектирования настоящих профессиональных систем по некоторым классам задач — работе в реальном времени, взаимодействию с помощью физических органов управления, интерпретации и представлении имеющихся сырых данных наилучшим образом, требованиями к различным специфическим контекстам эксплуатации и так далее. Буду периодически отписываться об успехах и неудачах, благо я выждал почти полгода с начала первых экспериментов и понимаю, что пока не заброшу.

В качестве введения, в этом посте расскажу что к чему.

Суть идеи

По сути это комбинированный инструмент, обрабатывающий и визуализирующий данные с датчиков. Он будет обладать небольшим сенсорным экраном, и устанавливаться в кокпите яхты. В настоящий момент, в целях обкатки технологии и своих навыков, я ограничился следующими возможностями:

Если мне получится (хотя уже получается, см. далее) реализовать этот функционал, дальше я был бы не против подключить к прибору эхолот, ветроуказатель, плюс добавить возможность FM-радио и аудиоплеера (то есть не только напевать, но и слушать Riders On The Storm под проливным дождём — плата FM-радио с цифровым управлением уже прибыла). В идеале бы ещё сделать функционал управления моим автопилотом с прибора — но это я буду делать в последнюю очередь, когда заматерею, ибо это довольно сложно и критично к багам. Хочется и другие фичи попроще, но пока оставим эти темы.

Учитывая возможности и контекст использования, прибор должен также удовлетворять ряду требований:

Техчасть

В качестве основы взяты Raspberry Pi, Arduino, старенький AIS-ресивер с GPS, передающий данные по протоколу NMEA0183 (по сути, по серийному порту), а также набор сенсоров для Arduino. Программируется это всё на C++ с использованием Qt.

Корпус с разъемами для подключения всего необходимого я после проектирования хочу напечатать на 3D-принтере, прогерметизировав резиновыми прокладками. Пока еще думаю, стоит ли делать отдельные корпуса для процессорного модуля (связки Rasp Pi и Arduino) и экрана, или же объединить всё в один блок — есть плюсы и минусы у обоих подходов.

Скорее всего, вначале сделаю примитивный и страшный корпус для задач тестирования и обкатки, а потом уже заморочусь с аппаратными органами управления и намного более продуманной эргономикой.

Что я уже сделал?

На данный момент я прикинул архитектуру системы, некоторые макеты интерфейсов (учитывая описанный выше ограниченный функционал), и собрал нечто криво работающее на Qt.

Макеты

Интерфейсы устройства сейчас нарисованы примерно так:

Главный навигационный экран
Экран с параметрами движения судна
Экран с текущей погодой. Сетка круговой диаграммы — в будущем будет отображать как гулял ветер за последние 24 часа
Экран AIS-приёмника

Всё еще тысячу раз поменяется и дополнится, но уже могу сказать, что надо работать над цветовыми палитрами для различного времени суток — оптимизировать текущую для яркого дневного цвета, а также попробовать сделать красную палитру для поддержки ночного зрения. Ещё хочется оптимизировать представления от AIS. Но поскольку это не традиционный процесс разработки, здесь я делаю всё просто и быстро, чтобы уделять время программированию — эджайл для DIY куда критичнее, иначе, делая сразу более совершенные макеты, я закопаюсь в их реализации и потеряю мотивацию продолжать. Мне это не очень нравится, но что поделать.

Архитекутра

Поскольку я не программист, архитектура примитивная (хотя я уже и прошел несколько итераций) — есть некое подобие ядра, а также модули, работающие с ним.

Ядро отвечает за настройки, подключение и получение данных с сенсоров, отправку их в модули, а также агрегацию общего текущего информационного состояния (то есть уже обработанных модулями данных) и последующую их отправку — будь то логи, «черный ящик», либо облачный сервер. Также у ядра есть набор других общих объектов и библиотек (типа конвертаций величин и работы с геолокациями), которые частные модули могут использовать для своих нужд. Вероятно, потом будет единый механизм тревог (оповещений пользователя), но до этого еще ой как далеко.

Модули же отвечают за свою частную функциональность — парсинг, процессинг и визуализацию параметров движения или погоды, обработку сообщений с AIS приёмника и так далее.

Очевидно, что архитектура должна быть отказоустойчивой даже в условиях моих примитивных навыков — например, выдернув сенсор из порта, система должна выругаться, что значения больше не валидны, но при восстановлении соединения сразу получать их снова и соответствующим образом информировать пользователя, то бишь меня. К слову, это самая трудоёмкая и при этом невидимая часть работы, после которой начинаешь смотреть на работу программистов и тестировщиков совсем иначе.

Сборка

Сборка прибора уже умеет показывать данные с GPS, имеющихся погодных сенсоров, данных о текущей погоде из интернета и, главное моё достижение, из AIS-приёмника. Она не во всём соответствует макетам, но уже близка (запись видео сделана с компьютера на тестовых данных, при испытаниях на яхте не понял как записать — поэтому видно курсоры мыши и заголовок окна, коих не будет в реальности)

Проблем на уровне дизайна, функциональности и осмысленности ещё пруд пруди, но функционал работает и даёт примерное представление о том, что хочется в итоге получить. Поэтому же мне хочется побыстрее сделать черновой корпус — несколько задолбало возить икеевскую сумку с пачкой проводов, плат, плюс ещё и бояться разбить дисплей.

Что дальше?

В начале октября я буду доставать яхту из воды, и у меня будет относительно продолжительный переход до места зимней стоянки. К этому моменту я хочу закончить ключевой функционал для записи всех тестовых данных — это поможет мне продолжать работу над проработкой UX и её реализацией в продукте в зимнее время. Поэтому пока, к сожалению, не совсем до удобства использования.

Но в следующей статье про прибор я опишу подходы к решению отмеченной ранее (и очевидной по вводной фотографии к посту) проблемы — недостаточные яркость имеющегося экрана и контраст выбранной цветовой схемы приводят к тому, что под прямым дневным светом мало что видно. Это крайне типичная история для «уличной» работы, но которая далеко не всегда прорабатывается.

До связи!

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.