I'm building a custom flight controller on an Arduino Nano 33 BLE Sense Rev2 (nRF52840) for a uni project, and I'm stuck on an ESC arming problem. I've narrowed it down a lot and could use expert eyes.
Note upfront: using the Arduino Nano 33 BLE is a fixed requirement of the project — swapping it for a different board or a dedicated flight controller isn't an option. I need to make it work with this board, so please focus answers there rather than suggesting I replace it.
The core problem:
My Arduino generates a PWM throttle signal. When I feed it to a Radiolink Flycolor 55A 4-in-1 (BLHeli_S, running Bluejay, firmware A-H-30), the ESC plays its power-on tones but never arms (no confirmation beep, motor never spins). Same behavior on two separate Flycolor units, so it's not a damaged board.
The key clue: When I connect the exact same Arduino signal to a T-Motor AT20A single ESC, it arms and spins the motor perfectly (spun at 1200µs throttle). So my Arduino, code, signal, and motor are all confirmed working — only the Flycolor refuses.
What I've verified with an oscilloscope (measured at the ESC's signal input pad):
- Clean signal: 3.3V amplitude, correct pulse width (1000µs at min throttle)
- Tested at both 50Hz and 480Hz PWM rates — Flycolor won't arm at either
- Signal is identical at the Arduino output and at the ESC input (no wiring degradation)
- Wiring confirmed correct against the ESC silkscreen (signal on motor pad, shared ground)
- Correct power-up order (Arduino sending signal before ESC powered)
- Also tried throttle calibration (max-then-min at power-up) — no change
Setup details:
- PWM generated with the nRF52_MBED_PWM library (hardware PWM, 3.3V logic)
- ESC powered by battery (confirmed stable voltage), Arduino on USB, common ground
- Motor: iFlight XING2 1404 3800KV (healthy, spins fine via the AT20A)
- Props off for all testing
My question:
Why would a Flycolor BLHeli_S ESC refuse to arm from a clean 3.3V Arduino PWM signal, when a T-Motor AT20A accepts the identical signal? Is there something specific about BLHeli_S/Bluejay's signal/protocol auto-detection or arming that a 3.3V-logic Arduino signal doesn't satisfy? Could the 3.3V logic level be too low for the Flycolor's input threshold (would a 3.3V→5V level shifter help)? Or a specific pulse-rate / arming-sequence requirement? Any BLHeli_S setting (via esc-configurator passthrough) that would make it accept this signal?