Freematics OBD-II I2C Adapter for Arduino

This product works as a vehicle OBD-II data bridge for Arduino (literally all embedded platforms) with open-source Arduino library provided. Besides providing easy-to-use OBD-II data access, it also integrates 6-axis MEMS sensor module and voltmeter for measuring vehicle battery power. The adapter draws power from OBD-II port and convert it to 5V for powering attached device.

Features

  • Supporting CAN bus & KWP2000 protocols
  • Compatible with ELM327 AT command-set
  • Serial I2C data interface for micro-controllers
  • Fast (up to 100Hz) read-out of OBD-II PIDs available in vehicle ECU
  • Reading and clearing vehicle diagnostic trouble code (DTC)
  • Built-in voltage meter for measuring car battery voltage
  • Built-in MPU-6050 MEMS module (accelerometer, gyro, compass & temperature)
  • Powering attached devices with DC 5V up to 2A.
  • Arduino library and sketches available

Compatibility

The adapter plugs into the OBD port usually located under the steering column or slightly to the left of it. To check if your vehicle is OBD-II certified, open your hood and find the sticker that looks like this:

obd_sticker

Vehicles using following vehicle protocols are supported.

  • CAN 500Kbps/29bit
  • CAN 250Kbps/29bit
  • KWP2000 Fast
  • KWP2000 5Kbps

 

Getting Started

The adapter stays plugged into the OBD port usually located under the steering column or slightly to the left of it.

 _DSC0081-900x600

A cable comes out from the adapter and splits into one 4-pin connector two 2-pin connectors, including power lines (VCC/GND)and data lines (Rx/Tx or SDA/SCL). They can be connected to Arduino with onboard breakout pins or breakout shield. Your Arduino device will look tidy in car with only one cable.

_DSC0103-900x600 _DSC0082-900x600 _DSC008353-900x600

Power Lines:

  • Red: VCC
  • Black: GND

Data Lines:

  • Green: SDA
  • White: SCL

I2C Addresses:

  • OBD I2C Address: 0x68
  • MEMS I2C Address: 0x62

 

The Library

A dedicated Arduino library is developed and maintained regularly, providing a set of easy-to-use APIs to retrieve real-time data from a vehicle.

The library provides easy-to-use APIs for configuring the adapter and accessing vehicle’s OBD-II PIDs through ELM327 AT command-set. Following are some useful APIs:

  • readPID – read specified OBD-II PID and return parsed value
  • clearDTC – clear diagnostic trouble code
  • getVoltage – measure car battery voltage
  • getVIN – retrieve Vehicle Identification Number

Here is an example code of a simplest engine RPM indicator, which uses the pin 13 LED (built in every Arduino board) to indicate whether the engine is above 3000 rpm.

#include <Wire.h>
#include <OBD.h>

COBDI2C obd;

void setup()
{
  // we'll use the debug LED as output
  pinMode(13, OUTPUT);
  // start communication with OBD-II adapter
  obd.begin();
  // initiate OBD-II connection until success
  while (!obd.init());
}

void loop()
{
  int value;
  // save engine RPM in variable 'value', return true on success
  if (obd.read(PID_RPM, value)) {
    // light on LED on Arduino board when the RPM exceeds 3000
    digitalWrite(13, value > 3000 ? HIGH : LOW);
  }
}

The built-in MPU-6050 MEMS sensor is on I2C as well. Programming guides for using MPU-6050 is available here.

A more comprehensive example sketch for OBD-II I2C adapter is available here.

Commonly used PIDs are defined in OBD library as followings.

Engine

  • PID_RPM – Engine RPM (rpm)
  • PID_ENGINE_LOAD – Calculated engine load (%)
  • PID_COOLANT_TEMP – Engine coolant temperature (°C)
  • PID_ENGINE_LOAD – Calculated Engine load (%)
  • PID_ABSOLUTE_ENGINE_LOAD – Absolute Engine load (%)
  • PID_TIMING_ADVANCE – Ignition timing advance (°)
  • PID_ENGINE_OIL_TEMP – Engine oil temperature (°C)
  • PID_ENGINE_TORQUE_PERCENTAGE – Engine torque percentage (%)
  • PID_ENGINE_REF_TORQUE – Engine reference torque (Nm)

Intake/Exhaust

  • PID_INTAKE_TEMP – Intake temperature (°C)
  • PID_INTAKE_PRESSURE – Intake manifold absolute pressure (kPa)
  • PID_MAF_FLOW – MAF flow pressure (grams/s)
  • PID_BAROMETRIC – Barometric pressure (kPa)

Speed/Time

  • PID_SPEED – Vehicle speed (km/h)
  • PID_RUNTIME – Engine running time (second)
  • PID_DISTANCE – Vehicle running distance (km)

Driver

  • PID_THROTTLE – Throttle position (%)
  • PID_AMBIENT_TEMP – Ambient temperature (°C)

Electric Systems

  • PID_CONTROL_MODULE_VOLTAGE – vehicle control module voltage (V)
  • PID_HYBRID_BATTERY_PERCENTAGE – Hybrid battery pack remaining life (%)

Additional defines can be added to access all OBD-II PIDs which the car’s ECU provides.

 

Comparison

The following table lists the differences among all Freematics OBD-II adapter models.

Features \ Models OBD-II I2C Adapter OBD-II UART Adapter V1 OBD-II UART Adapter V2
Connection Interface I2C Serial UART Serial UART
Additional Interface N/A N/A microUSB
MEMS Sensor MPU-6050 N/A MPU-6050
Voltmeter Yes Yes Yes
Max. Output Power 2A 2A 2.1A
Standby Mode Power 10mA 5mA 6mA

 

FAQ

Q: What is this product used for?
A: The most straight-forward use of this product is for making Arduino possible to access vehicle data easily. The OBD-II data, together with other data from GPS or all kinds sensors, can be logged and stored on SD/TF card with Arduino and that makes an open-source vehicle data logger (check out the data logger kits). More extensively, many interesting interaction applications requiring car data can be made.

Q: How is the adapter powered?
A: The adapter gets power from the 12V DC output from the OBD-II port.

Q: Does my Arduino needs power from somewhere in the car?
A: The adapter provides regulated 5V output for powering Arduino and other devices, so no extra power cord is needed.

Q: How do I connect the adapter with my Arduino?
A: The adapter works with all models of Arduino with the dedicated Arduino library and is connected with Arduino by connecting adapter’s SDA and SCL to Arduino’s SDA and SCL pins.

Q: Is the power provided by the adapter always available in car?
A: This depends on whether the OBD-II port of your car still has power after ignition is off. Actually it is so with most cars.

Q: What’s the maximum frequency of data polling?
A: The OBD-II PIDs are polled one after another. The time for a polling depends on the speed of car’s ECU computer and how busy the computer is in different status. With a typical modern car with CAN bus, the time can be as low as 10ms. In other word, up to 100 times of data polling can be done in one second.

 

Support

Please use the forum for seeking support. You can post your inquiries and questions there and they will be replied soon.

 

User Feedbacks

Just wanted to let you know that I got the adapter today and took it for a spin on the race car. Worked great out of the box!
Haven’t tried the accelerometer/gyro yet or the legacy protocols but will do that in a couple weeks.

Thanks

Brian Calder @ Bluefire Racing
2005 Mustang GT
#404 NASA Texas American Iron
www.bluefireracing.com

 

Links

LiveZilla Live Chat Software
LiveZilla Live Chat Software