Introduction: Arduino RPM Limiter for Gas Engine

Youtube Demonstration

This is for replacing a governor for limiting the speed of a gasoline engine. This RPM limiter can be toggled to 3 different settings on the fly. I installed this on a single cylinder, Briggs and Stratton engine and used an Arduino mega and an LCD screen. If you had to work with a smaller board you could just show all the info with status lights and the serial monitor

There's 5 important parts to this

-finding the right wire for the kill switch

-3 position limiter switch

- relay

-spark plug pickup and isolator

-the code


3x 1k resistors (or any 3 equal resistors)

2x 10k resistors


1 diode 1n914

1 22uF ceramic capacitor (any small capacitor in this range will work)

bunch of wire

5v, 5 pin relay

an engine (doesn't work on diesels)

an arduino

breadboard for setup and testing (less important if you skip the lcd screen)

single pole, double throw switch (should have 3 tabs or pins on it)


Step 1: Step 1: Finding the Right Wire on the Motor

a critical part of this project is finding a low voltage wire on the engine that you can shut it off with. You could disconnect the big wire that goes from the coil to the spark plug, but the high voltage can jump across contacts. We can control the low voltage wire going to the coil and the ignition module. a 6v relay will be able to do this, and we can control that small relay with an arduino.

The first picture is from a 90's lawn mower, it would shut off if you connected the green wire to ground.

The second picture is from a newer briggs and stratton motor, it would shut off if you grounded the red/black wire.

I can't give instructions for every motor so you'll have to do some experimenting. You can find better instructions if you look up a 'kill switch' for your specific motor. Keep in mind that one of your pins on the relay is ON when the relay is powered, and another is OFF when the relay is powered.

Step 2: Step 2: Spark Signal Isolator

Current flowing through a wire will generate a magnetic field, and you can use a changing magnetic field to create pulses of current through a different, separate wire. This is the principle that ignition coils, transformers, and wireless chargers work on. We can use this effect to read the speed of the engine if we wrap a loop of wire around the spark plug wire.

With the engine running, I found that 2 loops of wire around spark plug wire generated pulses about +/- 15-20v. We can use a resistor and diode to block the negative pulses and reduce the voltage. I used these pulses to control a MOSFET transistor, and use the output of the transistor to control a digital pin on the Arduino.

The engine generates a lot of high voltage pulses, and a loop around the spark plug wire can also generate enough voltage to fry an Arduino, so I recommend testing this circuit out by connecting a multimeter to the MOSFET. connecting a wire looped around the spark plug directly to the Arduino will break it.

One downside of this system is that when the relay cuts the spark, the Arduino can't get a reading from the spark plug to see how fast the engine is spinning. This program turns off the spark when the engine goes too fast, and then immediately reads 0 rpm the next iteration and turns it back on. Most other Arduino-tachometer projects use a hall effect sensor. On one hand, inductive systems don't require adding any moving parts to an engine. On the other, there's no inductive signal when the ignition system is off/cutting spark/misfiring/disconnected

Step 3: Step 3. Limiter Switch

this part is optional but its pretty useful

its just a voltage divider that uses the switch to bypass some resistors depending on the position. The actual rpm limit is decided in the code, this just lets you change settings on the fly.

Step 4: Step 4: Relay

A relay is an switch that turns on or off when it gets power. You can use a small current source (like a 40mA digital arduino pin) to change a larger one ( the engine's ignition system )