NMEA 2000 Shield

NMEA 2000 is a closed CAN-BUS standard for marine electronics. It would be awesome to have a shield that can accept the standard NMEA 2000 or that has a screw down terminal to accept bare wires.

NMEA 2000 supplies both power and data in it's cable. Not sure if it's adequate to power the ardunio. http://en.wikipedia.org/wiki/NMEA_2000

If someone out there can handle the hardware and board side of things, I could help do the research.

Thanks, -p


Building a CAN shield for the Arduino is quite simple. You just need a SPI-based CAN controller (ex: MCP2515) and a CAN interface (ex: MCP2551). The N2K bus typically provides 12VDC so you will need a regulator in order to power the arduino and the shield, and some kind of optical isolation between CAN interface and CAN controller if you want to stay clean. This is just for the physical side of the engine. Then you’ll need to implement all the N2K protocol into the Arduino, but remember the following:

  1. NMEA 2000 is a proprietary protocol. You’ll surely need to purchase the specification from the NMEA association (several $1000’s if I remember well).
  2. If you want to certify the product, you’ll need to pay for a N2K ID to the NMEA association and later you’ll need to pay for the certification process.

I’ve worked with NMEA 2000 in the past so feel free to drop more questions if you need.


Thanks for the tips!

I hear you on the NMEA 2000 proprietary thing, but many are reverse engineering it... so I'm guessing it's not too difficult.


Depending on the amount of N2K nodes available on the bus and their outgoing traffic load (some N2K devices are programmed to drop CAN messages every 100 ms), you could find that your Arduino-based node is not capable to accept all the traffic load without loosing packets so If you're thinking in using the Arduino as a kind of PC gateway this could be an issue. For end-device applications the AVR should be fine.


Did you ever get anywhere with NMEA 2k -> Arduino? I'm considering the CAN shield to start playing with it.. don't want to recreate the wheel if you've made progress.

Thanks, Jason

I've not heard anything more about anyone working on this...

I just saw several NMEA2000 installations yesterday at the Genoa, Italy Boat Show. Immense. Many 100 foot yachts. All NMEA2000 setups were on carpeted booths and high-end graphics.

The only DIY that crowd seemed to do was mixing drinks :grin:

If anyone gets into NMEA-Anything start a thread on the forum... I've done a little.

Hi all,

I want to send data over NMEA 2000 bus using Arduino UNO + Sparkfun Can-Bus (http://www.sparkfun.com/products/10039).

I have some questions on NMEA 2000:

1) Is correct to use that Can-Bus board to send data??? The structure of can bus message is the same of NMEA2000 message??? 2) Is there any library that I can use???

Any suggestion on NMEA 2000 would be appreciated.

Thanks a lot!


androrossi: 1) Is correct to use that Can-Bus board to send data??? The structure of can bus message is the same of NMEA2000 message???

Yes, you should be able to connect an Arduino to a CAN bus through this board. However, bear in mind the actual traffic load in the bus and the limited computing power of an Arduino. If you just want to develop a "sender" application it's should be OK.

2) Is there any library that I can use???

No free or open source library if I remember well. Working with NMEA2000 typically requires you to buy their specs.

Hope this helps,


Thanks a lot Daniel.

I just want to develop a Sender application on Arduino.

I have another question: is the structure of CanBus messages (2.0b) the same of Nmea2000 messages???


Yes, NMEA2000 sits on top of CAN (extended address schema).

Thanks a lot Daniel.

Is the message format for NMEA2000 this http://www.can-cia.org/index.php?id=496 ??? But it is bit different from CAN (2.0B) message format http://it.wikipedia.org/wiki/Controller_Area_Network#Formato_dell.27Extended_frame .

I'm wrong???


ID A + ID B makes 29 bits. Yes, NMEA2000 is somehow a subclass of J1939 and inherits some PGN's from it in fact.

Hi Daniel,

I found this forum http://www.mikrocontroller.net/topic/143234 and on this forum I found this library http://www.mikrocontroller.net/attachment/53861/NMEA2000ToNMEA183.rar .

I think it is what I need...

Can you help me with it?

Thanks a lot.


What do you need help with exactly? My boat has a Volvo engine that sends their variant of this -- would be nice to interface to it.


Hello David,

Did you already use that library ( http://www.mikrocontroller.net/attachment/53861/NMEA2000ToNMEA183.rar )? If yes, what hardware are you using? I have an Arduino UNO + Sparkfun Can-Bus ( http://www.sparkfun.com/products/10039 ). I want to send some data over NMEA2000 bus to all node (broadcast). I'd like to have a code example to send data using that library (if possible) or a brief guide to using the library.

Thanks a lot


I also have an N2K project I need to work on, but the expense of the protocol and certification is holding me up. Have you had any luck so far?

I have just started with embedded programming but been writing enterprise software for many years.

I have just pulled together a base NMEA 2000 / J1939 protocol stack. Currently I have support for a limited number of PGNs but I do have support for single and fast frame NMEA2000 messages. The current project is to create NMEA 2000 transducer that will read analog engine data and broadcast PGNs 127488 (engine Rapid), 127489 (engine dynamic), 127505 (fuel level). The protocol stack is built to quick add additional PGNs with minimal amount of code.

Also I’m finishing up support for address claim and other NMEA 2000 group functions. If you are interested in working with me on adding additional capabilities and functions let me know. The current implementation runs on Arduino Uno with Sparkfun CAN-bus that uses MCP2515 CAN controller.

Hi, @southern_cross: I'm most interested in your work. Myself looking at the possibilities to use Arduino + shield to prototype a marine monitoring interface. Basically I would want to monitor and convert to NMEA2000 the engine data you mention plus some additional ones, like PGN 127508 - Battery Status. Possibly also some environmental data and in future also read and parse the AIS PGNs. I've previously only been working in the NMEA0183 domain though now believe that the transition to 2000 is inevitable. If you are willing to share your progress and also specify how you would want to co-operate I'd be very happy to join.

Hi, I’m new to this forum. Just wondering if there has been anything more on the subject of interfacing Arduino and NMEA2000?