Arduino DUE CAN Software

A better how-to for software is in the works. Below is the readme from the library and examples code we have posted on github 

Note: If you are using an older IDE v1.5x follow the link to these instructions

OBD2 and CAN Acquisition Libraries

These libraries were designed with continuous message TX/RX (DAQ applications) in mind by implementing a periodic scheduler. The scheduler supports both native DUE CAN ports and allows for one to easily implement a “free-running raw” CAN protocol or perhaps something a bit more layered such as OBD2. An OBD2 implemenation is provided, and logged CAN traffic and screen data are provided in the repository (driveHome. files).

Thank you for actually reading the readme and contributing!



What you need to do to get it working (assuming a windows installation):

1. download Arduino IDE R 1.6.x

2. download all of the files from the togglebit repository: Togglebit GitHub 

3. After IDE installation, create a new folder called “CAN” under a path C:\Program Files (x86)\Arduino\libraries\

4. Next drop all files( .c,.h and *.ino) into the new folder (C:\Program Files (x86)\Arduino\libraries\CAN)

5. Open Arduino IDE 1.6x to Tools->Boards->Boards Manager and download the Adruino SAM (32-bit ARM cortex-M3) boards hardware support kit

6. Once installed, go to boards select the Arduino DUE board ad the target board under “Tools”.

7. Opening any of the examples ( *.ino) files will create a new folder. You should also see a folder called “CAN” under the “Examples” menu.

8. You will now be able to verify, upload and tryout the examples!

Getting Started with Free Running CAN

    To transmit a message five times a second:        

    //create the CANport acqisition schedulers
    cAcquireCAN CANport0(CAN_PORT_0);

    //define a CANFrame object 
    cCANFrame  RAW_CAN_Frame1;

    //start CAN ports, set the baud rate here

    //then set the ID and transmission rate 
    RAW_CAN_Frame1.ID = 0x100;
RAW_CAN_Frame1.rate  = _5Hz_Rate;

    //add to the scheduler 
    CANport0.addMessage(&RAW_CAN_Frame1, TRANSMIT);

    // call the scheduler in a 2mS timer iterrupt;

    // manipulate CAN payload in loop() or wherever appropriate
    RAW_CAN_Frame1.U.b[0] = i;

Getting Started with OBD2 PID’s (reference

    To get engine RPM:        

    //create the CANport acqisition schedulers
    cAcquireCAN CANport0(CAN_PORT_0);

    //define an OBDParameter object 
    cOBDParameter OBD_Speed("Speed ", " KPH" ,  SPEED , _8BITS,  false, CURRENT,  1, 0,  &CANport0);

    //start CAN ports, set the baud rate here

    // call the scheduler, preferable in an interrupt;

    //show acquired data in loop() wherever appropriate

TIPs and Warnings

    - The first revision of code was developed for functionality and not speed. For example, there is only one CAN mailbox implemented.
      Many many speed efficiencies are yet to be found and optimized.
    - The underlying CAN library provided here "due_can.*" may not be the latest contributions from the DUE forum.
    - the OBD2 has only beent tested on one vehicle so far with 11-bit identifiers
    - To create an OBD PID that does not yet exist see the relevant enums in the OBD2.h file.  
    - Thanks to collin80 for developing the original due_can.* libraries and ivanseidel for developoing the DUETimer libraries
    - When in doubt, check your wiring and termination resistors ;)

Hardware Information

See: for the latest CANshield and protoshield hardware for the Arduino DUE

Version History

  • 1.0 (2014-18-03): Original release