Controlling an analog automotive tachometer

I'm looking for a bit of advice... I'm wanting to control an aftermarket analog automotive tachometer with an arduino. I was figuring I could just feed a signal into it but I am not sure what type of signal I would need to use? Is there a standard for this?

+12V square wave pulses.

http://www.autometer.com/tech_faq_answer.aspx?sid=3&qid=13
This sounds like a viable option, but the signal to the cluster tach is not the same signal as what our tach needs to see (12v square wave).

It is possible. First, you need a datasheet for the Analog Automotive Tachometer. I am assuming it is a simple ammeter. <-- I may spell this one wrong... It is a needle meter. It work the same principle of a needle multimeter. The automotive store has those. I do have some needle meters here, and the only info for them is : At max current <-- needle at max value, what is the current ? The type I have are 10 mA ? type ? hum.. I need to check it out. Anyway, it work like : 0 current = no needle mouvement. at a certain current example : 10 mA - full needle mouvement, more than the current rated, it may damage the needle / internal coil.

If you have a datasheet for this particular meter, you may have more insight.

I was figuring I could just feed a signal into it but I am not sure what type of signal I would need to use?

Not that simple... The Arduino is Digital... 0 V = 0 and 5 V = 1 in and out, can take an analog signal 0 V to 5 V in, and a PWM signal , a digital signal , with a duty cycle. Therefore you need to "convert" a digital signal into a current signal.

Ok here the "trick" ---> Digitals ---> analog <-- Voltage ----> current. You got to use an external circuit. An Digital to Analog converter and a voltage to current converter. You have to use a few Op-Amps. <-- Operational Amplifier.

To use the PWM, you need : PWM --> Intergrator - > Buffer op-amp --> Voltage to current converter.

I hope that give you some insights. those are "Block" diagrams, you simply design each block to make this project to work.

I am sorry that it is not a simple answer.

Analog rev counters are usually frequency meters driven by the 12V square wave off the coil -ve. To drive it yourself you would need to generate a 12V square wave of the appropriate frequency corresponding to the engine's firing frequency at your target RPM. Obviously the relationship between RPM and firing frequency depends on the number of cylinders, and many aftermarket rev counters have a switch to let you select this for 4/6/8 cylinder engines.

Analog rev counters are usually frequency meters driven by the 12V square wave off the coil -

Hum... I did know about that type.

In that case... TTL signal ----> 12 V signal a simple transistor circuit can do just that.

Need : TTL from Arduino --> NOT inverter <-- 74LS04 or 74LS14 ----> base resistor of 4.7 K ---> a 2N3904. For Rc = 1 K , take signal from the collector <-- Your 12 V signal. Connect Rc = 1K to collector and the another end, a 12 V source, and of course, the emitter to GND and all GND together.

Twizted:
I'm looking for a bit of advice... I'm wanting to control an aftermarket analog automotive tachometer with an arduino. I was figuring I could just feed a signal into it but I am not sure what type of signal I would need to use? Is there a standard for this?

The problem is that there are several “standards” and so you would need to know the input signal expected for the make and model tachometer you have in mind. Some are designed for a dedicated RPM alternator output (typical for diesel engines), some work off the coil negative terminal, some require a 1:1 ratio flywheel magnetic pickup arrangement and others again measure the frequency of the alternator output ripple. The signal required to drive these will vary accordingly.

Note however that the signal on the negative coil terminal is a complex waveform that looks nothing like a 12V square wave. Tachometers designed for alternator RPM output however may work well off a 12V square wave. Don’t expect a 1:1 ratio of input frequency to meter reading however. This depends on the alternator to engine pully size ratio s well as the number of alternator poles and so calibration will be required.

BenF:
Note however that the signal on the negative coil terminal is a complex waveform that looks nothing like a 12V square wave.

Sometimes they will pick up a 12V square wave, sometimes you need to put an induction coil in the circuit to produce a high enough spike for them to pick up. A 12V relay coil (with the switching hardware removed) does the job nicely.

Sorry for the late reply... I actually got it working with persistence and a LOT of help from my friend Google...

I ended up sending it a signal using the tone() function based on something I read on another forum. It was suggested that 3000Hz should correspond to around 3000RPM but that proved to not hold true.... at least not with this gauge...

Anyway, turned out that it was peaking out at around 8K RPM at around 430Hz.... But, this is just an uber cheap tach from ebay...

Here is a short video I posted once I got it working Arduino + Automotive RPM Gauge (Tachometer) - YouTube

I am glad you got it working. I am just curious, did you have a datasheet ? Others maybe interested doing the same thing. Even me, I may add a tach for my car.

That tacho looks like it has a rotary switch near the lower left hand corner. My guess is that it's to set the number of cylinders. What did you have to set to? Try setting it to 4 to get 3000Hz = 3000rpm.

The potentiometer in the front is for setting the shift light position. There is a switch in the back for selecting 4,6 or 8 cylinder engines but in all three cases 3000Hz pegged the needle.

For adding a tach to your car it would be pretty simple and not require the uC :slight_smile:

As far as a datasheet I did not have one.. I just took a chance and started feeding it different signals/voltages until I found one that worked...

4-stroke engine (every cylinder fires once every other rev).

Hz = 30000 / 60 * 4 / 2 = 100 (3000RPM, 4 cylinders)
Hz = 80000 / 60 * 6 / 2 = 400 (8000RPM, 6 cylinders)

I've still got it hooked up on my bench.. when I get to the shop later I will try some more testing and see what happens :slight_smile:

the function I'm using is tone(9, 3000)... that should put a 3000Hz signal on pin 9... let me know if you have any specific code you would want me to throw at it...

I had some fun fixing my dead boat tach a couple years back. Rather than looking for a replacement, I replaced the analog needle and electronics with a Pro Mini and a 4-digit 7-segment display.

There was plenty of room for the Pro Mini inside the instrrument housing and a small analog front-end to pick-up the RPM count from the tach input (coil minus in my case). The 4-segment display was mounted flush through a matching cutout in the original instrument dial. The cutout was made with a sharp paper knife and it has worked great and dead-accuracte ever since.

BenF is right, 3000Hz is far too high. Use the calculations he provided, or to put is another way, frequency = RPM * cylinders/120.

dc42:
BenF is right, 3000Hz is far too high. Use the calculations he provided, or to put is another way, frequency = RPM * cylinders/120.

Your equation yielded the proper results albeit the needle only got close to the given x1000 which I sort of expected given the quality of this gauge (it was SUPER cheap)....

Below is the code I used and I sent the signal through a simple 4N25 Opto I had laying around to isolate the arduino from the rest of it...

void setup()  { 
  pinMode(9, OUTPUT);
} 

void loop()  { 
    tone(9, 33.3333333333333);
    delay(2500);
    tone(9, 66.66666666666667);
    delay(2500);
    tone(9, 100);
    delay(2500);
    tone(9, 133.3333333333333);
    delay(2500);
    tone(9, 166.6666666666667);
    delay(2500);
    tone(9, 200);
    delay(2500);
    tone(9, 233.3333333333333);
    delay(2500);
    tone(9, 266.6666666666667);
    delay(2500);
    noTone(9);
    delay(2500);
}

Techone:
I am glad you got it working. I am just curious, did you have a datasheet ? Others maybe interested doing the same thing. Even me, I may add a tach for my car.

I haven't looked at the OBDuino and similar, but a tach-out signal would be a nice addition, if there isn't such a function already. Adding a tach to a Ford Focus is either easy or hard. I've found multiple differing "guides" on how to do it, but most of them involve an adapter which IIRC hooks up to the coil, or DIY renditions of the the same. I assume that if you hook up to the CANbus, tach info is there someplace.

Thank for the tips, justjed, I have to look into the Ford Focus Can Bus to have the tach signal. Hum... by just thinking about it, when my car was being tested for emissions require by the Ministry of Transportation - Ontario, the tech only connect the CAN bus to a computer system and can read all the info when the car run on a tread mill.

Yes, it is possible... I will do a search about it. I will look at the book "Haynes Repair Manual" Ford Focus 2000 to 2005.

BTW, justjed, my car is fix, $3000 for a 60 000 km motor. ( include installation ). :astonished: Just to let you know. The motor fail around 150 000 km. :fearful:

My car is fine now, BTW

I am trying to recreat this with a Tach I got from Summit. The tone function works well, however when I try to lower the tone signal frequency enough to get under 500rpm it starts to freak out. at 30hz I am at 500 rpm, at 29 hz I am pegged out on the tach. I tried to switch to the following code:

void loop() {
digitalWrite(8, HIGH);
delayMicroseconds(1000);
digitalWrite(8, LOW);
delayMicroseconds(1000);
}

and as I play with the time delay, I run into the same issue where its either 500 rpm, 0, or pegged out as I lower the frequency. Is it something with my signalling that once I get a square wave that is slow enough the tach can't handle it?

[May 2016]

I am trying to emulate the rotation of a speedometer cable to correct for a change in wheel diameter and gearbox and adjust BUT in passing I must observe that as soon as the tachometer becomes an integral part of a complex loom and the vehicles ancillaries start to become "sentient", tapping off wires to trigger/stimulate additional gizmos becomes problematic.

As the owner of a Honda Jazz with little more complex than a rev counter I have decided that displaying coolant temperature and lambda with this is best achieved via a bluetooth odbcII adaptor and a spare 7" tablet... if there is a way to tap into the odbcII with an arduino to grab into I would love to hear about it!