Using CAN bus on an older car

There’s a lot of information online about OBD-II scanners and “car hacking” in general, but what if you have a car built before 1996 that doesn’t use OBD-II? I’ve found the underlying technology of OBD-II, CAN bus, can be a useful addition to an older car. I’m going to detail a few things I’m working on that might give you some ideas for your own car.

The car I’m working with is a 1986 Ford Mustang SVO. This car is a great starting point because it is has computer controlled fuel injection and ignition timing, but not much else in the way of computerized controls. The factory engine control unit (ECU) leaves a lot to be desired in terms of how airflow into the engine is measured. With that said, the SVO becomes a great candidate for MegaSquirt, an aftermarket DIY-oriented “stand alone” engine management computer. My SVO currently uses a MegaSquirt 2 that I built myself, and I have a MegaSquirt 3 on my test bench that will eventually go into the car. The MegaSquirt ECU will become the heart of the CAN bus network in the car.

Newer versions of the MegaSquirt firmware have CAN bus functionality built in. The easiest and most common way to use the CAN bus is to use the MegaSquirt tuning software to enable CAN realtime data broadcasting. The data format is described in this PDF. Digital dashboard systems from major brands such as AEM and Autometer can utilize MegaSquirt’s CAN bus data format to replace the factory gauges in your car.

This is about as far as most people will want to go, but I wanted to do some custom CAN bus programming. Here is the plan for my car.


Meguinauge is my Arduino project (source code on GitHub) that uses CAN bus to display engine parameters (i.e. gauges) from MegaSquirt on a 20×4 character LCD. I deliberately chose to use a character display to preserve a “period correct” look for the car. There are buttons to select how many and which gauges you want to see, and a warning light when an engine parameter goes out of range.

My engine simulator is running lean under boost, triggering the warning light on the breadboard


Carfuino is my Arduino project (source code on GitHub) that uses CAN bus to retrieve vehicle speed and a custom trip odometer reading as the basis for an automotive performance computer. Performance computers that measured things like 0-60 time became popular aftermarket accessories in the 1980s and are built in to many performance cars today. Carfuino will display data on a 16×2 character LCD.

My car did not come with a vehicle speed sensor (VSS), so getting this value is a custom job for me. I thought about different ways to handle the VSS signal, including using an Arduino analog output to send a variable voltage that maps to speed. For example, a 0.5v signal could represent a dead stop, and 4.5v could be 200mph. But when you consider the amount of electrical interference and grounding problems in a typical automotive environment, and the possibility of using the VSS signal for multiple subsystems, CAN bus made the most sense.

EPAS Middleware

Speaking of VSS signals, I am installing an electric power steering motor and ECU into my car to replace the hydraulic power steering, and I am going to modify it to create speed sensitive power steering. Most aftermarket electric power steering kits use a knob to adjust how much power assist to deliver, and I am going to replace the knob with a digital potentiometer that moves based on vehicle speed. This is yet another Arduino project, and it is really two projects in one. There is the aforementioned feature of changing a potentiometer value based on speed, and it will also be the controller that accepts and raw input from the VSS. It will take the signal, convert it to a more usable format, and put it on the CAN bus. This way, the VSS signal can be used by the Carfuino project, and MegaSquirt can use its “CAN receiving” setting to take the value from the CAN bus and use it internally.

OBD-II Emulation

I currently have no plans to do this, but it seems like it would be a fairly straightforward task to use the CAN data from MegaSquirt, emulate the OBD-II format, and send the signal to a standard OBD-II diagnostic port. This way you could plug in any off-the-shelf OBD-II scan tool or gauge and it would work. I don’t really need this because I find the raw MegaSquirt logs to be more valuable, but it’s an interesting idea.

I hope this has given you a few ideas about how you can use CAN bus to bring your older car into the modern era. It is important to check local laws and regulations regarding vehicle modifications. Do not use an Arduino in a way that can cause you to lose control of your vehicle.