Arduino Car Tachometer Simulator (NO SIMHUB)
This project is one of those things I've wanted to do for a very long time. The inspiration started when I found an inexpensive Automotive Tachometer on Amazon for only $20. And with an additional $8 for other accessories, the total budget for this project came to about $28 (or roughly 1,000 baht), which is excellent value for the results obtained. The main goal of this project is to transform a real automotive needle tachometer into a simulated display device, using an Arduino as the main controller to generate frequency signals to drive the needle. You can apply this in various ways, such as in simulator setups, racing games, or even for testing automotive tuning equipment. The advantage is that you can use any model of tachometer and any Arduino board you have available.
From an engineering perspective, most automotive tachometers operate by receiving pulse signals. In real cars, these signals typically come from the ignition coil or the Engine Control Unit (ECU). The number of pulses per revolution depends on the number of engine cylinders. For example, a 4-cylinder, 4-stroke engine typically sends 2 pulses per 1 revolution. Therefore, the key to this project is enabling the Arduino to simulate precise Square Wave signals to send to the Tachometer.

Hardware Components and Operation
To convert digital signals from the Arduino into signals that the Tachometer understands, we first need to understand the voltage levels. Since Arduino operates at 5V, but most automotive tachometers require a 12V signal level, we need a Level Shifter circuit or use a Transistor (such as an NPN 2N2222 or TIP120) to act as a high-speed switch, pulling the 12V power supply signal to ground according to the pulse timing from the Arduino.
The main components used include:
- Arduino (Uno, Nano, or other models): Acts as the brains for calculations and frequency generation.
- Automotive Tachometer: The needle display we want to control.
- Transistor (NPN): For switching the 12V voltage.
- Resistor (1k - 10k Ohm): For limiting current to the Transistor's Base pin.
- 12V Power Supply: External power source for the Tachometer.

Code and Control Logic (Logic Explanation)
The logic behind controlling the needle involves using the tone() function or modifying values in the Arduino's Timer Registers to generate a Pulse Width Modulation (PWM) signal with a constant frequency that can be adjusted according to the desired RPM value. The frequency (Hz) can be calculated using the formula:
Frequency (Hz) = (RPM * Pulses_per_rev) / 60
For example, if we want the needle to point to 3,000 RPM for a 4-cylinder engine (which typically provides 2 pulses per revolution), we need to generate a frequency of $ (3000 * 2) / 60 = 100 Hz $.
int tachPin = 9; // Pin connected to the Transistor
void setup() {
pinMode(tachPin, OUTPUT);
}
void loop() {
// Simulate sweeping the needle from 0 to 8000 RPM
for (int rpm = 0; rpm <= 8000; rpm += 100) {
int frequency = (rpm * 2) / 60; // Calculate frequency for a 4-cylinder engine
if (frequency > 0) {
tone(tachPin, frequency);
} else {
noTone(tachPin);
}
delay(20);
}
}
From the code above, the tone(tachPin, frequency) function generates a Square Wave with a 50% Duty Cycle, sending it to the Base pin of the Transistor. This causes the Transistor to switch the 12V circuit of the Tachometer on and off at a frequency corresponding to the simulated RPM value. Using the delay(20) command helps make the needle movement smooth and natural, just like accelerating a real engine.

This project is not only a great starting point for those interested in Automotive Electronics, but also demonstrates how we can use inexpensive components to create high-performance tools with a basic understanding of Embedded Systems and electrical signal management.