Перейти к содержимому

Фотография

Давление, температура, обороты старого двигателя в NMEA2000


Сообщений в теме: 40

#1 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 17 марта 2019 - 07:59

В продолжение темы о самодельных конверторах NMEA2000<->NMEA0183 https://forum.katera...er-n2k-nmea183/

А как самому передать данные от аналоговых датчиков двигателя в N2k, известны и съедобны ECHOMAPom 54 -  PNG127488, 127489, 127493, 127498, 127505. Как измерить, это понятно (хотя непросто), а вот теперь передать в N2k средствами библиотеки NMEA2000 https://github.com/t...lainen/NMEA2000. Польза понятна, ведь многие современные эхолоты/картплоттеры способны отображать приборную панель.

Да, коробочки по 6 тыр известны https://alligator-bo...iborov-nmea2000 - сюда про них не надо писать.


  • 0

#2 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 17 марта 2019 - 08:53

Ага, в библиотеке есть функции:

// Engine rapid param
void SetN2kPGN127488(tN2kMsg &N2kMsg, unsigned char EngineInstance, double....

// Engine parameters dynamic
void SetN2kPGN127489(tN2kMsg &N2kMsg, unsigned char EngineInstance, double ....

// Transmission parameters, dynamic
void SetN2kPGN127493(tN2kMsg &N2kMsg, unsigned char EngineInstance, tN2kTransmissionGear TransmissionGear,....

// Fluid level
void SetN2kPGN127505(tN2kMsg &N2kMsg, unsigned char Instance, tN2kFluidType FluidType, double Level, double Capacity) ....

 

Есть шанс.


  • 1

#3 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 17 марта 2019 - 09:17

Из примера TemperatureMonitor все понятно - к вечерку попробую.


  • 0

#4 nvc

nvc

    Яхтенный капитан

  • Модератор форума
  • 4 544 сообщений
  • Из:Black Sea coast
  • Судно: Leisure17+Seal 36

Отправлено 17 марта 2019 - 10:38

Я смотрю на эти либы и понимаю, что если буду нечто делать, то придется писать свою.
Уж слишком то что я вижу сделано "наколенке", типа "херак херак в продакшен на гитхаб" :)
Но использовать их как базу, от которой отталктваться - безусловно можно.
  • 0

#5 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 17 марта 2019 - 13:14

Собака, не все так просто, куча параметров, флагов, индекс двигателя. Надолго.


  • 0

#6 nvc

nvc

    Яхтенный капитан

  • Модератор форума
  • 4 544 сообщений
  • Из:Black Sea coast
  • Судно: Leisure17+Seal 36

Отправлено 17 марта 2019 - 15:46

Собака, не все так просто, куча параметров, флагов, индекс двигателя. Надолго.

Та уж... наворотили в этом N2K - голову свернуть можно.


  • 0

#7 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 17 марта 2019 - 15:58

Глаза боятся - руки делают. Все не так страшно, только приборы убогие.

Прикрепленные изображения

  • 17032019.jpg
  • 17032019(001).jpg
  • 17032019(002).jpg

  • 0

#8 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 17 марта 2019 - 16:04

  // Demo: NMEA2000 library. Send main cabin temperature to the bus.

#include <Arduino.h>
#include <NMEA2000_CAN.h>  // This will automatically choose right CAN library and create suitable NMEA2000 object
#include <N2kMessages.h>

// List here messages your device will transmit.
const unsigned long TransmitMessages[] PROGMEM={130310L,130311L,130312L,0};

void setup() {
  // Set Product information
  NMEA2000.SetProductInformation("00000001", // Manufacturer's Model serial code
                                 100, // Manufacturer's product code
                                 "Simple temp monitor",  // Manufacturer's Model ID
                                 "1.1.0.21 (2016-12-31)",  // Manufacturer's Software version code
                                 "1.1.0.0 (2016-12-31)" // Manufacturer's Model version
                                 );
  // Set device information
  NMEA2000.SetDeviceInformation(112233, // Unique number. Use e.g. Serial number.
                                130, // Device function=Temperature. See codes on http://www.nmea.org/...odes v 2.00.pdf
                                75, // Device class=Sensor Communication Interface. See codes on  http://www.nmea.org/...odes v 2.00.pdf
                                2040 // Just choosen free from code list on http://www.nmea.org/...ration list.pdf                              
                               );
  // Uncomment 2 rows below to see, what device will send to bus. Use e.g. OpenSkipper or Actisense NMEA Reader                          
  //Serial.begin(115200);
  //NMEA2000.SetForwardStream(&Serial);
  // If you want to use simple ascii monitor like Arduino Serial Monitor, uncomment next line
  //NMEA2000.SetForwardType(tNMEA2000::fwdt_Text); // Show in clear text. Leave uncommented for default Actisense format.

  // If you also want to see all traffic on the bus use N2km_ListenAndNode instead of N2km_NodeOnly below
  NMEA2000.SetMode(tNMEA2000::N2km_NodeOnly,22);
  //NMEA2000.SetDebugMode(tNMEA2000::dm_Actisense); // Uncomment this, so you can test code without CAN bus chips on Arduino Mega
  NMEA2000.EnableForward(false); // Disable all msg forwarding to USB (=Serial)
  // Here we tell library, which PGNs we transmit
  NMEA2000.ExtendTransmitMessages(TransmitMessages);
  NMEA2000.Open();
}


void loop() {
  SendN2kTemperature();
  NMEA2000.ParseMessages();
}

double ReadCabinTemp() {
  return CToKelvin(22.5); // Read here the true temperature e.g. from analog input
}

double ReadWaterTemp() {
  return CToKelvin(15.5); // Read here the true temperature e.g. from analog input
}

#define TempUpdatePeriod 2500
//J2K100
double EngineSpeed=5000 ;
 double EngineBoostPressure=50 ;
 int8_t EngineTiltTrim=15 ;
 /*
 unsigned char EngineInstance=0 ;//
 double EngineOilPress=3 ; //PAS
 double EngineOilTemp=50 ;  //KEL
 double EngineCoolantTemp=10  ; //KEL
 double AltenatorVoltage=28  ;  //V
 double FuelRate=10 ;  //GPH
 double EngineHours=1100 ;  //SEC
 double EngineCoolantPress=10 ;  //PAS
 double EngineFuelPress=11  ;  // PAS
 int8_t EngineLoad=50 ;  //%
 int8_t EngineTorque=50 ;  //%
 bool flagCheckEngine=1 ; //ON/OFF
 bool flagOverTemp=0 ;
 bool flagLowOilPress=0 ;
 bool flagLowOilLevel=0  ;
 bool flagLowFuelPress=0 ;
 bool flagLowSystemVoltage=0 ;
 bool flagLowCoolantLevel=0 ;
 bool flagWaterFlow=1 ;
 bool flagWaterInFuel=1 ;
 bool flagChargeIndicator=1 ;
 bool flagPreheatIndicator=0 ;
 bool flagHighBoostPress=0 ;
 bool flagRevLimitExceeded=0 ;
 bool flagEgrSystem=0 ;
 bool flagTPS=0 ;
 bool flagEmergencyStopMode=0 ;
 bool flagWarning1=0 ;
 bool flagWarning2=0 ;
 bool flagPowerReduction=0 ;
 bool flagMaintenanceNeeded=0 ;
 bool flagEngineCommError=0 ;
 bool flagSubThrottle=0 ;
 bool flagNeutralStartProtect=0 ;
 bool flagEngineShuttingDown=0
*/
 
void SendN2kTemperature() {
  static unsigned long TempUpdated=millis();
  tN2kMsg N2kMsg;

  if ( TempUpdated+TempUpdatePeriod<millis() ) {
    TempUpdated=millis();
    SetN2kEngineParamRapid(N2kMsg, 0, EngineSpeed,
                     EngineBoostPressure, EngineTiltTrim);
                     NMEA2000.SendMsg(N2kMsg);
   SetN2kEngineDynamicParam(N2kMsg, 0, 300000, 100+273, 90+273, 28,
                       10, 1100,10 ,11 ,50 ,50,
                       1,0, 0, 0, 0, 0, 0,1, 0, 1, 0, 0,0,0,0, 0, 0,0,0,0,0,0,0,0) ;
                       NMEA2000.SendMsg(N2kMsg);
    //*/
    SetN2kTemperature(N2kMsg, 1, 1, N2kts_MainCabinTemperature, ReadCabinTemp());
    NMEA2000.SendMsg(N2kMsg);
    SetN2kEnvironmentalParameters(N2kMsg, 1, N2kts_MainCabinTemperature, ReadCabinTemp());
    NMEA2000.SendMsg(N2kMsg);
    SetN2kOutsideEnvironmentalParameters(N2kMsg, 1, ReadWaterTemp());
    NMEA2000.SendMsg(N2kMsg);
    Serial.print(millis()); Serial.println(", Temperature send ready");
  }
}
 


  • 1

#9 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 17 марта 2019 - 16:08

новое в примере

 

//J2K100
double EngineSpeed=5000 ;
 double EngineBoostPressure=50 ;
 int8_t EngineTiltTrim=15 ;
 /*
 unsigned char EngineInstance=0 ;//
 double EngineOilPress=3 ; //PAS
 double EngineOilTemp=50 ;  //KEL
 double EngineCoolantTemp=10  ; //KEL
 double AltenatorVoltage=28  ;  //V
 double FuelRate=10 ;  //GPH
 double EngineHours=1100 ;  //SEC
 double EngineCoolantPress=10 ;  //PAS
 double EngineFuelPress=11  ;  // PAS
 int8_t EngineLoad=50 ;  //%
 int8_t EngineTorque=50 ;  //%
 bool flagCheckEngine=1 ; //ON/OFF
 bool flagOverTemp=0 ;
 bool flagLowOilPress=0 ;
 bool flagLowOilLevel=0  ;
 bool flagLowFuelPress=0 ;
 bool flagLowSystemVoltage=0 ;
 bool flagLowCoolantLevel=0 ;
 bool flagWaterFlow=1 ;
 bool flagWaterInFuel=1 ;
 bool flagChargeIndicator=1 ;
 bool flagPreheatIndicator=0 ;
 bool flagHighBoostPress=0 ;
 bool flagRevLimitExceeded=0 ;
 bool flagEgrSystem=0 ;
 bool flagTPS=0 ;
 bool flagEmergencyStopMode=0 ;
 bool flagWarning1=0 ;
 bool flagWarning2=0 ;
 bool flagPowerReduction=0 ;
 bool flagMaintenanceNeeded=0 ;
 bool flagEngineCommError=0 ;
 bool flagSubThrottle=0 ;
 bool flagNeutralStartProtect=0 ;
 bool flagEngineShuttingDown=0
*/

..................................................

   SetN2kEngineParamRapid(N2kMsg, 0, EngineSpeed,
                     EngineBoostPressure, EngineTiltTrim);
                     NMEA2000.SendMsg(N2kMsg);
   SetN2kEngineDynamicParam(N2kMsg, 0, 300000, 100+273, 90+273, 28,
                       10, 1100,10 ,11 ,50 ,50,
                       1,0, 0, 0, 0, 0, 0,1, 0, 1, 0, 0,0,0,0, 0, 0,0,0,0,0,0,0,0) ;
                       NMEA2000.SendMsg(N2kMsg);
    //*/


  • 1

#10 Barquero

Barquero

    Яхтенный капитан

  • Капитан
  • 2 577 сообщений
  • Из:СПб
  • Судно: строю

Отправлено 17 марта 2019 - 17:42

Ну Миша - ты мозг, нечеловеческий:):), но приборы на картинках - эт что-то, те которые на третьей фоте прям в ступор вводят.


  • 0

#11 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 17 марта 2019 - 18:08

Ну Миша - ты мозг, нечеловеческий :):), но приборы на картинках - эт что-то, те которые на третьей фоте прям в ступор вводят.

давления: масло в движке, топлива, в редукторе и в поднималке мотора (трим) - это под вопросо . 98 кпа = 1 атм.

на 1 температура масла, воды и напряжение. на второй обороты, угол трима, топливо в баках и заданный его расход. 2а последних можно задать, а можно получить от датчиков.


  • 0

#12 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 17 марта 2019 - 20:10

Вот такая бабалайка лежит - внедрить уже 5 лет не могу, однако отечественные датчики давления и температуры заложены в прогу, и тахометр.


Вот такая бабалайка лежит https://forum.katera...amodelki/page-6 - внедрить уже 5 лет не могу, однако отечественные датчики давления и температуры заложены в прогу, и тахометр.


  • 0

#13 maxik

maxik

    Яхтенный капитан

  • Администратор
  • 2 185 сообщений
  • Из:Москва
  • Судно: 34 фута
  • Название: Ирида

Отправлено 17 марта 2019 - 21:00

Я в прошлом году сделал при помощи этой библиотеки вывод двнных с движка в гарминовский картплоттер. Правда пришлось делать на  двух ардуинках -- одна считает частоты, вторая пуляет все это в шину. Там проблема, данные с движка должны пуляться не реже чем 10 раз в секунду. Поэтому функциями ипа delay в коде пользоваться нельзя.


  • 0

#14 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 18 марта 2019 - 05:09

Я в прошлом году сделал при помощи этой библиотеки вывод двнных с движка в гарминовский картплоттер. Правда пришлось делать на  двух ардуинках -- одна считает частоты, вторая пуляет все это в шину. Там проблема, данные с движка должны пуляться не реже чем 10 раз в секунду. Поэтому функциями ипа delay в коде пользоваться нельзя.

Спрашивал ведь тебя - что за датчики. Данных с движка... частоты... - ты только тахометр завел или еще что? Данные с датчиков давления масла и температуры завел? Текстом вывода в шину поделись, плз.


  • 0

#15 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 18 марта 2019 - 07:54

поигрался с флагами исправности, вот так все нормально, только низкое давление масла  0,0, 1, 0, 0, 0, 0,0, 0, 0, 0, 0,0,0,0, 0, 0,0,0,0,0,0,0,0) - прибор розовый фон получил, пошел звуковой сигнал.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

Прикрепленные изображения

  • 18032019.jpg

  • 0

#16 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 18 марта 2019 - 08:15

Получается простой вариант . Если приборный щиток в МО,то в рубке на картплоттер проще всего вывести сигнал от тахометра (самодельного) и датчиков перегрева мотора и низкого давления масла, можно добавить индикатор заряда.


  • 0

#17 FStager

FStager

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 578 сообщений
  • Из:Москва

Отправлено 18 марта 2019 - 12:16

Получается простой вариант . Если приборный щиток в МО,то в рубке на картплоттер проще всего вывести сигнал от тахометра (самодельного) и датчиков перегрева мотора и низкого давления масла, можно добавить индикатор заряда.

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

Разумеется, я не претендую на пересказ доступного, но отсылок для тех, кто не в теме, хотелось бы.
  • 0

#18 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 18 марта 2019 - 13:01

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

Разумеется, я не претендую на пересказ доступного, но отсылок для тех, кто не в теме, хотелось бы.

Вот бы от вас такие комменты получать. Если кроме датчиков давления и температуры (обычно они резистивные) у двигателя есть датчик перегрева и падения давления, то это обычные контакты. Они замыкаются (или размыкаются) при наступлении аварии. Как контакт к процессору присоединить можно найти в тырнете. Обнаружив изменение состояния контакта мп должен будет выставить соответствующий флаг в посылке.

С резистивными датчиками все сложнее, они сами нелинейны довольно. Ко всему их можно подключить как в случае "коробочки" https://alligator-bo...iborov-nmea2000, те без прибора индикации, так проще обрабатывать данные, но пропадают показания штатных приборов. В ином случае (если подключены еще и штатные индикаторы)добавляется еще нелинейность. Я в своем у-ве (иной случай) применил степенную аппроксимацию дляТМ100 и ММ358 - И ЭТО ПРИ ТОМ, ЧТО ИХ ХАРАКТКРИСТИКИ в виде графиков известны.


  • 0

#19 FStager

FStager

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 578 сообщений
  • Из:Москва

Отправлено 18 марта 2019 - 13:34

Вот бы от вас такие комменты получать.

А Вы спрашивайте. Я отвечаю на прямые корректно поставленные вопросы.

Если кроме датчиков давления и температуры (обычно они резистивные) у двигателя есть датчик перегрева и падения давления, то это обычные контакты. Они замыкаются (или размыкаются) при наступлении аварии. Как контакт к процессору присоединить можно найти в тырнете. Обнаружив изменение состояния контакта мп должен будет выставить соответствующий флаг в посылке.
С резистивными датчиками все сложнее, они сами нелинейны довольно.

Есть ещё датчик оборотов...

Я правильно понимаю, что типовой схемы нет, и если хочется "оцифровать" показания, не разрушая существующей системы, всё нужно придумывать самому?
  • 0

#20 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 18 марта 2019 - 14:15

Да, датчик оборотов можно на герконе сварганить и магните, обработка через прерывание.

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


  • 0

#21 nvc

nvc

    Яхтенный капитан

  • Модератор форума
  • 4 544 сообщений
  • Из:Black Sea coast
  • Судно: Leisure17+Seal 36

Отправлено 18 марта 2019 - 14:16

Есть ещё датчик оборотов...

С ним то проще всего. Импульсы таймером посчитать да и всё.

Я правильно понимаю, что типовой схемы нет, и если хочется "оцифровать" показания, не разрушая существующей системы, всё нужно придумывать самому?

По сути так.
По температуре(ам) я бы заморочился на датчик DS18B20(+) в разных его вариантах - есть уже с металличеком корпусе сразу.
Ну или другой датчик, подходящий по параметрам, но чтобы сразу с цифровым выходом был. С любым, например CAT6095.
Но это всё надо в корпус будет втулить, который уже вкручивать в движек.

А вот по давлению масла - засада.
Дешевых нет. Да и те что есть аналоговые в основном.
Вот чето такое есть вроде с PWM выходом, уже полегче.
https://www.hella.co...sensor-386.html
Он же и температуру у масла может мерять, полезно кстати.

Ну а потом это всё добро собирать в микроконтроллер, и писать прошивку.
  • 0

#22 БАР

БАР

    Яхтенный капитан

  • Инженер
  • 17 607 сообщений
  • Из:СПб
  • Судно: СТ-31э
  • Название: Авось

Отправлено 18 марта 2019 - 14:59

А в чем проблема с аналоговым сигналом? Сейчас АЦП как грязи.


  • 0

#23 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 14 330 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 18 марта 2019 - 16:10

А в чем проблема с аналоговым сигналом? Сейчас АЦП как грязи.

Проблема с переводом показаний АЦП в правдоподобную температуру и давление.


  • 1

#24 nvc

nvc

    Яхтенный капитан

  • Модератор форума
  • 4 544 сообщений
  • Из:Black Sea coast
  • Судно: Leisure17+Seal 36

Отправлено 18 марта 2019 - 16:12

А в чем проблема с аналоговым сигналом? Сейчас АЦП как грязи.

А Вы пробовали ? :)
Не я не ради прикола. Просто чтобы оцифровать реальный аналоговый сигнал,
не тот что на столе с адуринкой, а реальный "in live" - так стоко заморочек всяких надо преодолеть.
Вернее не то чтобы оцифровать, а чтобы результат нормальный получить.

Понятно что если взять +- километр запаса то наверное не вопрос, а так там начинается, шумы, помехи, нелинейности датчиков, зависимости от температуры, и проч. проч. проч.
А тут вот датчик выдает сразу цифру - никаких заморочек в софте не надо.

А так то да, АЦП в любом МК есть. Только 12 бит - это маловато :\
Потому что в реальности работаем с 10ю битами, а то и с 9ю - остальные шумят.
16-ти битные SignaDelta поточнее будут, но там уже вопросы самих датчиков.

В общем, на мой взгляд, намного проще взять готовое аппаратное решение.
Тем паче, что датчики с цифровыходом не так и дороги.

P.S. Вот пока писал, коллега StrangerM это короче сказал :)
  • 0

#25 БАР

БАР

    Яхтенный капитан

  • Инженер
  • 17 607 сообщений
  • Из:СПб
  • Судно: СТ-31э
  • Название: Авось

Отправлено 18 марта 2019 - 16:15

Проблема с переводом показаний АЦП в правдоподобную температуру и давление.

Это называется тарировка.  :)  Вы же сами написали выше про степенную функцию.


  • 0



Ответить



  


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей