Volkswagen TDI Marine connect to NMEA2K?

Tbinder

New member
Joined
25 Oct 2021
Messages
4
Visit site
I am very keen to know if there some have proven possible solution to connect Volkswagen TDI marine engines to NMEA2K.
My Volkswagen Marine (now since 2012 Mercrury Diesel) year model 2009 TDI 265-6?
Mercury Diesel - Motoren - TDI 3.0
It seems to have CAN BUS and a OBD2 output, there my guess is that someone must have done this or have insight to do, perhaps with YachtDevices or other gateways
The MercuryDiesel/VolkswagenMarine engine electric schema: Mercury Diesel - #1 Op Het Water…/downloads/Eschema_TDI30
 

jwfrary

Well-known member
Joined
2 Dec 2010
Messages
947
Visit site
I would email yacht devices support, they seem pretty on top of exactly how to go about using thier gateways.

Never used the vw marine engine, but the cars use slightly non standard comms set ups as well the the OBD2 mandatory ones.
 

Keith-i

Well-known member
Joined
4 Jul 2012
Messages
1,446
Location
Jersey
Visit site
I’ve done it with Arduino. I used the can bus which is standard VW protocol and wrote some code to get it to N2K. Shows all of the data that is on the multi function gauge plus some extra. I did try the OBD2 first but it uses k-line and I just couldn’t get the handshake to work. OBD would have been nice because you also get EGT.
 

Tbinder

New member
Joined
25 Oct 2021
Messages
4
Visit site
I’ve done it with Arduino. I used the can bus which is standard VW protocol and wrote some code to get it to N2K. Shows all of the data that is on the multi function gauge plus some extra. I did try the OBD2 first but it uses k-line and I just couldn’t get the handshake to work. OBD would have been nice because you also get EGT.
Keith, that sounds really nice and straight forward, though guess reality it's not easy :)
Would you share some more technical indepth the arduino and code setup you have?
Do you by any chance have some schematic/diagram or photos and willing to share the code with me?
 

Keith-i

Well-known member
Joined
4 Jul 2012
Messages
1,446
Location
Jersey
Visit site
Happy to share my setup and code with you. It took quite a bit of effort to get it to work so I’m quite happy if someone else can also benefit. I will dig out all the details later.
 

Keith-i

Well-known member
Joined
4 Jul 2012
Messages
1,446
Location
Jersey
Visit site
My engine gateway is based around this little board which has a Teensy 3.6 arduino board with two Can-bus ports. You will need to download the Arduino IDE programme for your computer and install a couple of extra libraries including from Timo Lappalainen's github. Specifically you will need:
  • The teensyduino library from pjrc.com. (When you load this it is best to uncheck the FlexCAN library tickbox as you will need a different FlexCAN library instead - see below)
And from Timo's github:
  • NMEA2000-master library
  • NMEA2000-teensy library
  • FlexCAN-library-master
Once you get these up and running you should be able to set the IDE for a Teensy 3.6 at 96Mhz and upload my code and then connect your device to the boat network. I connected into the engine can-bus using the spare connector on the back of the engine control panel. If you do this you will need a Molex 40325 plug and 2 pins for can high and can low. It is a 22 pin connection usually used for the extension cable to a flybridge panel. Pin 22 is can high and pin 17 is can low.

Here is my working code - just copy and paste into the IDE:
Code:
// Convert VW Marine ECU canbus data to N2k. Oct 2019
// based on Collin80 and Timo Lappalainen code and Paulg25 on ybw
// Set for Teensy 3.6 at 96Mhz

#include <Arduino.h>
#include <NMEA2000_CAN.h>  // Chooses right CAN library and creates                                                                                                                                                                                                                                                                                                               suitable NMEA2000 object
#include <N2kMessages.h>
#include <NMEA2000_teensy.h>
#include <FlexCAN.h>


#ifndef __MK66FX1M0__
#error "Teensy 3.6 with dual CAN bus is required to run this example"
#endif

// List below N2k messages your device will transmit.
const unsigned long TransmitMessages[] PROGMEM = {127488L, 127489, 0}; //engine rapid and dynamic

static CAN_message_t msg; //sets up a storage buffer?
static uint8_t hex[17] = "0123456789abcdef";

#define EngineTimeout 5000 //perhaps not in global?


//-----------------------------------------------------------------------------------------
void setup() {

  delay(5000);
  // Set Product information
  NMEA2000.SetProductInformation("000300", // Manufacturer's Model serial code
                                 200, // Manufacturer's product code
                                 "Arduino VW Gateway",  // Manufacturer's Model ID
                                 "1.1 (2019)",  // Manufacturer's Software version code
                                 "1.A (2019)" // Manufacturer's Model version
                                );
  // Det device information
  NMEA2000.SetDeviceInformation(303030, // Unique number. Use e.g. Serial number.
                                160, // Device function=engine gateway.
                                50, // Device class=propulsion.
                                443 // Just choosen free from code list - VDO
                               );

  // Uncomment 2 rows below to see, what device will send to bus. Use e.g. OpenSkipper or Actisense NMEA Reader
  //Serial.begin(115200); // uncomment to send to serial for PC use
  //NMEA2000.SetForwardStream(&Serial); // uncomment to send to serial - default is Actisense format for PC use

  // If you want to use simple ascii monitor like Arduino Serial Monitor, uncomment next line
  //NMEA2000.SetForwardType(tNMEA2000::fwdt_Text); // uncomment to send to serial as plain text - overides above 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
  // Comment out next line for Actisense PC use
  NMEA2000.EnableForward(false); // Disable all forward messaging from N2K bus to USB (=Serial) - default is True. Comment for PC use

  NMEA2000.ExtendTransmitMessages(TransmitMessages);
  NMEA2000.Open();

  //Can0 should be automatically set at default 250kbs for N2k
  Can1.begin(500000); //set baud for VW ECU.
  Can1.setListenOnly (true); //hopefully set listen only mode. Set after begin()
}
/*Engine frames
    Byte                     data    factor                expected range
    0x280 byte 1 =           torque  (*0.39)%              (0-100% limit 493Nm)
    0x280 byte 2low&3high =  rpm     (*0.25)/min           (typ range 0-4500)
    0x288 byte 1 =           coolant ((*0.75)-48)C         (typ range 20-100)
    0x380 byte 1 =           IAT     ((*0.75)-48)C         (typ range 20-50)
    0x480 byte 2&3 =         fuel consumption ul           (idling 0.42-0.82 l/h)
    0x588 byte 4 =           boost (*0.01)bar or (*1000)Pa (1010 to 2295 mbar)
*/
//variable     data type       data                N2k expected units  resolution
double torque = N2kDoubleNA;  //torque            % (1% increment)
double rpm = N2kDoubleNA;     //rpm
double coolant = N2kDoubleNA; //coolant temp      K (0.1K)
double fuel_consumption = N2kDoubleNA;    //fuel rate         l/h (0.1 l/h)
double boost = N2kDoubleNA;   //boost pressure    Pa (100Pa) 1bar = 100,000Pa
unsigned long LastRPM = 0;
#define EngineTimeout 5000 //perhaps in global?

//for fuel consumption calculations
uint16_t fuel_last = 0; //unsigned int 16bits 0-65535
unsigned long time_last = 0; //unsigned 4 bytes
#define FUEL_AVG_BUFFER 10
double fuel_buffer[FUEL_AVG_BUFFER]; // buffer locations will be 0 - 9
size_t fuel_pointer = 0; //represents size of something in no. of bytes

//---------------------------------------------------------------------
void PollEngineCAN() { //function to poll engine data
  CAN_message_t inMsg;

  if (Can1.available() > 0) {
    Can1.read(inMsg); //read message into inMsg
    switch ( inMsg.id ) { //a type of if process that can check for multiple conditions

      case 0x280:
        torque = ( inMsg.buf[1] * 0.39 );
        rpm = ((( inMsg.buf[3] << 8) + inMsg.buf[2]) / 4);
        LastRPM = millis(); //timestamp the last rpm reading
        break;

      case 0x288:
        coolant = (( inMsg.buf[1] * 0.75) + 225.15); //convert from C to K (-48 + 273.15 = 225.15)
        break;

      case 0x480: {
          double fuel_used;
          uint16_t fuel_now = ( ( (inMsg.buf[3] & 0b01111111) << 8 ) + inMsg.buf[2] );  // get current fuel reading
          unsigned long time_now = millis();                  // get curent time

          if ( time_last != 0 ) {   //if time not equal to 0
            if ( fuel_now >= fuel_last ) {           // to allow for roll over
              fuel_used = fuel_now - fuel_last;
            } else {
              fuel_used = ( fuel_now + (32767 - fuel_last) );
            }

            double time_elapsed = time_now - time_last;

            // fuel_used is in ul, so we need devide it with 1e6 to get litres.
            // time_elapsed is ms, so divide it with 3.6e6 to get hours.
            // fuel_rate = ( (fuel_used / 1e6) / ( time_elapsed/3.6e6 ) );
            double fuel_rate = (fuel_used / time_elapsed) * 3.6;

            fuel_buffer[fuel_pointer] = fuel_rate;      // store latest reading in buffer (10 deep).
            fuel_pointer++;                             // increment buffer pointer ready for next time

            if ( fuel_pointer == FUEL_AVG_BUFFER ) fuel_pointer = 0;   // if end of buffer reached, point to start

            double fuel_average = 0;
            for ( size_t i = 0; i < FUEL_AVG_BUFFER; i++ ) {       // do this 10 times
              fuel_average += fuel_buffer[i];       // add all 10 numbers stored in buffer
            }         
            fuel_consumption = fuel_average / FUEL_AVG_BUFFER;
          }
          time_last = time_now;
          fuel_last = fuel_now;
        }
        break;

      case 0x588:
        boost = ( inMsg.buf[4] * 1000 ); //convert from bar to Pa (*0.01 x 100,000 = 1000)
        break;
    }
  }
}
//---------------------------------------------------------------------------------
void SendN2kEngineRapid() //N2k function to send data
{
  static unsigned int NextSendTime = 5000;
  if ( NextSendTime < millis() )
  {
    NextSendTime += 100;
    tN2kMsg N2kMsg;

    SetN2kEngineParamRapid(N2kMsg, 0, rpm, boost);
    NMEA2000.SendMsg(N2kMsg);
  }
}
//---------------------------------------------------------------------------------
void SendN2kEngineDynamic() //N2k function to send data
{
  static unsigned int NextSendTime = 5000;
  if ( NextSendTime < millis() )
  {
    NextSendTime += 500;
    tN2kMsg N2kMsg;

    SetN2kEngineDynamicParam(N2kMsg, 0, N2kDoubleNA, N2kDoubleNA, coolant,
                             N2kDoubleNA, fuel_consumption, N2kDoubleNA, N2kDoubleNA, N2kDoubleNA, N2kInt8NA, torque);
    NMEA2000.SendMsg(N2kMsg);
  }
}
//-----------------------------------------------------------------------------------------
void loop()
{
  NMEA2000.ParseMessages();
  PollEngineCAN();
  if ( LastRPM + EngineTimeout > millis() ) {
    SendN2kEngineRapid();
    SendN2kEngineDynamic();
  }
}

Good luck
 

QBhoy

Well-known member
Joined
11 Mar 2016
Messages
2,620
Visit site
Hi. Can you not just use the mercury smart craft or VesselView system?
Quick look, suggests you can. Can either have data on sc1000 gauges, VesselView mobile (to phone or tablet), VesselView simrad full screen display or to a existing compatible chart plotter, via a gateway. I have VesselView on two of my boats. Amazing thing.
 

Keith-i

Well-known member
Joined
4 Jul 2012
Messages
1,446
Location
Jersey
Visit site
Hi. Can you not just use the mercury smart craft or VesselView system?
You can on the newer variant of the engine after Mercury redesigned the electronics using their proprietary system, but for the vintage that I have and the OP it is not compatible.
 

QBhoy

Well-known member
Joined
11 Mar 2016
Messages
2,620
Visit site
You can on the newer variant of the engine after Mercury redesigned the electronics using their proprietary system, but for the vintage that I have and the OP it is not compatible.
Ah. That’s a shame. Quite unusual too. I have a 2003 mercruiser that’s compatible. Granted, it’s an mpi…also a 2016 outboard that is too. But I’m sure lots of outboards were compatible even from around 2008ish.
Not doubting you for a second and you’ll likely be right and well versed on it…plus the rare nature of the engine too perhaps…but have you had it verified that it’s not compatible? Or any real investigative look around it to see ? I could tell you what to look for, if not. Sure you probably have though.
 

Tbinder

New member
Joined
25 Oct 2021
Messages
4
Visit site
My engine gateway is based around this little board which has a Teensy 3.6 arduino board with two Can-bus ports. You will need to download the Arduino IDE programme for your computer and install a couple of extra libraries including from Timo Lappalainen's github. Specifically you will need:
  • The teensyduino library from pjrc.com. (When you load this it is best to uncheck the FlexCAN library tickbox as you will need a different FlexCAN library instead - see below)
And from Timo's github:
  • NMEA2000-master library
  • NMEA2000-teensy library
  • FlexCAN-library-master
Once you get these up and running you should be able to set the IDE for a Teensy 3.6 at 96Mhz and upload my code and then connect your device to the boat network. I connected into the engine can-bus using the spare connector on the back of the engine control panel. If you do this you will need a Molex 40325 plug and 2 pins for can high and can low. It is a 22 pin connection usually used for the extension cable to a flybridge panel. Pin 22 is can high and pin 17 is can low.

Here is my working code - just copy and paste into the IDE:
Code:
// Convert VW Marine ECU canbus data to N2k. Oct 2019
// based on Collin80 and Timo Lappalainen code and Paulg25 on ybw
// Set for Teensy 3.6 at 96Mhz

#include <Arduino.h>
#include <NMEA2000_CAN.h>  // Chooses right CAN library and creates                                                                                                                                                                                                                                                                                                               suitable NMEA2000 object
#include <N2kMessages.h>
#include <NMEA2000_teensy.h>
#include <FlexCAN.h>


#ifndef __MK66FX1M0__
#error "Teensy 3.6 with dual CAN bus is required to run this example"
#endif

// List below N2k messages your device will transmit.
const unsigned long TransmitMessages[] PROGMEM = {127488L, 127489, 0}; //engine rapid and dynamic

static CAN_message_t msg; //sets up a storage buffer?
static uint8_t hex[17] = "0123456789abcdef";

#define EngineTimeout 5000 //perhaps not in global?


//-----------------------------------------------------------------------------------------
void setup() {

  delay(5000);
  // Set Product information
  NMEA2000.SetProductInformation("000300", // Manufacturer's Model serial code
                                 200, // Manufacturer's product code
                                 "Arduino VW Gateway",  // Manufacturer's Model ID
                                 "1.1 (2019)",  // Manufacturer's Software version code
                                 "1.A (2019)" // Manufacturer's Model version
                                );
  // Det device information
  NMEA2000.SetDeviceInformation(303030, // Unique number. Use e.g. Serial number.
                                160, // Device function=engine gateway.
                                50, // Device class=propulsion.
                                443 // Just choosen free from code list - VDO
                               );

  // Uncomment 2 rows below to see, what device will send to bus. Use e.g. OpenSkipper or Actisense NMEA Reader
  //Serial.begin(115200); // uncomment to send to serial for PC use
  //NMEA2000.SetForwardStream(&Serial); // uncomment to send to serial - default is Actisense format for PC use

  // If you want to use simple ascii monitor like Arduino Serial Monitor, uncomment next line
  //NMEA2000.SetForwardType(tNMEA2000::fwdt_Text); // uncomment to send to serial as plain text - overides above 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
  // Comment out next line for Actisense PC use
  NMEA2000.EnableForward(false); // Disable all forward messaging from N2K bus to USB (=Serial) - default is True. Comment for PC use

  NMEA2000.ExtendTransmitMessages(TransmitMessages);
  NMEA2000.Open();

  //Can0 should be automatically set at default 250kbs for N2k
  Can1.begin(500000); //set baud for VW ECU.
  Can1.setListenOnly (true); //hopefully set listen only mode. Set after begin()
}
/*Engine frames
    Byte                     data    factor                expected range
    0x280 byte 1 =           torque  (*0.39)%              (0-100% limit 493Nm)
    0x280 byte 2low&3high =  rpm     (*0.25)/min           (typ range 0-4500)
    0x288 byte 1 =           coolant ((*0.75)-48)C         (typ range 20-100)
    0x380 byte 1 =           IAT     ((*0.75)-48)C         (typ range 20-50)
    0x480 byte 2&3 =         fuel consumption ul           (idling 0.42-0.82 l/h)
    0x588 byte 4 =           boost (*0.01)bar or (*1000)Pa (1010 to 2295 mbar)
*/
//variable     data type       data                N2k expected units  resolution
double torque = N2kDoubleNA;  //torque            % (1% increment)
double rpm = N2kDoubleNA;     //rpm
double coolant = N2kDoubleNA; //coolant temp      K (0.1K)
double fuel_consumption = N2kDoubleNA;    //fuel rate         l/h (0.1 l/h)
double boost = N2kDoubleNA;   //boost pressure    Pa (100Pa) 1bar = 100,000Pa
unsigned long LastRPM = 0;
#define EngineTimeout 5000 //perhaps in global?

//for fuel consumption calculations
uint16_t fuel_last = 0; //unsigned int 16bits 0-65535
unsigned long time_last = 0; //unsigned 4 bytes
#define FUEL_AVG_BUFFER 10
double fuel_buffer[FUEL_AVG_BUFFER]; // buffer locations will be 0 - 9
size_t fuel_pointer = 0; //represents size of something in no. of bytes

//---------------------------------------------------------------------
void PollEngineCAN() { //function to poll engine data
  CAN_message_t inMsg;

  if (Can1.available() > 0) {
    Can1.read(inMsg); //read message into inMsg
    switch ( inMsg.id ) { //a type of if process that can check for multiple conditions

      case 0x280:
        torque = ( inMsg.buf[1] * 0.39 );
        rpm = ((( inMsg.buf[3] << 8) + inMsg.buf[2]) / 4);
        LastRPM = millis(); //timestamp the last rpm reading
        break;

      case 0x288:
        coolant = (( inMsg.buf[1] * 0.75) + 225.15); //convert from C to K (-48 + 273.15 = 225.15)
        break;

      case 0x480: {
          double fuel_used;
          uint16_t fuel_now = ( ( (inMsg.buf[3] & 0b01111111) << 8 ) + inMsg.buf[2] );  // get current fuel reading
          unsigned long time_now = millis();                  // get curent time

          if ( time_last != 0 ) {   //if time not equal to 0
            if ( fuel_now >= fuel_last ) {           // to allow for roll over
              fuel_used = fuel_now - fuel_last;
            } else {
              fuel_used = ( fuel_now + (32767 - fuel_last) );
            }

            double time_elapsed = time_now - time_last;

            // fuel_used is in ul, so we need devide it with 1e6 to get litres.
            // time_elapsed is ms, so divide it with 3.6e6 to get hours.
            // fuel_rate = ( (fuel_used / 1e6) / ( time_elapsed/3.6e6 ) );
            double fuel_rate = (fuel_used / time_elapsed) * 3.6;

            fuel_buffer[fuel_pointer] = fuel_rate;      // store latest reading in buffer (10 deep).
            fuel_pointer++;                             // increment buffer pointer ready for next time

            if ( fuel_pointer == FUEL_AVG_BUFFER ) fuel_pointer = 0;   // if end of buffer reached, point to start

            double fuel_average = 0;
            for ( size_t i = 0; i < FUEL_AVG_BUFFER; i++ ) {       // do this 10 times
              fuel_average += fuel_buffer[i];       // add all 10 numbers stored in buffer
            }        
            fuel_consumption = fuel_average / FUEL_AVG_BUFFER;
          }
          time_last = time_now;
          fuel_last = fuel_now;
        }
        break;

      case 0x588:
        boost = ( inMsg.buf[4] * 1000 ); //convert from bar to Pa (*0.01 x 100,000 = 1000)
        break;
    }
  }
}
//---------------------------------------------------------------------------------
void SendN2kEngineRapid() //N2k function to send data
{
  static unsigned int NextSendTime = 5000;
  if ( NextSendTime < millis() )
  {
    NextSendTime += 100;
    tN2kMsg N2kMsg;

    SetN2kEngineParamRapid(N2kMsg, 0, rpm, boost);
    NMEA2000.SendMsg(N2kMsg);
  }
}
//---------------------------------------------------------------------------------
void SendN2kEngineDynamic() //N2k function to send data
{
  static unsigned int NextSendTime = 5000;
  if ( NextSendTime < millis() )
  {
    NextSendTime += 500;
    tN2kMsg N2kMsg;

    SetN2kEngineDynamicParam(N2kMsg, 0, N2kDoubleNA, N2kDoubleNA, coolant,
                             N2kDoubleNA, fuel_consumption, N2kDoubleNA, N2kDoubleNA, N2kDoubleNA, N2kInt8NA, torque);
    NMEA2000.SendMsg(N2kMsg);
  }
}
//-----------------------------------------------------------------------------------------
void loop()
{
  NMEA2000.ParseMessages();
  PollEngineCAN();
  if ( LastRPM + EngineTimeout > millis() ) {
    SendN2kEngineRapid();
    SendN2kEngineDynamic();
  }
}

Good luck
Greit Keith, I will tru this path.
The two ways can bus card with Teensy 3.6 seems sold out - do you think any of the others wirh three ways and Teensy 4.1, would work?
Also I have two VW engines, do need a board for each engine or can I use both on one card?
 

Tbinder

New member
Joined
25 Oct 2021
Messages
4
Visit site
Ah. That’s a shame. Quite unusual too. I have a 2003 mercruiser that’s compatible. Granted, it’s an mpi…also a 2016 outboard that is too. But I’m sure lots of outboards were compatible even from around 2008ish.
Not doubting you for a second and you’ll likely be right and well versed on it…plus the rare nature of the engine too perhaps…but have you had it verified that it’s not compatible? Or any real investigative look around it to see ? I could tell you what to look for, if not. Sure you probably have though.
Would be great if I could simply buy harness, gateway plugin and launch on app or software...
Though have you seen the prices for such setup? And I have two engines, so in my setup with the prices in Denmark (europe), this will cost more than 10k USD :-O
 

QBhoy

Well-known member
Joined
11 Mar 2016
Messages
2,620
Visit site
Would be great if I could simply buy harness, gateway plugin and launch on app or software...
Though have you seen the prices for such setup? And I have two engines, so in my setup with the prices in Denmark (europe), this will cost more than 10k USD :-O
Yeah. Agree…but there are cheaper ways too. You can do it for £230, if it has smart craft…if you wanted to. By means of the VesselView mobile. Just an amazing thing. If you want it otherwise and it is a smart craft system…you’ll need the mercury gateway either which way you go. If you have a fairly modern plotter model…you just need the gateway and an extension/junction box, worst case. Most plotters of any worth these days are compatible. You don’t actually need the mercury VesselView screen. It works with loads of models from your usual brands. But certainly the cheapest way is the Bluetooth mobile or tablet device.
 

vas

Well-known member
Joined
21 Jun 2011
Messages
8,093
Location
Volos-Athens
Visit site
Greit Keith, I will tru this path.
The two ways can bus card with Teensy 3.6 seems sold out - do you think any of the others wirh three ways and Teensy 4.1, would work?
Also I have two VW engines, do need a board for each engine or can I use both on one card?
chipping in on the N2K and Teensy bit (not familiar with your engine setup so cannot help there)
Teensy 4 may currently have some issues with Timo's lib. Was a thread in github a week ago, didn't have time to check as I'm using half a dozen Teensy v3.5 onboard but bought a 4 for testing. Anyway check it out a bit more before buying a 4
yep, you'd need two Teensies, one for each and configure your code on each to report a different ID number for the engine. typically 0 is port, 1 is stbrd.
then data flows in the N2K bus and mfds or whatnot would know what comes from where and present them accordingly.
 

Keith-i

Well-known member
Joined
4 Jul 2012
Messages
1,446
Location
Jersey
Visit site
Greit Keith, I will tru this path.
The two ways can bus card with Teensy 3.6 seems sold out - do you think any of the others wirh three ways and Teensy 4.1, would work?
Also I have two VW engines, do need a board for each engine or can I use both on one card?
As Vas says, you will need one device for each engine. I don't know about the Teensy 4.1 so you would need to do some research on that. Fine to use a 3 way board as you only need to use 2 can bus ports.

Yeah. Agree…but there are cheaper ways too. You can do it for £230, if it has smart craft…if you wanted to. By means of the VesselView mobile. Just an amazing thing. If you want it otherwise and it is a smart craft system…you’ll need the mercury gateway either which way you go. If you have a fairly modern plotter model…you just need the gateway and an extension/junction box, worst case.
As said above, Mercury VesselView will not work on the older engine. This engine started life as VW Marine using their standard protocol on can-bus. It was only after the engine model was taken over by Mercury that it became compatible with VesselView which I think possibly uses J1939 protocol.

There's possibly no reason why you couldn't plug a generic car based adaptor into the OBD socket and using an app like Torque to see some of the data on a phone or tablet.
 

QBhoy

Well-known member
Joined
11 Mar 2016
Messages
2,620
Visit site
As Vas says, you will need one device for each engine. I don't know about the Teensy 4.1 so you would need to do some research on that. Fine to use a 3 way board as you only need to use 2 can bus ports.


As said above, Mercury VesselView will not work on the older engine. This engine started life as VW Marine using their standard protocol on can-bus. It was only after the engine model was taken over by Mercury that it became compatible with VesselView which I think possibly uses J1939 protocol.

There's possibly no reason why you couldn't plug a generic car based adaptor into the OBD socket and using an app like Torque to see some of the data on a phone or tablet.
Ah. So it’s not a mercury badged marine original engine ? It’s been a transplant, are we saying ? Got you.
 

Keith-i

Well-known member
Joined
4 Jul 2012
Messages
1,446
Location
Jersey
Visit site
Ah. So it’s not a mercury badged marine original engine ? It’s been a transplant, are we saying ? Got you.
Correct. It’s the VAG 3.0 tdi block from the road going vehicles which was originally marinised by VW. For some reason the range was passed to Cummins and then eventually Barrus as some kind of hot potato. Mercury/Barrus redesigned some aspects to get it up to latest tier rating which is when it became compatible with Smartcraft or whatever.
 

QBhoy

Well-known member
Joined
11 Mar 2016
Messages
2,620
Visit site
Correct. It’s the VAG 3.0 tdi block from the road going vehicles which was originally marinised by VW. For some reason the range was passed to Cummins and then eventually Barrus as some kind of hot potato. Mercury/Barrus redesigned some aspects to get it up to latest tier rating which is when it became compatible with Smartcraft or whatever.
I knew all about that bit…but are you saying it’s not any of these originally ? And it’s been a transplant diy job ? Or is it an original mercury branded fit ? Mercury have used other peoples engines for near half a century now. Just only in the last few years they started making their own. It’s nothing new to the marine world really. The v8 I have vessel view plugged into, is a Gm car engine…doesn’t mean it doesn’t have mercury smart craft. If you get me.
 

Keith-i

Well-known member
Joined
4 Jul 2012
Messages
1,446
Location
Jersey
Visit site
I knew all about that bit…but are you saying it’s not any of these originally ? And it’s been a transplant diy job ? Or is it an original mercury branded fit ?
The OP's engine is model year 2009. It is therefore the VW Marine variant and uses VW canbus protocol. It was some years after this that Mercury took over the marketing and sales of this engine from VW. It was at this point that Mercury converted the ECU and network to suit their VesselView system. I know the OP linked to the Mercury website but that is because there is no longer any web presence for the VW version that he and I have.
 

QBhoy

Well-known member
Joined
11 Mar 2016
Messages
2,620
Visit site
The OP's engine is model year 2009. It is therefore the VW Marine variant and uses VW canbus protocol. It was some years after this that Mercury took over the marketing and sales of this engine from VW. It was at this point that Mercury converted the ECU and network to suit their VesselView system. I know the OP linked to the Mercury website but that is because there is no longer any web presence for the VW version that he and I have.
Ah. Got you. Well explained. Appreciated.
 

mesziszaki

New member
Joined
19 Mar 2023
Messages
5
Visit site
Does anyone have a wiring diagram for a 2009 VW Marine 4.2 TDI engine? Unfortunately, I haven't found it anywhere yet. VW doesn't want to release it, and neither does Bosch. Cummins cannot identify the engine. Mercruiser does not even respond to the inquiry? Engine code: CEM
 
Top