Boomerang FPV Drone

A unique flying machine that spins.

Background

In 2022 I built the Gyropter. It used a mechanical pitch/roll control system which required three servos, ailerons on the wings, and an elaborate linkage system. It also requires that the control platform be very rigid -- two stacked ball bearings were needed -- as it must exert force to actuate the ailerons. I wanted to build a smaller version but it was inherently hard to scale down.

This model uses a different control scheme with many fewer parts: the three motor throttles are electronically modulated in the same direction the ailerons would move, spinning up and down as they move from one side to the other.

This scheme eliminates the servos and linkages and allows the gyrostabilized platform to run on a single ball bearing, and only requires a relatively tiny sensor to measure the rotor angle. It does, however, require a fancier electronic control system compared to the gyropter, which was just a swashplate helicopter from the flight controller's perspective.

Construction

STLs on Printables

FPVBoomerang3D.zip (6.2M)

The 3d prints require ~160 grams of standard PLA on one 256mm^2 plate. The wings are printed on their leading edges and mouse-ears have been added at the root, tip, and landing gear strut.

The wings were printed with 1 wall loop and low infill ratio; the other parts were printed with 2 wall loops. The platform and pinion were printed at higher quality to improve the gear mesh.

The wings attach to the hub by dovetail then are secured with cyanoacrylate glue. The bearing is captured in the hub by a clip which is also glued in. The yaw motor mount and power plug mount blocks screw to the bottom of the hub with 4x ~2mmx8mm screws.

The landing gear are 0.062" music wire with a 90 degree rotated z bend and secured into the struts with a small zip tie. The wheels use an o-ring for the tire and are held on by .062 shaft collars.

The motors should be screwed in gently. The wing print is very thin.

The wing and hub contain several tiedown loops for the motor and wingtip LED wiring to be laced with 100lb kevlar cord. (A folded over and curved length of 28awg solid wire-wrap was used as a threading tool.)

Battery/ESC/Wiring

The slip ring module is key to operation. Its leads are cut to length and terminated with the same JST-PH-8 connectors used for the normal FC-ESC cable, shown here for comparison.

The slip ring is rated for 250 RPM and is therefore operated at 200% of its rating during hover. Do not expect longevity.

The slip ring clip holds the slip ring capsule at the center axis of the gyrostabilized platform and is important because if the capsule is allowed to nutate it will stress its leads.

The motor and power blocks contain four matching holes that will enclose four 3mm carbon square extrusions. (bamboo skewers might also work.)

Control

To the right of the flight controller embedded in the platform is an optointerrupter sensor which engages an encoder ring printed into the hub.

The hub encoder ring has 24 evenly spaced tabs. Each tab is 5° wide except for the tab adjacent to wing #1 which is 10° wide. The solid ring printed on top improves durability.

Firmware Mods

The "interesting" parts are shown here. See github for full diff.

The first firmware modification adds a 'rotor' sensor which interprets the signal to determine the rotor angle.

// Excerpt from inav/src/main/sensors/rotor.c:

typedef struct rotor_s {
  extiCallbackRec_t callback;
  IO_t io;
  timeDelta_t fall, rise, width, interval, bigtick;
  int currentTick, circleTicks;
  int rpm;
} rotor_t;

#define US_PER_MINUTE 60000000
void rotorCallback(rotor_t *r) {
  timeDelta_t t = micros();
  // This can be negated depending on the sense of your opto sensor.
  if (!IORead(r->io)) {
    r->rise = t;
  } else {
    timeDelta_t width = t - r->rise;
    r->currentTick++;
    // Was big tick?
    if (width * 2 > r->width * 3) {
      r->circleTicks = r->currentTick;
      r->currentTick = 0;
      r->rpm = US_PER_MINUTE / (t - r->bigtick);
      r->bigtick = t;
    }
    r->width = width;
    r->interval = t - r->fall;
    r->fall = t;
  }
}

static void rotorInitX(IO_t io, rotor_t* r) {
  EXTIHandlerInit(&r->callback, (extiHandlerCallback*) rotorCallback); 
  EXTIConfig(io, &r->callback, 1, EXTI_Trigger_Rising_Falling);
  EXTIEnable(io, 1);
  r->io = io;
  r->circleTicks = 2;
}

static int rotorAngleX(rotor_t *r) {
  timeDelta_t interval = micros() - r->fall;
  if (interval > r->interval) {
    // expected another tick by now.  assume it's exactly there.
    return ((r->currentTick + 1) % r->circleTicks)
           * 360 / r->circleTicks;
  } else {
    return r->currentTick * 360 / r->circleTicks +
           interval * 360 / r->circleTicks / r->interval;
  }
}

static int rotorRPMX(rotor_t* r) {
  return r->rpm;
}

Additionally the target must be modified to select the rotor pin:

// Added to src/main/.../target.h:
#define USE_ROTOR
#define ROTOR_PIN PA0
The second firmware modification adds an alternative mixing mode used for the BOOMERANG platform type:
// Excerpt from inav/src/main/flight/mixer.c:

// motors for non-servo mixes
for (int i = 0; i < motorCount; i++) {
  if (STATE(BOOMERANG)) {
    // Note: yaw always stabilized; pitch/roll always raw. 
    rpyMix[i] = currentMixer[i].yaw * axisPID[YAW] +
                currentMixer[i].pitch * (
            -mulCosDegApprox(angle + 360 * currentMixer[i].roll, rcCommand[PITCH]) +
            mulSinDegApprox(angle + 360 * currentMixer[i].roll, rcCommand[ROLL]));
    } else {
    // (The standard mixing code for multirotors:)
    rpyMix[i] =
        (input[PITCH] * currentMixer[i].pitch +
        input[ROLL] * currentMixer[i].roll +
        -motorYawMultiplier * input[YAW] * currentMixer[i].yaw) * mixerScale;
    }
    if (rpyMix[i] > rpyMixMax) rpyMixMax = rpyMix[i];
    if (rpyMix[i] < rpyMixMin) rpyMixMin = rpyMix[i];
}

The standard Boomerang mixing table is shown below.

MotorThrottleRollPitchYaw
1 1 0 1 0
2 1 0.331 0
3 1 0.661 0
4 0.01 0 0 -1

Throttle works normally and is 1 for the prop motors and nonzero for the pinion motor. (inav seems to delete zero throttle motors.) Yaw works normally and is only applied to the pinion motor.

Roll and Pitch are altered: they indicate the phase and amplitude of cyclic modulation. Note that 0-1 is used for 0-360° because the configurator clamps values to +/- 2.

CONFIGURATOR CHANGES PLATFORM_TYPE BACK TO MULTIROTOR.

It can be fixed in CLI with "set platform_type = BOOMERANG".

Pitch and Roll PIDs are not currently used.

Yaw PIDs should start at P=10 I=10 D=0. That is, small.

There are a few other minor changes to add the boomerang platform type.

An inav branch with these changes is available on Github. The standard inav build instructions should apply.

The exact image used for the Mamba Mini MK2 is also available: inav_8.0.1_FURYF4OSD_BOOMERANG.zip.

LEDs

The prints contain places for six standard 5mm LEDs: port, starboard, and aft nav light positions on the gyrostabilized platform, and wingtip positions on the three wings.

The nav LEDs can be powered by 5v outputs on the FC. The wingtip LEDs only have the ESC voltages available, but three blue/white LEDs can be run in series off 3S with an appropriate resistor. The wingtip LEDs were operated at the maximum rated current.

Flight Characteristics

As flown the boomerang has a 5.3 oz/ft^2 disc loading. For comparison placing the same 68g battery on a 4" LR quad, the disc loading is 22.4 oz/ft^2. As a result it is efficient in hover but also very slow and easily affected by wind.

The yaw motor cannot operate at low speed, so the boomerang must be spun up to 50-100 RPM before gyrostabilization occurs.

When spinning on the landing gear, pitch/roll inputs should be reversed. This is due to the way the flight controls operate: forward pitch is accompanied by aft thrust. In flight, the forward pitch will eventually dominate; but on the ground when the rigid landing gear constrain attitude, the thrust component prevails.

At 363 grams, hover in ground effect was achieved at ~330 RPM, and hover several feet higher required ~500 RPM. The ground effect is extremely strong.

Note that while the reverse thrust effect is overcome in flight, it does not actually go away; this is the main reason the boomerang is so inefficient moving.

During this test flight, yaw stablization was not working reliably, and three of the twelve encoder ticks were later discovered to be broken off, resulting in degraded control. (This was before the top ring was added and the number was doubled to 24.) For that reason the test pilot is having some difficulty controlling it.

3d Views

Parts List

QtyDescription
uxcell 6703ZZ Deep Groove Ball Bearing Z2 17mm x 23mm x 4mm Double Shielded
Taidacent Mini Cap Conductive Slip Ring (OD6.5mm 8way 1A)
4 HGLRC Specter 1804-3500KV 4S Brushless Motor
3 HQProp T4X2X3 Grey FPV T-Mount
Diatone Mamba F405 Mini Mk2 F30 Mini 2-5S 20x20 Stack/Combo
Note: actual stack used but no longer available.
SpeedyBee F405 Mini Stack BLS 35A 4in1 ESC
Note: currently available suitable replacement.
Team Blacksheep Crossfire Nano RX
RushFPV Tank Ultimate Mini FPV Video Transmitter
RunCam Micro Eagle FPV Camera
6 5mm LED -- assorted colors
~160g Grey 3D Printing PLA Filament 1.75mm 1kg - PolyLite
~36" Kevlar Braided String Utility Cord 200Ft 100Lb
~72" 28 awg Silicone Electrical Wire Cable 7 Colors
Tattu 850mAh 11.1V 45C 3S LiPo Battery Pack with XT30 Plug