I've recreated the ignition coil part of a small Honda ICE (typically used in lawn mowers or single-digit kW gensets). I use an electric motor to turn a flywheel taken from a dead engine, and I've placed the ignition coil unit just like in the real engine, with a spark plug and all. I get sparks when the flywheel runs faster than 500 RPM.
Physically, it looks like this:
I've also attached an Arduino-like device, like this:
The ignition coil is meant to be operated like this:
- The coil's body (laminations) is electrically connected to the engine block (chassis).
- One well insulated wire runs to the spark plug socket. The circuit is completed through the chassis.
- There's an engine kill switch: when you want to turn the engine off, you close the switch, which shorts some signal of the ignition circuitry. Again, circuit is completed through the engine chassis.
In my setup, the engine chassis is this strip of metal where the spark plug rests on, and I don't have a kill switch (I don't need one).
The signal to the kill-switch is much lower voltage (25-100V) and has some strange shape, but with some dividers and low-pass filters I've conditioned it for a digital input pin of an Arduino. The signal conditioning circuitry shouldn't matter much (see below), but I'm including it for completeness:
My device is powered by a Li-Ion battery + a 3.3V LDO.
I'm observing the following results with engine at 1000 RPM and a non-resistor spark plug:
- Arduino device not electrically connected to the engine, but physically close to the spark plug - unaffected
- Arduino electrically connected to the kill-switch signal, but otherwise far away from the spark plug - reboots continuously, essentially on every spark
- Only the grounds connected (the blue wire) - same thing, reboots furiously
If I swap the spark plug for a resistored one (Denso W20EPR-U), I'm observing
- Device close to the spark - unaffected
- Connected to the kill-switch signal - unaffected (I can read the engine RPM)
- Only grounds connected - unaffected (but of course I can't read the engine RPM)
I also have a GPS chip connected to the Arduino. It shows similar behaviour (it reboots furiously when the non-resistored spark plug is used). All chips are duly bypassed by caps. Scoping on the power rails do not reveal any glitches. The GPS, of course, has a sensitive antenna, which I guess picks up a lot of noise.
What mechanism causes the Arduino's MCU to reboot furiously when I only have the grounds connected? And why the change to a resistored spark plug fixes it so well? Also, how to protect against the non-resistored spark's nastiness? Is opto-isolation a must?
Answering clarifying questions by @glen_geek:
- the device is powered through a Li-Ion battery and a 3.3V LDO
- nothing else is connected to it
- I've included the signal conditioning circuitry
- I've added a photo of the actual setup (the device itself not shown). As you can see, the thinner wire coming out of the ignition coil goes through a couple of bullet connectors, and into a 4-wire cable. The GND from the laminations (blue wire) is in the same cable. The other 2 wires of the cable are unused. So it's not twisted pair, but it's not flying wires either.