Ghost Rider FPV

Thirty-two days, three steering mechanisms, and a child skeleton on fire

  • 2nd Prize — Instructables Halloween Contest 2024
  • Featured on Hackaday

2024 Runtime 16:50

I’m Dan and I have a problem.

Halloween in the suburbs is lame. I wanted to fix that, and I wanted to fix it with skulls and fire, because that is on brand for me. But “make a scary thing” on its own is not a project — it’s a decoration. I wanted to come out the other side knowing something I didn’t know going in.

What I didn’t know was RC. I’d been an ESP32 guy for years, one of those Arduino nerds, and I kept watching the RC and FPV people have a kind of fun that I wasn’t having. So the brief became: servos, FPV, high-current motor drivers, and the iconic Barbie Power Wheels sitting unused in my garage.

It was September 28th. Thirty-two days until Halloween.

When I told my friend Thomas from Mellow Labs that I could get this done in a month, he was patronizing about it. Keep him in mind. He comes back.

Reading the remote

I wasn’t worried, because step one was already solved in my head. An RC receiver will happily tell you what the transmitter is sending over a protocol called iBus, and an ESP32 can read that on a second UART. In nerd terms: I can intercept everything the remote says and then decide for myself what it means.

In practice it means you plot the channels and watch the joysticks turn into dancing lines. I am not going to pretend that wasn’t the most satisfying moment of the first week.

Those dancing lines are the whole project. Everything after this — motors, steering, a skull that looks around, propane — is just deciding what each line is allowed to do.

The Power Wheels problem

Stock Power Wheels are dumber than you’d think, and I mean that admiringly. Twelve volts go to both motors and that’s it. Full current forward or full current reverse, selected by what is technically a single-pole double-throw switch but is really just a piece of plastic that shoves metal onto metal. There is no in-between. There is no slow.

I wanted slow. I wanted to creep it down a driveway and then punch it — Legend of Zelda analogue-stick control, where how far you push is how fast you go.

That meant real motor drivers. I used two BTS7960 boards, one per motor, and made a little bridge so both take the same PWM signal. Then I got the ramp working on the bench: duty cycle climbing slowly, motor spinning up smooth instead of slamming.

It doesn’t look like much on camera. It was huge. Once speed control works, the project stops being a maybe.

Then I took the iBus interpreter and the motor driver code, put both in a blender, and asked ChatGPT to make them agree with each other. That worked, and I’m not going to be precious about admitting it.

Three steering mechanisms

Steering is where I got humbled.

The ESP32 has a genuinely nice library called MCPWM for driving servos, and once I stopped making them vibrate at random I could point them wherever I wanted. So the plan was obvious: put a pulley on the servo, a pulley on the steering shaft, run a GT2 timing belt between them. Trivial. I am, after all, a machinist god.

Version one didn’t work at all. The mount bent forward under load. The belt skipped every step. The servo’s own output shaft was flexing. The aluminium was flexing. There was no single thing to fix, because everything about it was wrong.

Version two got better brackets and some genuinely craptacular aluminium welds, and then popped out and slipped anyway.

Version three finally held the steering shaft where I put it.

The useful part wasn’t the third version. It was that by then I actually understood belt tension — which is why every belt-driven thing later in this build has a slot to slide in and a grub screw to lock it down. I stopped designing mechanisms that assume the belt is already the right length.

A driver, and then a better skull

An unmanned Power Wheels rolling down the street is fine. One with a skeleton driving it is better. I named him Little Timmy, and he has been on the channel ever since.

October 13th. The first skeleton I bought looked wrong and it took me a while to work out why: it wasn’t a child’s skeleton, it was a small adult’s skeleton, which reads completely differently and not in a good way. I ordered an anatomically correct child skull instead. That sentence is going to look bad out of context, and I’ve made peace with it.

Then, because a passenger isn’t enough, I decided Timmy should look around — and that I should be able to see what he sees. FPV camera in the eye socket. Drive the thing from the far end of the street, looking through a skeleton’s face.

That’s two more servos and a pan-tilt mechanism that has to fit inside a skull without being visible. I machined a housing with a radial bearing and a thrust washer, put a pulley on the shaft, and built the tension slot I’d learned the hard way that I needed. Assembling it means reaching in through the eye socket with a screwdriver, which feels a great deal like neurosurgery.

The pan axis runs down through Timmy’s rib cage, so his whole head turns on his spine rather than swivelling on a visible post.

Seventeen days out, right as I was getting discouraged, Thomas texted again to say his decorations were already up and I had quite a bit of work left. Thank you, Thomas. Genuinely.

Fire

I’d done propane and high-voltage igniters before, so I assumed this part would be easy. It mostly was.

I bought two metal decorative skulls, on the grounds that why buy one metal skull when you can buy two for twice the price. The listing said cast iron. It welded like mild steel, so I closed the top, cut an opening, and tapped in a ¼-inch NPT nipple.

Propane comes in through a 12 V solenoid with a needle valve for flow. The first bench test produced considerably more fire than I was expecting, which I mention because my wife’s only note on the entire project was asking whether the flames could be higher.

Two GPIO pins — 18 and 19 — drive two relays: one for the propane solenoid, one for the arc generator that lights it. The skull already had ventilation holes, which saved me drilling any.

Does it survive contact with reality

Something always breaks. The only real question is whether it’s mission-critical or merely annoying.

Everything went into the engine compartment, the head got secured with a layer of silicone, and on the first live run my wife came out to film it and to ask what the hell I was doing. Her verdict, on camera: my husband is a ridiculous person.

It drove. It steered. The head tracked where I looked. The skull threw fire on command. The neighbourhood kids lined up to ask Timmy yes-or-no questions and then chanted for the flames, which is the single best outcome I could have asked for.

October 31st, 5:58 a.m., I finished cutting the final footage. Thirty-two days, start to finish, and Thomas can suck it.

What I’d tell you if you’re building one

  • Start with the receiver, not the vehicle. Once you can read iBus reliably, everything downstream is a decision instead of a problem.
  • Budget for three versions of any belt drive. Not because belts are hard, but because tensioning them is, and you won’t design the adjustment in until you’ve been bitten.
  • A 35 kg·cm servo is not a lot of torque against a steering shaft with a child’s weight on the front axle. Gear it down and let the belt do the work.
  • Put the fire on its own relay and its own switch. Propane and “I’ll just try one thing” should never share a circuit.

Files & Sources

The Stack

control FlySky FS-i6X → iBus over UART → ESP32
drive 2× BTS7960 43A motor drivers
steering 35 kg·cm servo, GT2 belt and pulley (v3)
vision FPV camera in the left eye socket, pan-tilt on two servos
fire 12 V propane solenoid + HV arc generator on GPIO 18/19
fab TIG-welded aluminium, machined bearing housings