Talking to the computer in a 2005 Toyota Camry using Arduino and k-line ISO 9141
Aug 31, 2017
Introduction to K-line Arduino Communication
While a lot of people are making interfaces to connect an Arduino microcontroller to their cars, I wanted to get in on the action. Unfortunately for me, my car is a 2005 Toyota Camry which uses the older K-line interface for communication. Since 2008, all cars went to CAN BUS standard which is what all of the Arduino shields available are made to work with. The hardware available will not work with older cars and there is not much information available on the older OBD interfaces for pre-2008 vehicles. So I gathered everything out there and added my own findings for this tutorial.
Making an Arduino Trip Computer for 2005 Toyota Camry
Goals for this project
- Begin communication with car computer
- Request commonly available PID codes to get data from car computer (more information on PID codes from Wikipedia)
- Display vehicle speed in MPH
- Calculate and display instantaneous miles per gallon MPG fuel consumption
What you will need
- Arduino Uno Microcontroller $2
- MC33290, ISO K Line Serial Link Interface Chip (converts the 12 volt logic of the car computer to 5 volt that is compatible with the Arduino. Essentially takes the place of the Can Bus shield) $2
- SOT23 to DIP10 Adapter PCB Board Convertor (makes hand soldering to SMD chip possible) $3
- LCD display $10
- OBD port connector $8
- One 510 ohm resistor $0.25
- Wires $4
Total Cost: under $40 I buy everything off eBay (including Chinese clone arduinos) or from a local electronics store.
Downloads
Download the source code on github: Opengauge simplified code
How to Tell Which OBD Protocol Your Car Uses
All cars and light trucks built and sold in the United States after January 1, 1996 were required to be OBD II equipped, but several standards exist for the communications protocol. Here is a table of common protocols by manufacturer, though as I will show next, you can easily figure out which protocol is in use by examining the OBD port:
Manufacturer | OBD Protocol |
---|---|
SAE J1850 VPW | GM vehicles |
SAE J1850 PWM | Ford |
ISO 9141-2 K-Line | Chrysler and most Asian Cars |
ISO 14230 KWP2000 | Some Asian Cars |
CAN | All 2008+ vehicles |
- Pin 2 - J1850 Bus+
- Pin 4 - Chassis Ground
- Pin 5 - Signal Ground
- Pin 6 - CAN High (J-2284)
- Pin 7 - ISO 9141-2 K Line
- Pin 10 - J1850 Bus
- Pin 14 - CAN Low (J-2284)
- Pin 15 - ISO 9141-2 L Line
- Pin 16 - Battery Power
You can examine the pinout of your OBD port to determine which communications protocol it uses. For example, on my Camry, only pins 4,5,7,13,15, and 16 were populated. This told me it could only be using K-line protocol. Pin 15 is ISO-9141 L-Line but it doesn't need to connect to the Arduino for any reason.
Connecting the Arduino to the Car
Step 1: prepare OBD cable
If you bought a cheap OBD cable it is probably wired to connect to a CAN BUS enabled vehicle. You will need to cut it open and make sure the wires connect to pins 4, 7, and 16 of the OBD port. I recommend using a multimeter to check the wiring.
Step 2: solder the MC33290 chip
The MC33290 comes in a SMD mount package which is not so useful to us because the pins are small and break easily. Solder the chip to a DIP adapter board so you can solder wires to it reliably.
Step 3: Connect all wiring between components
Check out the data sheet for the MC33290 here. This microcontroller allows bidirectional communication between the K line interface of the onboard computer in the car and an Arduino. It does this by level shifting the logic signals. The ecu in your car uses 12v logic since it runs on a 12v battery. But the Arduino microcontroller uses 5v logic signals.
Info on MC33290 and 3 common ecu protocols here
I used a prototyping breadboard and prototyping wires to connect everything at first but found the wires came loose after a few car rides. You'll want to permanently solder wires for reliability. See the wiring diagram below:
Step 4: Upload source code to Arduino board
Download the source code on github: Opengauge simplified code
I owe a lot to the community for this code. The code is based very closely off the obduino project found on github. An open source collaboration among many dedicated individuals.
How to Calculate Miles Per Gallon MPG from MAF (Mass Air Flow Sensor)
It is a common feature on newer cars to display information like gas mileage and average fuel consumption for a trip. How does the car know how much fuel is being consumed at any given moment? In this case, we are calculating the figure using a commonly available PID code MAF or mass air flow rate. It tells us how much air is coming into the engine in grams per second. Assuming the engine is attaining an ideal air to fuel ratio as well as a few other constants, we can use an equation to calculate fuel burned per second and convert it to miles per gallon:
MPG = (14.7 * 6.17 * 4.54 * VSS * 0.621371) / (3600 * MAF / 100)
- 14.7 grams of air to 1 gram of gasoline - ideal air/fuel ratio
- 6.17 pounds per gallon - density of gasoline
- 4.54 grams per pound - conversion
- VSS - vehicle speed in kilometers per hour
- 0.621371 miles per hour/kilometers per hour - conversion
- 3600 seconds per hour - conversion
- MAF - mass air flow rate in 100 grams per second
- 100 - to correct MAF to give grams per second
Other Projects Gallery
Cheap K-Line trip computer for Citroen vehicle on instructables
Ryan Miller's ODBII Arduino Interface
Test and Send Your Feedback
Give this project a try and let me know how it goes in the comments section. Also send me any questions or suggestions you may have!