Yacht Devices Новости: Python Gateway: программируемый шлюз NMEA 2000, NMEA 0183 и USB

27.03.2024

Невероятно, но факт: вся мощь Python 3 при энергопотреблении трёх обычных светодиодов диаметром 3 мм и преобразование сообщений AIS из NMEA 0183 в NMEA 2000 всего за 1,5 мс. С гордостью представляем наш самый увлекательный продукт для установщиков, разработчиков и исследователей NMEA!

Python Gateway после распаковки

Если хотите сразу увидеть, как это работает, откройте этот пример. В десяти строках кода мы создали виртуальный эхолот, который получает данные настоящего и немного их корректирует. Зачем это нужно? Например, сломался дисплей из комплекта эхолота и вы больше не можете задать поправку на глубину установки датчика. Эти десять строк превращают шлюз в устройство типа «эхолот», которое можно выбрать в списке источников данных многофункционального дисплея и снабдить видимым на нём описанием. При этом созданный эхолот соответствует NMEA 2000 и обрабатывает все необходимые сообщения.

Даже опытному программисту, знакомому с CAN и используемым микроконтроллером, понадобится неделя, чтобы написать и отладить такой код на C. Не верите — спросите программистов. Они ответят, что хватит трёх дней, но уйдёт как минимум неделя. Скорее две или три: для соответствия стандарту нужно поддержать больше десятка служебных сообщений, которых не видно в примере, и некоторые из них совсем непростые.

Как запустить код на Python Gateway? Очень просто: подключите устройство к компьютеру по USB, откройте появившийся диск, затем файл main.py в любом текстовом редакторе и вставьте код примера. Сохраните, перезагрузите устройство — готово.

Thonny IDE с программой вольтметра

Рисунок 1. Thonny IDE с программой вольтметра

А ещё лучше скачать Thonny IDE. Это бесплатная среда разработки с открытым кодом: она позволяет редактировать файлы прямо на устройстве, запускать и останавливать программу, смотреть переменные, подсвечивает синтаксис и многое другое. И работает она через консоль, а не через диск. При подключении по USB Python Gateway одновременно предоставляет два устройства: диск и последовательный порт с интерпретатором Python (REPL). Thonny умеет читать и записывать файлы и получать данные через терминальный сеанс.

Терминальный сеанс с Python Gateway

Рисунок 2. Терминальный сеанс с Python Gateway

Разумеется, можно подключиться и обычной терминальной программой. Введите can.test(), и на экране появятся десять сообщений, полученных с шины CAN. Всё будет как в фильме про хакеров, особенно если в терминале зелёные буквы.

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

Помимо USB и CAN (NMEA 2000), устройство имеет два аппаратных последовательных порта NMEA 0183. Точнее, две половины портов: один только принимает, второй только передаёт. Это позволяет подключить два устройства на разных скоростях, например 4800 и 38400 бод, и организовать шлюз между ними. Последовательный интерфейс имеет высоковольтную гальваническую развязку от USB и CAN.

В реализации последовательных портов есть разные полезные возможности, например инверсия линий. Это позволяет подключать не только стандартные устройства RS-422A (NMEA 0183), но и более экзотические системы. Например, Python Gateway может считывать данные B&G FastNet и Raymarine SeaTalk 1; вскоре мы опубликуем примеры кода.

Возможно, вы уже знаете наш NMEA 2000 Bridge— шлюз между двумя сетями CAN со встроенным языком программирования для обработки сообщений. Большую часть этих устройств покупают компании-партнёры, создающие на их базе собственные шлюзы: от простых фильтров данных до специализированных систем телеметрии и управления электрическими силовыми установками.

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

Наше устройство основано на коде популярного проекта MicroPython, адаптирующего Python 3 для микроконтроллеров. Конечно, мы не можем предложить такую же производительность и разнообразие библиотек, как персональные или даже одноплатные компьютеры вроде Raspberry Pi. Тем не менее шлюз отлично справляется с задачами, для которых создан.

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

   !AIVDM,1,1,,A,13umv<7P00Q5BUBOP@J00?w`J4Jd,0*4D
   !AIVDM,1,1,,B,144jQ301ib16`;BOc2:kuS9`H8NR,0*54
   !AIVDM,1,1,,B,15W9JJ01AL16JP@OlbjRIiu`H8O9,0*54
   !AIVDM,1,1,,A,14`bt4002i12oK6Od7J1siUbH@SH,0*72
   !AIVDM,1,1,,B,148Onl701D14k@<OlI=JupSdH8OB,0*67

Обработка такого сообщения занимает 1,5 мс, поэтому преобразователь легко работает в реальном времени: соединение на 38400 бод передаёт менее 80 сообщений в секунду. Устройство потребляет всего 32 мА — примерно как три маленьких светодиода, подобных установленным на нём самом. При передаче по NMEA 0183 с максимальной нагрузкой ток может достигать 68 мА.

Чтобы познакомиться с устройством, откройте его страницу или руководство по программированию. Уверены, начав пользоваться им, вы увлечётесь! Если устройство уже у вас, скачайте прошивку 1.02 из раздела загрузок.