Yacht Devices Новости: Управление автопилотами SeaTalk 1 через Web Gauges
04.12.2023
NMEA 2000 Wi-Fi Router теперь управляет автопилотами SeaTalk 1 как штатный пульт и обрабатывает входящие предложения XDR.
Рисунок 1. Управление автопилотом в Web Gauges
В идеальном мире вы нажимаете точку на карте, автопилот включается, и яхта под всеми парусами идёт к ней. В реальности программа на компьютере или телефоне, скорее всего, передаёт предложения NMEA 0183 по TCP/IP, а автопилот подключён к NMEA 2000. Шлюз между компьютером и судовой сетью должен преобразовать данные — и всё заработает.
Но это в идеальном мире. На практике большинству автопилотов для включения TRACK нужна фирменная команда, а иногда такие команды требуются и во время движения. Это привязывает автопилот к дисплею и пульту того же производителя.
С пультами всё ещё сложнее: нажатия «AUTO», «+10» и других кнопок вызывают фирменные команды. Например, пультом Garmin нельзя управлять автопилотом Simrad, хотя оба работают через NMEA 2000, имеют те же режимы и кнопки +10/-10.
Наши шлюзы много лет поддерживают TRACK и GOTO для всех известных автопилотов SeaTalk NG, SeaTalk 1, NMEA 0183 и NMEA 2000. Для некоторых достаточно нажать «Track» на пульте и затем активировать маршрут или путевую точку в программе. Для Raymarine мы добавили специальную поддержку, которую нужно включить в настройках шлюза.
Пользователи часто просили добавить функции пульта в Web Gauges, и в предыдущем обновлении мы это сделали. Появилось управление автопилотами Raymarine SeaTalk NG со страницы браузера как со штатного пульта. SeaTalk NG — фирменный вариант NMEA 2000. Можно включать и отключать AUTO, WIND и TRACK, корректировать курс, выполнять повороты оверштаг и многое другое.
Рисунок 2. Настройки автопилота в Web Gauges
В этой версии такие же возможности добавлены для SeaTalk 1. Если в настройке «Third Party Autopilot» выбрать «Raymarine SeaTalk 1», Web Gauges начнут формировать предложения $STALK. Шлюз должен преобразовать их в датаграммы SeaTalk 1 и передать через соответствующий интерфейс.
$STALK,86,21,02,FD*4C
$STALK,84,36,02,00,40,00,03,00,08*69
$STALK,86,21,03,FC*4A
$STALK,84,36,C2,08,4A,00,03,00,08*63
Поэтому эта функция недоступна для NMEA 2000 Wi-Fi Gateway и Ethernet Gateway , у которых нет физического порта SeaTalk 1, и работает только в NMEA 2000 Wi-Fi Router YDNR-02. Тем не менее мы выпустили прошивку 1.71 для всех этих устройств, чтобы синхронизировать версии Web Gauges. Ещё до конца года планируем добавить функцию в NMEA 0183 Wi-Fi Router YDWR-02 . Разумеется, мы работаем и над совместимостью Web Gauges с автопилотами других производителей: присылайте записи NMEA 2000!).
Следующая новинка NMEA 2000 Wi-Fi Router — обработка входящих XDR. Эти предложения передают измерения температуры, силы, давления, уровня жидкости и других физических величин. Проблема в том, что имена датчиков не определены стандартом NMEA, и температуру воздуха разные производители обозначают как Air, TempAir, ENV_AIR_T и так далее.
Рисунок 3. Новые настройки XDR
Во всех наших шлюзах есть 21 настраиваемое поле для исходящих XDR — в основном для двигателя и окружающей среды. Три из них, Yaw, Roll и Pitch, используются и при обработке входящих предложений. В этом выпуске добавлены ещё три настраиваемых поля типов данных для аккумуляторов, топливных и водяных баков и других датчиков.
Например, для аккумулятора мы собираем напряжение, ток и температуру корпуса независимо от того, переданы они одним XDR или тремя отдельными. Поддерживаются все типы данных и единицы измерения заявленных датчиков. Ниже — примеры XDR, которые можно обрабатывать с новыми настройками:
$IIXDR,U,12.10,V,A016,*3B
$IIXDR,I,2.1,A,A016,*31
$IIXDR,C,22.5,C,A016*23
$IIXDR,U,12.75,V,A017,I,-1.1,A,A017*69
$IIXDR,V,15,P,FUEL*56
$IIXDR,E,11,P,WATER*0E
$IIXDR,U,12.75,V,A017,I,2.3,A,A017*45
$IIXDR,P,1.02481,B,Barometer*29
$YDXDR,P,99930,P,Baro*57
$IIXDR,C,19.52,C,TempAir*19
Это достаточно гибкое, но всё же не универсальное решение. Поддержка получает много запросов о старых приборах NMEA, совместимости разных поколений, удалении ошибочных данных неисправных датчиков и других задачах. Часть из них решает NMEA 2000 Bridge, но у него два интерфейса CAN (NMEA 2000) и нет NMEA 0183.
Как вы, возможно, знаете, в январе 2024 года мы ожидаем выпуск Yacht Devices Python Gateway с NMEA 0183 и NMEA 2000 и выполнением программ Python для обработки данных на лету. Он также имеет USB: можно подключить его к компьютеру, открыть терминал и вводить команды Python для проверки кода и наблюдения за интерфейсами или просто чтобы выглядеть крутым хакером. Рекомендуем проверенный зелёный цвет текста в терминале.
Ниже приведён код Python Gateway для обработки входящих XDR с данными аккумулятора и их преобразования в NMEA 2000. Если вы не знакомы с Python, программа может показаться длинной и сложной. Но многие любят этот язык, и мы рекомендуем провести выходные с книгой по Python, чтобы увидеть красоту, изящество и возможности этих строк.
import struct
TALKER = b'II' # talker id to receive XDR from
XDR_ID = b'A016' # sensor id to process measurements from
BATTERY_INSTANCE = 1 # NMEA2000 battery instance to send
XDR_UNITS = { # (coefficient, offset)
b'U' : { b'V': (1.0, 0.0) }, # voltage
b'I' : { b'A': (1.0, 0.0) }, # current
b'C' : { b'K': (1.0, 0.0), b'C': (1.0, 273.15) } # temperature (kelvin)
}
xdr_sensor = dict() # collected sensor data
# converts NMEA0183 units to default NMEA2000 units
def to_n2k_unit(type, value, unit):
coeff, offset = XDR_UNITS[type][unit]
return float(value) * coeff + offset
# returns sensor measurement value in correct format for NMEA2000
def xdr_n2k_value(type, resolution, na):
return int(round(xdr_sensor[type] / resolution)) if type in xdr_sensor else na
# sends battery information to NMEA2000
def xdr_send_n2k_battery():
voltage = xdr_n2k_value(b'U', 0.01, 0x7FFF)
current = xdr_n2k_value(b'I', 0.1, 0x7FFF)
temperature = xdr_n2k_value(b'C', 0.01, 0xFFFF)
n2k_data = struct.pack('<BhhHB', BATTERY_INSTANCE, voltage, current, temperature, 0xFF)
n2k.sendpgn(n2k_data, 127508)
# called upon receive of '$IIXDR' message
def rx_xdr(n0183, line):
line = line[7:line.find(b'*')] # b'$IIXDR,U,12.10,V,A016,*3B\r\n' -> b'U,12.10,V,A016,'
args = line.split(b',') # [b'U', b'12.10', b'V', b'A016', b'']
has_voltage = False
for I in range(0, len(args) & (~0x3), 4):
id = args[I+3]
if id != XDR_ID:
continue
type = args[I]
xdr_sensor[type] = to_n2k_unit(type, args[I+1], args[I+2])
has_voltage = has_voltage or type == b'U'
if has_voltage:
xdr_send_n2k_battery()
# return True in case we want to retransmit received XDR to TX port (see line below)
return True
# disable retransmittion of received NMEA0183 messages to uart_tx
n0183.forward(False)
# register callback on receive of '$IIXDR' NMEA0183 message
n0183.rxcallback(0, rx_xdr, b'$' + TALKER + b'XDR')
Если новые настройки вызывают затруднения, наша поддержка подготовила пошаговую инструкцию: Примечания к выпуску и применению прошивки 1.71 для YDNR-02, YDWG-02, YDEN-02.
Прошивки версии 1.71 для NMEA 2000 Wi-Fi Router, NMEA 2000 Wi-Fi Gateway и Ethernet Gateway доступны в разделе загрузок.


