Предыдущая статья
15 января 2020 года я опубликовал статью: “IT техническая сторона яхтинга”
IT техническая сторона яхтинга / Хабр (habr.com)
Которая вызвала интерес у читателей. В этой статье я продолжаю тему автоматизации яхты. И на конкретном примере рассказываю о развитии популряной программы OpenCPN/OpenCPN: A concise ChartPlotter/Navigator. A cross-platform ship-borne GUI application supporting * GPS/GPDS Postition Input * BSB Raster Chart Display * S57 Vector ENChart Display * AIS Input Decoding * Waypoint Autopilot Navigation (github.com), которая по сути является индустриальной программой написанной в хорошем стиле. Кроме того в силу использования wxWidget весть код нативный и может собираться на нескольких целевых платформах. Таких, как Linux, Windows, Android, macOS.
Продолжение этой статьи Все «тайны» настройки софта для модулей и периферии OpenCPN / Хабр (habr.com)
Задача
На производстве используются электронные весы для подсчета количества отгруженных мелких деталек. Нужно было усовершенствовать эти весы, чтобы они отображали в реальном режиме времени прогресс диалог на основе веса детальки, числовое значение веса которой достаётся из базы данных.
Или другими словами задача замены ордера на производство его электронной версией с функциями контроля отгрузки и распечатки этикеток с QR кодами.
Подход к решению на основе OpenCPN
Вспомнив, что популярная и лёгкая программа OpenCPN уже имеет реализацию для настройки гибкого и быстрого окружения пользователя. Что она подходит для работы на непроизводительном железе. И самое главное имеет реализацию протокола работы с COM->USB интерфейсом для GPS, который во многом схож с протоколом электронных китайских весов.
Так как я интересуюсь яхтингом и у меня есть задача создания навигационной системы с тачэкраном. И для весов также был нужно управление путем тыканья одним пальцем по экрану. То я и выбрал OpenCPN для этой задачи.
Особенности проекта
Для прототипа были использованы компоненты компании Olimex.
A20-OLinuXino-Micro.pdf (olimex.com)
В частности ARM компьютер на базе процессора AllWiner. Я использовал A20, так как у меня был один в запасе. Позже я приобрел наиболее продвинутую плату A20-MICRO с индустриальным диапазоном температур на основ процессора T2, который в точности соответствует по геометрии и функционалу процессору A20. Плата имеет emmc память, поэтому прошивка устройства загружается и работает прямо с микросхемы, без посредсва микро SD карты.
Так же была заказана LCD панель (LCD-OLinuXino-15.6FHD – Open Source Hardware Board (olimex.com)) максимального размера и разрешения и ультразвуковой тачскрин (LCD-TS15.6 (olimex.com)), который может работать в неблагоприятных условиях. Например во время сильного дождя. Или под ударами волн, в случае надежной изоляции от воды всей электронной начинки. Это кусок стекла, с прикрепленными по 3 углам 4 пьезоэлементами и специально рассчитанными лазерными рисками по периметру. Риски служат для отражения ультразвуковой волны и их плотность связана с вкладом в частоту конечного сигнала.
LCD панель подключается кабелем аналогичным IDE-40. Подобные шлейфы-кабели использовались для подключения флоппи драйва, DVD и жестких дисков предыдущего до SATA стандарта.
Так же был куплен металлический бокс и жесткий диск на 2 терабайта для хранения различных имиджей. Так как прошивок за более 5 лет производства Olinuxino накопилось довольно много. Не на всех прошивках все устройства поддерживаются, так как болгарская компания Olimex и её владелец Цветан и его брат не вкладывают деньги в подготовку и тестирование фирменных прошивок непосредственно. Но проводит несколько конференций для разработчиков в направлении Опен Соурсе Софтваре и Опен Соурсе Хардваре.
Для нашего экрана и нашей платы подошёл только вот старый имидж Debian для Olimex A20.
Изготовление корпуса устройства и подбор подходящего блока питания — это отдельная задача. Дело в том что устройству необходимо 3 источника питания в диапазоне от 5 до 12 вольт. Скорее всего подойдёт, по возможности узкий, блок питания для компьютера.
Для трех плат управления (OLinuxino A20, контроллер LCD, Контроллер тачскрина) был собран шлейф с разъёмами совместимыми с блоком питания. Причем на контроллер VGA подаётся 5 вольт по рекомендации документации, хотя в теории эта плата может работать и от 12 вольт, остальные платы запитаны напряжением 12 вольт. На большом разъеме ITX блока питания зеленый провод соеденен с землёй перемычкой для включения самого блока питания. В нашем случае устройству не требуется дополнительная кнопка включения питания. На яхте для этого есть тумблер подачи питания на картплотер, а на производстве проще выключить устройство из розетки при завершении эксплуатации.
Водостойкий корпус чартплотера
Так как наш завод выпускает готовые механические наборы частей окон для безрамного остекления (claroflex.ru) по проектам которые готовятся на нашей ERP системе. Поэтому корпус монитора решено было сделать из профиля, который используется для одного из наших новых продуктов.
Стороны “рамки” соединенны посредством алюминиевых уголков, которые туго входят в профиль и заклёпочного соединения с одной стороны. Одна из узких сторон может быть выдвинута (там нет заклёпок), она туго сидит в собранном виде, но соединение будет усилено через саморезы вкручиваемые по периметру задней крышки корпуса в места расположения деревянных вставок внутри профилей.
В каком то смысле это прототип окна будущего, где каждая точка поверхности “чувствует” прикосновение. Естественно эти возможности на производстве будут использоваться для управления и автоматического распечатывания стикеров с QR кодами.
Если следовать документации на ультразвуковой тачскрин и экран, то заступы могут быть до полутора сантиметров с каждой стороны экрана. Соответственно сама LCD панель меньшего размера.
Внутри профиля остается запас места для кабеля сенсоров и прочности достаточно для крепления корпуса самого микрокомпьютрера Olimex.
Герметизация корпуса
Различные опции по герметизации корпуса. Мы используем специальный клей для резиновых прокладок.
В наших профилях предусмотрены места для установки различного вида и толщины прокладок из резины, которые закрепляются фирменным клеем. Этого достаточно для производства или для окон в помещениях. Но, по мнению специалистов, лучшим способом гидроизоляции остается силикон в руках опытного специалиста.
Первая версия устройства будет работать в запыленном помещении и которое возможно иногда со стороны экрана будут протирать с водой во время уборки. Поэтому по периметру корпуса в месте касания тач-панели (ободок экрана) мы использовали самый тонкий резиново-пластиковый уплотнитель.
Между экраном и тач-панелью по длинным сторонам так же располагаются мягкие резиновые уплотнители, которые идут в комплекте с LCD панелью.
Металлические ушки LCD панели крепятся к L-образным скобкам, которые в свою очередь закреплены кубическими деревянными вкладками внутри нашего профиля. Всего таких деревянных вкладок восемь, по две на каждую сторону. В зависимости от имеющегося у вас крепления можно рассчитать наиболее удачное положение этих вкладок на длинной стороне, так как LCD панель имеет четыре точки крепления, то и L- образных скобок четыре штуки.
На наиболее протяженных сторонах тыльной части LCD панели укреплены мягкие резиновые губки, которые обеспечивают мягкий упор панели и не допускают её деформацию при любом положении экрана. Они способны демпфировать любые случайные нагрузки при монтаже задней панели или во время эксплуатации.
Тыльная сторона устройства прикрыта сплошным листом в котором сделен выпил для LCD кабеля IDE-40 и 2 кос питания. Одна для LCD – 5V, другая для акустической тач-панели. Металлические корпуса блока питания и OLinuxino A20-Micro крепятся заклепками или любым другим крепежом к задней крышке устройства.
С внутренней стороны задней крышки размешается контроллер тачпанели. Так как панель металлическая то необходима пластиковая изоляционная прокладка. Макет которой и видно на фотографии выше. У контроллера есть отдельный проводок для общего заземления, он закрепляется небольшим болтиком за крышку устройства изнутри.
Для яхты я планирую делать традиционный плоский монтаж на стене. Каждый блок отдельно со своей отдельной герметизацией. А блок питания от 220 вольт опциональное устройство на яхте. Так как пользоваться им можно будет только на стоянке. Но на яхте можно поставить отдельный сервисный аккумулятор специально для питания навигационного устройства и рации.
Работа над кодом
Первым делом была изучена часть кода, которая отвечала за разбор GPS протокола. И по аналогии был создан разбор протокола от автоматических весов.
uw · Ignat99/OpenCPN@3364ddf (github.com)
В результате нескольких итераций, распознавание было настроено с первого символа, а парсинг осуществлялся по пробелу. Для автоматических весов конкретной марки этого достаточно.
space · Ignat99/OpenCPN@112db20 (github.com)
Далее была выбрана библиотека для поддержки MySQL в C++ и все необходимые файлы были добавлены к коду OpenCPN.
DB work · Ignat99/OpenCPN@1e32d96 (github.com)
Давно хотел добавить базу данных к OpenCPN для хранения треков и прокладок курсов для яхты, а так же для хранения конфигурации оборудования и помощи в управлении. Можно использовать Базу данных и для бортового журнала и для автоматического заполнения данных о погоде взятых с погодной станции.
Оставшиеся коммиты были созданы для создания отдельной панели для доступа к базе данных и связывания в UI таблиц. Так, например, можно с помощью элементов поиска выбрать необходимые проекты, а уже кликнув на нужный проект найти записи по компонентам данного проекта.
Точно таким же образом в базе данных можно сохранять информацию по внутреннему устройству яхты, особенно всё что связано с принципиальными схемами электроники, электрики и механики. В будущем, возможно, акустические и магнитные схемы транспорта могут быть востребованы.
Плугины в OpenCPN
Это расширение основной программы. По сути каждый плугин это динамическая библиотека с несколькими стандартными вызовами со стороны основной программы OpenCPN.
Весь интерфейс сделан на основе фреймворка компонентов wxWidget (wxWidgets/wxWidgets: Cross-Platform GUI Library – Report issues here: https://trac.wxwidgets.org/ (github.com) ).
Основная точка входа для плугинов находиться в файле OpenCPN/src/pluginmanager.cpp. Этот класс PlugInManager отвечает за составление списка плугинов, за их инициализацию и передачу потока управления (нажатие на мышку и клавиатуру) в пулгины.
Также в этом файле находятся интерфейсы для передачи данных от устройств по специфическим протоколам. Рассмотрим для примера метод PlugInManager::SendNMEASentenceToAllPlugIns.
OpenCPN/pluginmanager.cpp at master · OpenCPN/OpenCPN (github.com)
Эта функция проходит по списку всех плугинов, проверяет флаги и в случае совпадения типа передает полученную от устройства часть данных в функцию, которая реализована уже внутри динамической библиотеки плугина.
Эта функция хорошая точка для вставки функции для тестирования потока данных от виртуального устройства. Именно в начале этой функции можно задать тестовую посылку, которая может потребоваться на этапе создания плугина.
Код самих плугинов находится в отдельной папке (OpenCPN/plugins at master · OpenCPN/OpenCPN (github.com)). Это связано с тем что плугины создают различные вендоры и по сути это папка платформы OpenCPN в которой располагаются различные плугины. Плугины можно сравнить с приложениями в Android или Windows.
Требования для компилятора плугинов и состава библиотек могут не соответствовать старым версиями OpenCPN, поэтому компиляция отдельных плугинов может оказаться отдельной задачей.
Рассмотрим для примера плугин dashboard_pi. Помимо папки с исходными кодами, есть папка для i18n, где содержатся переводы строк текста на различные языки. В папке src могут находиться дополнительные каталоги для библиотек различных протоколов и сериализации JSON. Часто эти библиотеки просто копируют из основного кода.
Обратим внимание на файл dashboard_pi.cpp и метод dashboard_pi::SetNMEASentence(OpenCPN/dashboard_pi.cpp at v4.0.0 · OpenCPN/OpenCPN (github.com) ). По образу этого метода можно создать свой метод для поддержки разбора данных от вашего уникального устройства.
Ключевыми являют 2 строчки кода. Первая осуществляет сравнение префикса сообщения с образцом (OpenCPN/dashboard_pi.cpp at v4.0.0 · OpenCPN/OpenCPN (github.com)). И еще одна строчка осуществляет отправку полученной информации в конкретный инструмент (OpenCPN/dashboard_pi.cpp at v4.0.0 · OpenCPN/OpenCPN (github.com)).
Инструменты
Инструменты на яхтенном жаргоне это дисплеи которые выводят параметры. Например скорость, силу и направление ветра, координату, расстояние до цели, наличие преград и опасностей в заданном радиусе и т.д.
Описание основных инструментов для данного плугина нахоиться в файле instrument.cpp (OpenCPN/instrument.cpp at v4.0.0 · OpenCPN/OpenCPN (github.com))
Каждый инструмент содержит несколько стандартных методов. А именно: Инициализатор, Установку размера, Отрисовку и обновление Данных.
Если вы хотите создать свой уникальный инструмент, который выбирается из меню Дашбордов, то необходимо просто поменять содержимое этих функций под ваши задачи. Например тип получаемы данных, фоновое изображение, единицы измерения. Так же можно добавить любые другие методы обработки данных или отрисовки.
Перспективы и планы развития OpenCPN
Естественно для мониторинга параметров был использован механизм плугинов, что позволило создать специальный дашборд с набором инструментов необходимых для поддержания автоматических электронных весов. Так потребовались данные из базы для веса и количества каждого компонента, а так же универсальная формула для расчета индикатора ProgressDialog в процессе взвешивания необходимых элементов.
Аналогичные диалоги можно использовать для вывода показаний ветра и автоматического расчёта оптимального курса на каждый момент времени. Эти данные помогут создать необходимые настройки, уникальные для каждой конкретной яхты и погодных условий, для автопилота.
Автопилоты
Мне известны 4 основных типа автопилота. Причем один из них, я бы назвал его первым, он легендарный. Таким автоконтролем обладала лодка Джошуа Слокам – Спрей. Устойчивость на курсе обеспечивалось симметричностью носовых и кормовых обводов.
Этим же типом автоконроля обладают современные лодки и проекты Виктора Языкова. Например мой любимый проект WIND M. Обычно такие лодки в состоянии построить очень опытные моряки с навыком самодельного строительства по самым современным технологиям и на лучшем технически современном уровне. Обводы этих яхт, плюс размещение мачт, тип парусного снаряжения, смещенный к корме киль, а так же выдвигаемый шверт или шверты позволяют тонко настраивать яхту на любой курс ветра при любом волнении. По сути эти яхты управляются “по воле мысли” (Конечно, не мыслью, а ручками настаиваешь яхту на прямолинейный ход), без специальных механических устройств. Можно сказать так – “При длительной практике в несколько месяцев руки настраивают яхту на автомате, без особых размышлений — достаточно только одной мысли о настройке”.
Второй тип — стандартное механическое ветроподруливающе устройство. Такое стоит на моей яхте.Суть устройства простая — при давлении ветра с одной стороны, специальное дополнительное перо руля поворачивает в противоположную сторону и возвращает лодку на заданный курс относительно ветра. То есть если ветер идёт по дуге, то яхта так же будет двигаться в соответствии с ветром, но в направлении киля, который сдерживает боковой дрейф на курсах галфинд и бакштаг. Кстати, именно галфинд самый не удобный в плане стабильности лодки на курсе.
Чаще всего выходит из строя сложная механика или механические предохранители снятия нагрузки при порывах ветра. Устройство баллера и пера руля так же более подвержены механическим повреждениям в случае наваливание на препятствие, чем более массивный штатный руль.
Именно для стабильности на галфинде и экономии места большое распространение получил третий тип – электрорулевой (электроподруливающее устройство с гироскопом). Внутри электромотор, пасики, червячная передача, электрогироскоп. Усилие на руле на этом типе сравнимое с усилием человека на хорошо сбалансированной яхте. Когда сила давления на парус ветра уравновешивается силой давления воды на перо руля. На не больших яхтах оно крепится одним концом к корпусу яхты, а другим к румпелю или штурвалу и управляет непосредственно основным пером руля через баллер как заправский вахтенный. Можно догадаться что в шторм электрорулевые слишком слабые.
Основная поломки это обрыв пасика и\или стачивание пластиковых микрошестерёнок из-за черезмерного усилия на румпеле во время порывов ветра. Соответственно для дальних переходов надо иметь запасные части для вашего типа электрорулевого.
На больших яхтах и мотоселерах, а также моторных яхтах устанавливают автопилот на гидравлике с приводом непосредственно на баллер (ось) руля. Чаще гидро, но есть и электроприводы на авторулевых. И чаще непосредственно на баллер, но есть и на румпель или штурвал.
Гидроавторулевые хорошо работают в шторм, до момента поломки. Чаще всего это прорыв старых шлангов высокого давления от сильного импульса переданного волной при ударе в перо руля или другие стандартные поломки техники с гидравликой.
К четвертому виду автоподруливающих устройств, я бы отнёс, электронные автопилоты. Внутри схемы находиться микропроцессор, MEMS акселерометр, GPS и т.д. Естественно, сенсоры могут быть вынесены в любое место на яхте и посредством проводов или беспроводной связи по специальным протоколам передают данные в центральный микропроцессор. Такие автопилоты способны менять программу управления в зависимости от проложенного курса, показания GPS, состояния ветра, AIS, зарегистрированных помех радаром (невидимых) или видеокамерой (видимых). Именно такого автопилота можно сделать на основе устройства (OLinuxino A20 Olimex), которое я использовал на своей яхте.
Поломки этого типа оборудования связаны с повреждением солёной водой непосредственно электронной платы внутри корпуса. Поэтому эти устройства либо должны быть защищены водостойкими корпусами, и водостойкими разъёмами, либо находится внутри сухого корпуса яхты, водоизолированного отсека яхты или водонепроницаемого внешнего контейнера. Так как управление непосредственно обеспечивается через электроавтопилот третьего типа, то добавляются еще и характерные поломки связанные с обрывом пасика и стачиванием пластмассовых механических частей внутри электропилота.
SDR
Ещё одно направление это подключение SDR для мониторинга окружающих судов через AIS и коррекция курса в соответствии с полученными данными.
Для начала можно сделать софт, который будет давать рекомендации. Если после длительного использования эти программы будут протестированы временем на безопасность, то можно добавить этот код для автоматического маневра посредством автопилота.
BlueTooth
Ещё одно направление — это интеграция OpenCPN через BT с внешними интеллектуальными устройствами. Вот таким хорошим примером может быть личная радиостанция с функций человек за бортом, которая составляет важный элемент безопасности экипажа. Так как подобные личные радиостанции закреплены физически на каждом участнике перехода, который выходит на вахту.
Трекер RuCap Um-5 + голосовой интерфейс
Есть возможность подключить трекер головы Um-5. Во время ночной вахты у одиночника на лбу всегда нацеплен фонарик, который очень хорошо совпадает с ультразвуковым фонариком трекера. Поэтому с этим устройством достаточно одного взгляда на экран для промотки карты. И можно использовать направление взгляда для просмотра навигационной карты на одном экране в большем масштабе.
Именно поэтому мы выбрали Olimexino A20-MICRO, так как этой плате не требуется шильдик для подключения стандартного микрофона, а звуковые сигналы можно вывести прямо на обычные динамики. Кроме того звуки на яхте значат очень много. По сути контроль движения яхты происходит именно по звуковому интерфейсу. Капитан точно может идентифицировать все звуки. А появления нового шумового сигнала обычно является командой к действию. Например новый звук протекания воды или скрип стоячего такелажа – все подобные звуки являются сигнализацией неисправности, которая требует срочного исправления или коррекции.
Благодарности
Благодарю моих коллег по предприятию: Пако за предоставленную возможность выполнить такой проект, Хави за многочисленные консультации по техническим вопросам, опытного сотрудника предприятия – мастера Луиса за качественное изготовление корпуса.
Благодарю мастера нашего завода и капитана моторной яхты Хесуса за помощь с дополнительными материалами и профессиональную изоляцию силиконом второго корпуса чартплотера.
Эдуардо за помощь в установке тяжёлого ветроподруливающего устройства за кормой моей яхты. Так же там надо еще диагональные нержавеющие перехваты в раме приварить.
Моему товарищу Павлу за проводку электрики и подключение электроавтопилота к сети питания яхты.
Давнему надёжному другу Лео за реализацию трекера в железе и за многолетнее терпение в ожидании этого проекта.
А также яхтенного капитана Виталия Елагина (oceanschool.ru) за консультации по технической части автопилотов и соавторство по тексту абзацев во время его морского перехода в районе севера: Архангельск – Соловецкие острова.