The ELM327 is a programmed microcontroller produced for translating the on-board diagnostics (OBD) interface found in most modern cars. The ELM327 command protocol is one of the most popular PC-to-OBD interface standards and is also implemented by other vendors.
The original ELM327 was implemented on the PIC18F2480 microcontroller from Microchip Technology.
While in business, ELM Electronics also sold other variants of the product, with slightly different part numbers, which implemented only a subset of the OBD protocols.
In June 2020, ELM Electronics announced it was closing the business in June 2022.
Uses
The ELM327 abstracts the low-level protocol and presents a simple interface that can be called via a UART, typically by a hand-held diagnostic tool or a computer program connected by USB, RS-232, Bluetooth or Wi-Fi. New applications include smartphones.
There are a large number of programs available that connect to the ELM327.
The function of such software may include supplementary vehicle instrumentation, reporting and clearing of error codes.
ELM327 Functions:
Read diagnostic trouble codes, both generic and manufacturer-specific. Clear some trouble codes and turn off the MIL ("Malfunction Indicator Light", more commonly known as the "Check Engine Light") Display current sensor data Engine RPM Calculated Load Value Coolant Temperature Fuel System Status Vehicle Speed Short Term Fuel Trim Long Term Fuel Trim Intake Manifold Pressure Timing Advance Intake Air Temperature Air Flow Rate Absolute Throttle Position Oxygen sensor voltages/associated short term fuel trims Fuel Pressure
Protocols supported
The protocols supported by ELM327 are:
SAE J1850 PWM (41.6 kbit/s) SAE J1850 VPW (10.4 kbit/s) ISO 9141-2 (5 baud init, 10.4 kbit/s) ISO 14230-4 KWP (5 baud init, 10.4 kbit/s) ISO 14230-4 KWP (fast init, 10.4 kbit/s) ISO 15765-4 CAN (11 bit ID, 500 kbit/s) ISO 15765-4 CAN (29 bit ID, 500 kbit/s) ISO 15765-4 CAN (11 bit ID, 250 kbit/s) ISO 15765-4 CAN (29 bit ID, 250 kbit/s) SAE J1939 (250kbit/s) SAE J1939 (500kbit/s)
Command set
The ELM327 command set is similar to the Hayes AT commands.
Other versions
The ELM327 is a PIC microcontroller that has been customized with ELM Electronics' proprietary code that implements the testing protocols. When ELM Electronics sold version 1.0 of its ELM327, it did not enable the copy protection feature of the PIC microcontroller. Consequently, anyone who had bought a genuine ELM327-v1.0 could use a device programmer to read ELM's proprietary microcontroller firmware as a binary blob. Pirates could trivially produce an ELM327 clone by purchasing the same microcontroller chip and programming it with the copied blob. ELM327 copies were widely sold in devices claiming to contain an ELM327 device, and problems have been reported with the copies. The problems reflect bugs that were present in ELM's version 1.0 microcode; those making the clones may continue to sell the old version.
Although these copies may contain the ELM327 v1.0 code, they may falsely report the version number as the current version provided by the genuine ELM327, and in some cases report an as-yet non-existent version. Released software versions for the ELM327 are 1.0, 1.0a, 1.1, 1.2, 1.2a, 1.3, 1.3a, 1.4, 1.4b, 2.0, 2.1, 2.2 and 2.3 only. The actual functions of these copies are nonetheless limited to the functions of the original ELM327 v1.0, with their inherent deficiencies.
Version outline
v1.0
Initial public release, the ELM327 v1.0 supported: – SAEJ1850 PWM and VPW,- – ISO 9141-2 (10.4 and 9.6 kbit/s), – ISO 14230-4 (10.4 and 9.6 kbit/s), – ISO 15765-4 CAN (250 and 500 kbit/s)- The RS232 baud rates were only 9.6 kbit/s or 38.4 kbit/s
v1.0a
– J1850 VPW timing adjustment for some ’99 – ’00 GM trucks.
v1.1
– Introduced Programmable Parameters
– Added Flow Control commands
v1.2
– RS232 baud rates are adjustable to 500 kbit/s
– Programmable Parameters can be reset with a jumper
– Introduced Adaptive Timing
– Added SAE J1939 support (protocol A) – Added user defined CAN protocols B and C – Modified KWP protocols to allow four byte headers