Arduino-based OBD-II Interface and Data Logger

Transcription

Arduino-based OBD-II Interface and Data Logger
Arduino-based OBD-II
Interface and Data Logger
CS 497 Independent Study
Ryan Miller
Advisor: Prof. Douglas Comer
April 26, 2011
Arduino
•  Italy 2005
Arduino
Hardware
Automotive OBD
ISO Interface
Software
Data
Conclusions
•  ATmega328 microcontroller
•  14 digital I/O pins
•  16 MHz clock speed
•  32 KB memory
•  About $30 online
Arduino
•  Program “sketches” in
Multi-platform Javabased IDE
•  Code in C/C++
•  Serial Communication
(currently USB)
Hardware
•  Goals of this project:
Arduino
Hardware
Automotive OBD
ISO Interface
Software
•  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
Software
•  A few functions to perform:
Arduino
•  Initialize ISO connection
Hardware
•  Request data from vehicle’s ECU
Automotive OBD
ISO Interface
Software
Data
Conclusions
•  Display the result on the LCD and
record the value to retrieve later
Software
•  Initialization:
•  Starts by “bit-banging” 0x33 at 5 baud
•  i.e.
00110011
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 into gal gasoline
s
h
•  And then use vehicle speed to convert to
miles
gal gasoline or MPG
Data
•  Scanned four PIDs over a
Arduino
Hardware
Automotive OBD
ISO Interface
Software
Data
Conclusions
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
Conclusions
•  Embedded computing is
Arduino
Hardware
Automotive OBD
ISO Interface
Software
Data
Conclusions
ubiquitous
•  Massive amounts of data
generated by everyday
machines
•  Elec. Engineering and CS
can come together to make
some pretty cool things
Questions?