Today we are going to have a bit of introduction to what the OBD2 and ELM327 is, protocols and trouble codes. This is necessary to understand what we are going to do later on.
First a dictionary:
– OBD / OBD2 – OBD2 is the second version of connector that is available in all modern cars and connects to CAN bus or ECU of the car. We will use only protocols compliant with OBD2 connector, OBD is an old version to which OBD2 is not backwards compatible.
– CAN – Controller Area Network, serial bus that allows car components to communicate with ECU.
– DTC – Diagnostic Trouble Codes.
– PIDS – Parameter IDs for CAN requests.
I am going to use ELM327 controller (or Chinese counterfeit). It is quite cheap and easy to buy and does support a lot of protocols:
0 – Automatic
1 – SAE J1850 PWM (41.6 kbaud)
2 – SAE J1850 VPW (10.4 kbaud)
3 – ISO 9141-2 (5 baud init, 10.4 kbaud)
4 – ISO 14230-4 KWP (5 baud init, 10.4 kbaud)
5 – ISO 14230-4 KWP (fast init, 10.4 kbaud)
6 – ISO 15765-4 CAN (11 bit ID, 500 kbaud)
7 – ISO 15765-4 CAN (29 bit ID, 500 kbaud)
8 – ISO 15765-4 CAN (11 bit ID, 250 kbaud)
9 – ISO 15765-4 CAN (29 bit ID, 250 kbaud)
A – SAE J1939 CAN (29 bit ID, 250* kbaud)
B – USER1 CAN (11* bit ID, 125* kbaud)
C – USER2 CAN (11* bit ID, 50* kbaud)
Modern cars usually have CAN connection, older ones may have a different protocol. Luckily there is automatic connection available in ELM which tries all the protocols and selects the working one (I assume this is the first that responded for the request).
User can communicate with ELM327 using AT commands, popular in modems communication. The specific subset depends on the controller version. There is a good breakdown of commands supported in each version in the table: https://www.elmelectronics.com/wp-content/uploads/2016/07/AT_Command_Table.pdf
The description and usage for each command is available in the datasheet for ELM372. There is also an indication for which protocol it is available which may come in handy:
Next thing are “Diagnostic Error Codes”, usually connected with “Check Engine” light:
This generally indicates current (or possible in the future) problem with one or more parts of the engine. I have merged some data available on the internet for quick reference of trouble codes:
First letter identifies the type of error code:
Pxxxx - Powertrain
Bxxxx - Body
Cxxxx - Chassis
Uxxxx - Network
Second digit indicates whether the code is manufacturer specific:
x0xxx - General
x1xxx - Manufacturer-specific
Third digit shows us what system the trouble code references:
xx1xx - Emission systems
xx2xx - Injection
xx3xx - Ignition
xx4xx - Auxiliary emissions systems
xx5xx - Speed/idle control
xx6xx - Computer
xx7xx/xx8xx - Transmission
xx9xx - Input/output signals and controls
Digits four and five show the specific failure code:
xxx00 to xxxFF
Digits from 2nd to 5th are hexadecimal.
More or less complete list of DTC codes is available here:
There is much more data available on wiki about the OBD2 in general which might be useful later: https://en.wikipedia.org/wiki/OBD-II_PIDs
That’s all for now as it gets quite long. Stay tuned 😉