SlideShare a Scribd company logo
Arduino-based OBD-II
Interface and Data Logger
CS 497 Independent Study
Ryan Miller
Advisor: Prof. Douglas Comer
April 26, 2011
Arduino
• Italy 2005
• ATmega328 microcontroller
• 14 digital I/O pins
• 16 MHz clock speed
• 32 KB memory
• About $30 online
Arduino
Hardware
Automotive OBD
ISO Interface
Software
Data
Conclusions
Arduino
• Program “sketches” in
Multi-platform Java-
based IDE
• Code in C/C++
• Serial Communication
(currently USB)
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
Arduino
Hardware
Automotive OBD
ISO Interface
Software
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
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
Arduino
Hardware
Automotive OBD
ISO Interface
Software
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
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
byte	
  message[6];	
  
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(s) Description
0 Message Header 1
1 Message Header 2
2 Source Address
3 – 9 Data (up to 7 bytes)
Final byte Checksum
byte	
  buf[11];	
  
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…
• This gives you the rate of air in grams / second
PID Bytes Description Formula
0x10 2 Mass Air Flow Rate ((A*256)+B)/100
Software
• You can convert into
• And then use vehicle speed to convert to
or MPG
g air
s
gal gasoline
h
miles
gal gasoline
Data
• Scanned four PIDs over a
20-minute interval every
1-2 seconds
• Vehicle Speed
• Engine RPM
• Engine Coolant
• Calculated MPG
Arduino
Hardware
Automotive OBD
ISO Interface
Software
Data
Conclusions
Data
mph
Data
mph rpm
Data
°C
Data
mph
°C
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
Arduino
Hardware
Automotive OBD
ISO Interface
Software
Data
Conclusions
Questions?

More Related Content

Arduino-based-diag OBD-II_programação.pdf

  • 1. Arduino-based OBD-II Interface and Data Logger CS 497 Independent Study Ryan Miller Advisor: Prof. Douglas Comer April 26, 2011
  • 2. Arduino • Italy 2005 • ATmega328 microcontroller • 14 digital I/O pins • 16 MHz clock speed • 32 KB memory • About $30 online Arduino Hardware Automotive OBD ISO Interface Software Data Conclusions
  • 3. Arduino • Program “sketches” in Multi-platform Java- based IDE • Code in C/C++ • Serial Communication (currently USB)
  • 4. 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 Arduino Hardware Automotive OBD ISO Interface Software Data Conclusions ?
  • 5. Hardware • Vehicles produced in the U.S. after 1996 are required to have an OBD-II (on-board diagnostic) connector
  • 6. Hardware • OBD-II Interface • Very simple connection for most applications • Most important pins • K-Line • Ground • +12V
  • 7. Hardware • Open-source project called “OBDuino” offered the interface schematic (which is fortunate, because I am not an EE major)
  • 8. Hardware • Open-source project called “OBDuino” offered the interface schematic (which is fortunate, because I am not an EE major)
  • 9. Hardware • Freescale MC33290 handles the tricky parts • K-Line, Ground, and +12V go in • Serial Tx/Rx come out
  • 11. 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 Arduino Hardware Automotive OBD ISO Interface Software Data Conclusions
  • 12. 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
  • 13. 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);   }  
  • 14. Software • Then you can start 10.4 kbps communication and perform these steps to finish initialization:
  • 15. 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
  • 16. 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
  • 17. Software 1. Request PID with hex value 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 byte  message[6];   for  (int  i  =  0;  i  <  6;  i++)    iso_write_byte(message[i]);  
  • 18. Software 2. Continuously read data from ISO until successful checksum or timeout Byte(s) Description 0 Message Header 1 1 Message Header 2 2 Source Address 3 – 9 Data (up to 7 bytes) Final byte Checksum byte  buf[11];  
  • 19. 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;  
  • 20. Software 4. Record/display value and repeat • Displaying on an LCD screen: LiquidCrystal  lcd;     lcd.print(rpm);    
  • 21. Software 4. Record/display value and repeat • Writing to an SD card: File  log;     log.print(rpm);    
  • 22. Software • One last note on PIDs… • This gives you the rate of air in grams / second PID Bytes Description Formula 0x10 2 Mass Air Flow Rate ((A*256)+B)/100
  • 23. Software • You can convert into • And then use vehicle speed to convert to or MPG g air s gal gasoline h miles gal gasoline
  • 24. Data • Scanned four PIDs over a 20-minute interval every 1-2 seconds • Vehicle Speed • Engine RPM • Engine Coolant • Calculated MPG Arduino Hardware Automotive OBD ISO Interface Software Data Conclusions
  • 29. 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 Arduino Hardware Automotive OBD ISO Interface Software Data Conclusions