Additional Information

Site Information

 Loading... Please wait...

Blog

A Simple SAE J1939 to USB Gateway with the Arduino Uno, Mega 2560, Due, Teensy, ESP32

Posted by Wilfried Voss on

SAE J1939 ECU Programming & Vehicle Bus Simulation with Arduino

The following is an excerpt from SAE J1939 ECU Programming & Vehicle Bus Simulation with Arduino by Wilfried Voss

I deem it necessary to clarify the definition of “SAE J1939 to USB Gateway” because there are several variants of gateway applications.

If you browse through the Internet in search for SAE J1939 gateways, you will primarily find CAN Bus gateways that support the conversion of 11-Bit and 29-Bit CAN messages into another serial technology such as USB, RS232, etc. Since SAE J1939 is based on CAN Bus messages with a 29-Bit identifier, many manufacturers take the liberty of calling their devices “SAE J1939 gateways,” which is misleading and may lead to technical problems when connecting these devices to an actual vehicle (diesel engine).

The problem lies in the fact that these so-called gateways do not come with an integrated SAE J1939 protocol stack and cannot support the address claiming process, according to SAE J1939/81. When transmitting data into a J1939 vehicle network, you need to supply a node (source) address with the data frame, and that node address must be unique. The absence of a protocol stack in the gateway may result in node ID collisions and may cause serious technical problems.

The problem can be circumvented when all node IDs in the network are hard-coded, and you assign a free node ID to messages you send into the network. This may work in limited cases, but this method is, naturally, not recommended.

The purpose of these types of J1939 gateways should be mere data monitoring, i.e., only receiving J1939 messages (you still need to decipher J1939 messages longer than 8 bytes, which is a cumbersome task). In order to communicate with the vehicle bus (bidirectional communication), you need a full SAE J1939 protocol implementation with address claim procedure and support of messages longer than 8 bytes.

Nevertheless, in the following, I will introduce this kind of gateway with all its disadvantages, but I will do so for mere demonstration and educational purposes. The Arduino sketch, as introduced in the following, is the first step toward a full SAE J1939 gateway with an integrated protocol stack (See chapter ARD1939 – SAE J1939 Protocol Stack for Arduino).

Some of the previous Arduino sketches, as introduced in this book, already provide the features for a simple SAE J1939 to USB gateway. However, they were designed to receive messages. A gateway application requires that we can send messages as well. The need for bidirectional communication also leads to another requirement for a J1939 gateway, namely the definition of a communication protocol between the gateway and the host system (usually a PC).

Since our focus is on the Arduino hardware, the connection between the gateway (i.e., the Arduino) and the PC is established per USB interface. The foundation of the USB protocol is already established through the Serial.print function, and the protocol will be based on transmitting ASCII text.

The data communication is managed through the Arduino’s serial monitor, but I will also introduce a replica of the serial monitor with Visual Studio C# in another chapter to follow. If you wish to create a more sophisticated data communication between the Arduino and a PC, the following projects will provide a solid foundation.

Our simple J1939 to USB gateway will provide three functions:

  • A J1939 Network Scanner, i.e., the Arduino will scan a J1939 network for existing nodes and retrieve information from them.
  • A Data Traffic Monitor similar to the previously introduced projects.
  • A Data Traffic Simulator, i.e. the Arduino will send user-defined messages into the network.

Note: As usual, the following Arduino projects are available through the download page at http://ard1939.com. However, all three functions (network scanner, data traffic monitor, and data traffic simulator) are combined into one project, since the ladder two features are additions to the previous project.

While the code in this book was developed for the Arduino Uno and Mega 2560, we also provide a version for the Arduino Due. We are working on versions for the Teensy, a series of Arduino-compatible embedded modules, and the ESP32, which we will publish in the near future. For the time being, you can download the code and modify/adjust the CAN interface functions to the available hardware.


Arduino-Based ECU Development Board With Dual CAN Bus Interface

Arduino-Based ECU Development Board With Dual CAN Bus Interface

Leverage the power of an ARM Cortex M3 32-bit processing capability combined with a dual CAN Bus interface to create your next CAN Bus or SAE J1939 application or prototype. By combining our dual CAN port interface, the Arduino DUE microcontroller, an OBD2 or SAE J1939 cable, and open-source software libraries, you are ready to go with a powerful turn-key Arduino-based dual CAN bus solution.

Use the vast resources of Arduino software (sketches) and hardware components (shields) to create your CAN Bus, OBD2, or SAE J1939 application.

More Information...

Programming The Atmega328 And The Arduino Uno Board Using The Atmel Studio IDE

The AVR microcontroller by Atmel (now Microchip) is one of the most widely used 8-bit microcontrollers. The popular Arduino Uno board utilizes an AVR microcontroller. It is inexpensive and widely available around the world.This book combines this combination. The authors apply a step-by-step and methodical approach to demonstrate the programming of the AVR chip. Examples are presented [...]

Read More »


SAE J1939 ECU Programming & Vehicle Bus Simulation with Arduino - The Arduino Uno And Mega 2560 plus CAN Shield

This post is part of a series about SAE J1939 ECU Programming & Vehicle Bus Simulation with Arduino. As I had mentioned earlier in this book, it is assumed that you have some basic knowledge of the Arduino Uno and the Mega 2560 itself, Arduino Sketches, and Arduino Shields.In order to develop and test the sample programs (sketches) as shown [...]

Read More »


CAN Bus Prototyping With Arduino Uno - CAN Bus Network Monitoring under Windows

This post is part of a series about Controller Area Network (CAN Bus) Prototyping With the Arduino Uno. While programming the Arduino can be exciting (especially since everything works so smoothly), the real fun comes when you can extend the Arduino’s reach to a PC running Windows. Note: My apologies to all Mac and LINUX users for bringing a Windows programming [...]

Read More »


CAN Bus Prototyping With Arduino Uno - A Simple CAN Bus Network Monitoring and Diagnostics Program

This post is part of a series about Controller Area Network (CAN Bus) Prototyping With the Arduino Uno.The Arduino board in combination with the CAN Bus shield provides the hardware for a full-fledged CAN network monitoring tool, and this next Arduino program is a first step in that direction.However, before we get into more detail, let me issue [...]

Read More »


CAN Bus Prototyping With Arduino Uno - Extended CAN Bus Shield Test

This post is part of a series about Controller Area Network (CAN Bus) Prototyping With the Arduino Uno.In this next, extended example, we use the same program as shown in the previous chapter but add a CAN receiving routine to it. The result, i.e. the received messages, will be displayed through the Arduino serial monitor.// Simple CAN Shield Test#include [...]

Read More »


CAN Bus Prototyping With Arduino Uno - Simple CAN Bus Shield Test

This post is part of a series about Controller Area Network (CAN Bus) Prototyping With the Arduino Uno.The most exciting part about this project is when it comes to the point where two CAN nodes communicate with each other. I started off with writing a simple program that sent messages that were received by my USB-to-CAN gateway and its [...]

Read More »


CAN Bus Prototyping With Arduino Uno - Arduino CAN Shields

This post is part of a series about Controller Area Network (CAN Bus) Prototyping With the Arduino Uno. Since Controller Area Network (CAN) is predominantly targeted at industrial solutions (versus the vastly more popular USB for non-industrial use such as home and lab), there aren’t too many choices available in the market. Through some research (i.e. browsing) I found two very similar [...]

Read More »


CAN Bus Prototyping With Arduino Uno - Prototyping Hardware

This post is part of a series about Controller Area Network (CAN Bus) Prototyping With the Arduino Uno. As I had mentioned earlier, it is assumed that you have some basic knowledge of the Arduino, Arduino Sketches, and Arduino Shields. I will nevertheless take the opportunity of mentioning the prototyping hardware and its variants. It is important to know that the [...]

Read More »


Hands-On Recipes To Quickly Build And Understand Arduino Projects And Their Development

The single-chip computer board Arduino is small in size but vast in scope, capable of being used for electronic projects from robotics through to home automation. The most popular embedded platform in the world, Arduino users range from school children to industry experts, all incorporating it into their designs. Arduino Development Cookbook comprises clear and step-by-step [...]

Read More »