Arduino-based OBD-II Interface and Data Logger CS 497 Independent Study Ryan Miller Advisor: Prof. Douglas Comer April 26, 2011
Arduino Hardware Automotive OBD ISO Interface Software Arduino Italy 2005 ATmega328 microcontroller 14 digital I/O pins 16 MHz clock speed 32 KB memory About $30 online Data Conclusions
Arduino Program sketches in Multi-platform Javabased IDE Code in C/C++ Serial Communication (currently USB)
Arduino Hardware Automotive OBD ISO Interface Software Hardware Goals of this project: Communicate with an automotive engine control unit (ECU) via the Arduino Gather and record instantaneous data that is reported by the vehicle Data Conclusions?
Hardware Vehicles produced in the U.S. after 1996 are required to have an OBD-II (on-board diagnostic) connector
Hardware OBD-II Interface Very simple connection for most applications Most important pins K-Line Ground +12V
Hardware Open-source project called OBDuino offered the interface schematic (which is fortunate, because I am not an EE major)
Hardware Open-source project called OBDuino offered the interface schematic (which is fortunate, because I am not an EE major)
Hardware Freescale MC33290 handles the tricky parts K-Line, Ground, and +12V go in Serial Tx/Rx come out
Hardware OBD-II
Arduino Hardware Automotive OBD ISO Interface Software Software A few functions to perform: Initialize ISO connection Request data from vehicle s ECU Display the result on the LCD and record the value to retrieve later Data Conclusions
Software Initialization: Starts by bit-banging 0x33 at 5 baud i.e. 0 0 1 1 0 0 1 1 200ms pause = 1.6 seconds
Software Initialization: Starts by bit-banging 0x33 at 5 baud Code: byte b = 0x33; for (byte mask = 0x01; mask; mask <<= 1) { if (b & mask) // Choose bit digitalwrite(k_out, HIGH); // Send 1 else digitalwrite(k_out, LOW); // Send 0 } delay(200);
Software Then you can start 10.4 kbps communication and perform these steps to finish initialization:
Software Parameter IDs (PIDs) SAE J1979 standard Examples: PID Bytes Description Formula 0x0C 2 Engine RPM ((A*256)+B)/4 0x0D 1 Vehicle Speed (km/h) A 0x11 1 Throttle Position (%) A*100/255 0x3F 2 Catalyst Temp (B2, S2) ((A*256)+B)/10-40
Software Steps: 1. Request PID with hex value 2. Continuously read data from ISO until successful checksum or timeout 3. Convert returned value with formula 4. Display / record value and repeat
Software 1. Request PID with hex value byte message[6]; Index Value Description 0 0x68 SAE J1979 standard 1 0x6A OBD-II request 2 0xF1 Off-board tool 3 0x01 Mode 1 PIDs 4 pid Hex value for PID requested 5 Checksum Computed from message for (int i = 0; i < 6; i++) iso_write_byte(message[i]);
Software 2. Continuously read data from ISO until successful checksum or timeout byte buf[11]; Byte(s) Description 0 Message Header 1 1 Message Header 2 2 Source Address 3 9 Data (up to 7 bytes) Final byte Checksum
Software 3. Convert returned value with formula ie.: PID Bytes Description Formula 0x0C 2 Engine RPM ((A*256)+B)/4 double rpm; rpm = ((double)buf[0] * 256) + (double)buf[1]) / 4.0;
Software 4. Record/display value and repeat Displaying on an LCD screen: LiquidCrystal lcd; lcd.print(rpm);
Software 4. Record/display value and repeat Writing to an SD card: File log; log.print(rpm);
Software One last note on PIDs PID Bytes Description Formula 0x10 2 Mass Air Flow Rate ((A*256)+B)/100 This gives you the rate of air in grams / second
Software You can convert g air s into gal gasoline h And then use vehicle speed to convert to miles gal gasoline or MPG
Arduino Hardware Automotive OBD ISO Interface Software Data Conclusions Data Scanned four PIDs over a 20-minute interval every 1-2 seconds Vehicle Speed Engine RPM Engine Coolant Calculated MPG
Data mph
Data mph rpm
Data C
Data C mph
Arduino Hardware Automotive OBD ISO Interface Software Data Conclusions Conclusions Embedded computing is ubiquitous Massive amounts of data generated by everyday machines Elec. Engineering and CS can come together to make some pretty cool things
Questions?