Самодельный индикатор глубины

yurik_nsk

Активный участник
Какое-то время назад, мы обсуждали показывающие приборы для NMEA - там был целый телевизор со всякими индикаторами. тогда высказывалась мысль, что может быть не панель размером с окно, но показывающие приборы для датчиков NMEA были бы востребованы.

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

DSC_4175.JPG


Небольшая предыстория: пару лет назад я прикупил у нас на форуме эхолот FishFinder 50-200. причем только модуль приемопередатчика с трансдюсером, без картплоттера. сама идея была несколько авантюрной, т.к. не было никакой гарантии что железка запустится и будет работать без управляющей "головы". Тем не менее, все заработало, и при подаче питания приборчик бодро щелкал в автоматическом режиме, и выдавал по NMEA глубину и температуру воды. Я заводил все это в самодельный навигационный комплекс (по сути, навороченный коммутатор NMEA) и наблюдал глубину на отдельном индикаторе компьютера Raspberry Pi, где крутилась OpenCPN и собственный самописный софт. У малинки был десятидюймовый сенсорный экран, и кроме этого - дополнительный маленький плоский экранчик, куда я и выводил график глубины, компас и некоторую служебную информацию.

Все это было отлажено, запущено, но на практике, оказалось что все не так прекрасно.
во-первых, Raspberry Pi 4 грелась как утюг, и работала буквально на грани. ее авторы предусмотрели понижение тактовой при перегреве, но это толком не помогало - кроме цп, есть еще контроллеры периферии, и USB отваливалась только так. на борту, летом при любой жаре приборчик периодически отрубался целиком или терял ком-порты, по которым получал данные из навигационного контроллера. Я прикупил толстенный радиатор с вентиляторами, стало получше, но все равно дохло. к тому же толстый радиатор не давал возможности поставить штатно дополнительный экранчик, все держалось на соплях и кое как.
во-вторых, оказалось что малогабаритный экран очень неудобен в практической эксплуатации. несмотря на то, что софт вполне управлялся в планшетном режиме, но тыкать пальцами в маленькие квадратики оказалось очень неудобно. постоянно ловил себя на том, что вместо планшета, нужна просто самая обычная мыша.
в результате, после прошлого сезона, было принято решение убрать малинку с ее экраном полностью, и поставить рядом с приборной панелью большой ноут и уже там запинать OpenCPN.
Но возник вопрос - как показать глубину? в панели установлен навигационный контроллер, он собирает данные со всех датчиков и вываливает их в комп. но хотелось бы иметь возможность видеть глубину автономно, без компьютера. а еще, плагины CPNа выглядят настолько убого, что даже странно - в наше время все-таки уже можно сделать нормально, при том что сам OpenCPN мне нравится.
Было принято решение сделать индикатор глубины, который бы брал по NMEA данные и рисовал бы их на обычном стрелочном индикаторе. я люблю аналоговую индикацию, и панель приборов я тоже сделал на основе аналоговых стрелочных приборов. тем более, вся рубка на пароходе его создателями выполнена в стиле "дизель-панк" :) но практика показала, что неплохо видеть график глубины - записанные значения за последние пару минут. поэтому кроме стрелочника, индикатор должен еще вести запись графика глубины. и переключать пределы, хотя бы два: мель-глубина, а раз переключаются пределы - значит, и стрелочник должен быть двухдиапазонным. с двумя шкалами. и чтобы не просохатить предел - нужная шкала должна быть выделена светодиодом. ну и раз уж мы ставим графический экранчик и принимаем поток данных NMEA - наверно,можно и компас вывести. и время. и...
и в общем оказалось что стрелочный индикатор - это конечно хорошо, но без экранчика - никуда :)
в результате, получилось вот что:
большой стрелочный индикатор, доработанный напильником и дремелем;
плата c чипом STM32F407VET6 с внешней энергонезависимой FLASH-памятью, для хранения служебных данных;
роскошный OLED-экранчик 256х64.
Экранчик очень красив. его яркость гарантирует что показания будет видно даже днем, при этом он диммируется для ночного режима.
экранчик показывает:
график глубины в двух пределах 0-5 м и 0-25 м, всего 180 точек. поскольку эхолот выдает глубину раз в секунду, экранчик хранит трехминутную историю глубины; глубину можно корректировать (смещать) с учетом особенностей корпуса, правда пока только правкой исходников :) придумаю ручку потом :)
температура воды, с возможностью коррекции;
компас в виде бегущей шкалы в стиле hud, с индикатором курса в центре. была попытка расставить цифры на шкалу, но выглядело аляповато и замусорено, было убрано, оставлен только текущий курс.
курс выбирается между HDGM и COG, тумблером, с индикацией выбранного режима в уголке (символ компаса или GPS) и текстом NO DATA если данные отсутствуют.
время из GPS, с выбором временной зоны;
"время полета" - учет времени плавания, с точностью до минуты, с сохранением в энергонезависимую память, со сбросом с панели приборов. аналог автомобильного счетчика суточного пробега, только по времени. например, чтобы посмотреть, на сколько часов хватает заправки;
Общее время - несбрасываемый счетчик моточасов.
скорость SOG, км/ч
Стрелочный индикатор имеет две шкалы. каждая шкала сбоку имеет светодиод, который обозначает рабочий режим (0-5 - красный) или (0-25 - зеленый).
Индикатору добавлена подсветка, правда она не очень красиво получилась, но функцию выполняет.
DSC_4176.JPG


DSC_4177.JPG


Завтра расскажу о панели приборов и навигационном комплексе в целом.
 

Antel

Старожил форума
Задам глупый вопрос. Используется NMEA который USART, или который CAN?
 

yurik_nsk

Активный участник
который USART. nmea-0183.
на самом деле, это rs422. на али есть переходники в com-ttl.
nmea-2000, которая can, своим протоколом выносит мозг. opencpn отказались ее поддерживать вообще.
 

vasilisk

Активный участник
Отличная реализация. Надо только не забыть защиты по всем проводам сделать от наводок и импульсов, и разъем поменять на что-то герметичное, хотя бы на OL17 из доступного...
 

Antel

Старожил форума
который USART. nmea-0183.
на самом деле, это rs422. на али есть переходники в com-ttl.
nmea-2000, которая can, своим протоколом выносит мозг. opencpn отказались ее поддерживать вообще.
Да, конечно RS422 проще. Но как объединять линии от нескольких устройств? Это же получается нужно от каждого тянуть свою пару или использовать некие объединители с процессором внутри, которому питание нужно. Что то не нравится мне такая топология.
ИМХО могли бы J1708 использовать, как в Американских грузовиках и Вольво. Кстати можно попробовать что то похожее сделать, т.е. на выходы RS422 поставить диоды шоттки и пусть так же, как в J1708, 0 будет активный, а 1 за счёт резисторов (монтажное ИЛИ, как и в CAN собственно). Часть посылок потеряется из-за наложения, но ИМХО оставшихся хватит, шина то совсем мало загружена - осциллом RS422 выход компаса смотрел.
Кстати, надо будет снять лог и выложить здесть.
 

yurik_nsk

Активный участник
Да, конечно RS422 проще. Но как объединять линии от нескольких устройств?
ну, так сделали nmea.
изобрести можно что угодно, но ведь несовместимо будет ни с чем.
можно и CAN использовать, в чистом виде, будет совсем хорошо но ни с чем не совместимо :)
 

yurik_nsk

Активный участник
Отличная реализация. Надо только не забыть защиты по всем проводам сделать от наводок и импульсов, и разъем поменять на что-то герметичное, хотя бы на OL17 из доступного...
корпус герметичный, а под экран здоровенная дыра прорезана:) надо тогда в первую очередь озаботиться акриловым стеклом на герметике, чтобы можно было коробочку в воду бросать.
и тумблеры нужны соответствующие, а то эти тоже протекут...
 

yurik_nsk

Активный участник
Вот структурная схема системы, где будет работать эта коробочка:
navcomplex.png


По сути, это коммутатор NMEA, собранный на плате STM32F4Discovery. Данные в формате NMEA-183 поступают:
из эхолота - стандартный режим 4800 бит/с;
из навигационного датчика, где установлен GPS приемник UBLOX M8N. Приемник выдает множество NMEA-сентенций, нас в основном интересует RMC. Данные выдаются по TTL-линии, со скоростью 9600. рейт выдачи данных - 1 кадр в секунду. Приемник можно конфигурировать - отключать ненужные сентенции, менять рейт итд. но меня вполне устроило то что есть по умолчанию.
Кроме источников NMEA, используются датчик магнитометр-акселерометр LSM303DLHC. маленькая платочка с чипом установлена под GPS-приемником, в отдельном корпусе навигационного датчика. корпус напечатан на принтере, установлен на 75 см алюминиевой штанге, чтобы вынести магнитометр подальше от металла и уменьшить всякие девиации. датчик установлен на крыше рубки. выглядит он вот так:
DSC_4179.JPG


внутри видно антенну GPS-приемника, а под ним находится магнитометр. Платы проклеены, но без фанатизма.
DSC_4180.JPG


Для связи с датчиком используется хорошая витая пара метров трех длиной, питается 5 В, магнитометр работает по I2C на 400 кгц и не сбоит.

Контроллер принимает данные магнитометра и акселерометра, и производит довольно сложную обработку. Дело в том, что сами по себе сырые данные с магнитометра особого смысла не имеют - из-за крена и тангажа вычисляемый магнитный курс имеет очень мало общего с реальным. поэтому магнитный вектор сначала исправляется матричным преобразованием по "мягкому и жесткому железу" (soft iron, hard iron), а потом корректируется по углу, вычисляемому акселерометром. сам же вектор акселерометра тоже вначале корректируется матричным преобразованием, исправляющим ошибки и нелинейности угловых датчиков. после всей этой тригонометрии на выходе имеем магнитный курс (heading), практически не зависимый от крена и тангажа. ну, практически :)
побочным продуктом акселерометра являются сами углы крена и тангажа, которые тоже заворачиваются в посылки NMEA и отправляются в общий канал, вместе с курсом. вся эта канитель потребовала довольно трудоемкой отладки и получилась только со второго раза. в сети много инструкций, но не все они правильны и большинство ориентированы на ардуино, так что если кому-то нужен рабочий сишный код для коррекции магнитометра - я готов отправить и инструкции написать.
Все получившиеся данные имеют разный рейт, и для их сведения в один поток потребовалось некоторое распараллеливание процессов, очень хорошо работает в таких задачах FreeRTOS.
Получившийся поток NMEA раздается потребителям:
радиолокатору Raytheon R20xx- два потока. один для магнитного компаса, второй - для работы GPS и связанных с этим возможностей. Локатору требуется "настоящая" NMEA-4800, поэтому для него задействованы два преобразователя com ttl->rs422 и два ком-порта на контроллере. причем в один канал он не хочет данные брать. нужно обязательно использовать два разных, расфильтровав туда соответствующие посылки. получив магнитный курс и RMC, локатор становится полнофункциональным и поддерживает всякие дополнительные фичи типа ориентации экрана на север, MARPA итд.
другим потребителем является OpenCPN, куда отправляется весь поток данных через com-ttl на скорости 115200. имея и магнитный курс, и путевой угол, CPN рисует два вектора от символа судна, можно оценивать снос итд. Навигационный приемник обеспечивает быстрые и точные данные, гораздо точнее чем gps-приемники в планшетах и телефонах, просто потому что все батарейные системы оптимизируются под минимум потребления, а приемник UBLOX - под точность. поэтому штатный приемник в планшете будет работать, конечно, но вынесенный сенсор точнее.
Еще одним потребителем потока данных NMEA является та самая коробочка, показывающая глубину, курс и прочее. данные она тоже получает по com-ttl, и поскольку она ничего не передает - ее можно просто посадить впараллель на ту же линию.
Все это изобилие потоков данных хорошо решается применением процессоров STM32F4 - у него на борту последовательных портов аж шесть штук.
Кроме данных NMEA, контроллер еще управляет некоторыми аналоговыми приборами на панели приборов. панель выглядит вот так:
DSC_4193.JPG

DSC_4194.JPG


вот это - настоящий дизельпанк:)

у нас на работе подобные устройства называют "консоль", такое название прижилось. консоль - это автономный легкосъемный блок, объединяющий показывающие приборы двигателя, навигационный контроллер и управление отдельными системами (свет, сигнал, помпы откачки итд).
все соединения с внешним миром сделаны на разъемах, консоль можно легко снять, отвезти домой. запитать отдельно и отлаживаться.
мне нравятся аналоговые индикаторы, поэтому на двигатель и обвязку я использовал двухдюймовые показывающие приборы (с всем известного сайта), выдержанные в едином стиле. выглядят они чуть получше чем старые приборы из "уазика", но в общем как оказалось, если делать в одном стиле - то даже и ничего. подсветка приборов белая и яркая, для серьезной темноты обязательно потребуется диммирование.
некоторые датчики для них я заменял (например, манометрический). родной выкидывал и перетачивал переходник. а температурный отлично подошел к старому советскому - похоже, они все одинаковы внутри.
указатели уровня топлива я купил с датчиками, поставил в баки и вполне хорошо получилось - меряют примерно как в старых наших машинах - т.е. стрелки дергаются при качке и чувствуется что в определенных точках нелинейность из-за проволочного реостата :)
тахометр использован большой, наш отечественный, туда заведен сигнал с генератора. на генераторе дизеля смд-14 никаких выводов для тахометра не предусмотрено, пришлось разобрать и припаяться к обмотке. тахометр работает, но надо будет точнее откалиброваться (внутри есть потенциометр).
второй большой тахометр используется в качестве спидометра - поскольку у него вполне подходящая шкала (до 35) то я даже не перерисовывал ее, а просто заклеил надпись rpm - бумажкой с надписью "SOG км/ч" :)
чтобы вывести на тахометр сигнал с контроллера, нужно выдать ему переменную частоту. по сути, такие тахометры - это аналоговые частотомеры, и если ему подать меандр переменной частоты (порядка 200 гц) - стрелка будет отклоняться пропорционально частоте. линейность не очень хороша, приборчик врет, но в общем для целей посмотреть скорость с точностью 1 км/ч вполне пригоден. в контроллере для такой цели удобно использовать таймер - в него достаточно кинуть значение, а таймер сам сформирует нужную частоту. одна проблема - тахометр хочет на вход сигнал порядка 5 вольт, поэтому от логического уровня контроллера он работать не хочет, или работает неустойчиво. проблему решает обычный каскад на биполярном транзисторе (хотя бы кт3102) и двух резисторов 1.8К - в базу и коллектор. если кому захочется повторять - нарисую.
Кроме тахометра, показывающего скорость, на панели установлен дифференциальный индикатор. это маленький микроамперметр с нулем в центре шкалы. он тоже управляется от контроллера и служит индикатором самых разных параметров, которые имеют по природе двуполярный характер. на этот индикатор выведены:
крен;
тангаж;
навигационные параметры:
отклонение от заданного курса (плюс-минус румб);
отклонение от заданного путевого угла (плюс-минус румб);
дрейф.
Для фиксации курса/угла установлена кнопочка с подсветкой. Идея была такая: допустим, ты обходишь бакен, видишь впереди следующий. нажимаешь кнопку и продолжаешь движение,удерживая стрелку в центре. по сути, это компас, только если используется режим GPS - тебе учитывается снос. это такая простейшая навигационная система, которая работает без всяких компьютеров.
ну вот, это вкратце о приборах. у меня была мысль реализовать полноценную навигационную систему (я даже присобрал необходимую библиотеку) но в общем по зрелому размышлению понял что в том же cpne уже все есть,и никому это не понадобится.
а если кто-то захочет что-нибудь из вот этого всего использовать - пишите, я выложу исходники и инструкции что куда соединять.
 

vasilisk

Активный участник
Интересно. Тоже есть мысль со всем этим поиграться. Правда, смотрю в сторону CAN, хотя и RS422 в принципе достаточно помехоустойчив и безопасен при правильной разводке дифф.цепей с защитами. Даже автопилот можно сделать с вейпоинтами, в свое время много игрался и разбирался с ардупилотом, там практически весь функционал готовый... Например, самое простое - кнопку "человек за бортом", чтобы катер выходил на точку нажатия.
 

yurik_nsk

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

skaler

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