Back

Active Variable Incidence Wing System

A rear wing that reads the car's acceleration and moves itself between three aerodynamic modes.

Try it out.

Cruise +5°
Debouncing
0
mph
Airspeed over the section slow fast
Longitudinal acceleration 0.00 g
−1.0 g0+1.0 g
0 N
Downforce at this speed
0 N
Drag at this speed

The numbers.

Three modes, chosen by the accelerometer.

Every angle was simulated in Autodesk Fusion CFD before anything got printed. The plots are the airflow through the wing at each one.

CFD streamlines at minus 5 degrees: flow stays attached and almost undisturbed
Neutral −5°

Under throttle: the wing lies almost flat so it is barely fighting the air. The least drag of the three, which means quicker acceleration and a higher top speed.

88.4 N
Downforce
9.4 N
Drag
CFD streamlines at plus 5 degrees: flow bends around the wing but stays attached
Cruise +5°

Holding a steady speed: a small angle buys real grip for almost no drag. Ten times the downforce of neutral for less than a newton more, which makes this the efficient one.

882.4 N
Downforce
10.3 N
Drag
CFD streamlines at plus 40 degrees: flow separates off the upper surface into a large slow wake
Airbrake +40°

Under braking: the wing stands up into the air and becomes a brake. Maximum downforce to plant the car, plus a wall of drag that helps slow it down.

1,708.8 N
Downforce
262.0 N
Drag

What the simulation actually said.

Downforce by mode
Newtons at 30 mph. Higher is more grip.
Neutral
88.4 N
Cruise
882.4 N
Airbrake
1,708.8 N
Drag by mode
Newtons at 30 mph, on its own scale. Neutral and cruise are almost the same; the airbrake is 25 times either of them.
Neutral
9.4 N
Cruise
10.3 N
Airbrake
262.0 N
Full CFD result set. Downforce-to-drag ratio is the efficiency figure: higher means more grip per unit of drag.
ModeAngleTrigger Downforce (N)(lb) Drag (N)(lb) D/D ratio
Neutral −5°accel > +0.09 g 88.419.99.42.19.4 : 1
Cruise +5°|accel| < 0.07 g 882.4198.410.32.385.7 : 1
Airbrake +40°decel > 0.07 g 1,708.8384.1262.058.96.5 : 1

Swipe the table sideways for the rest of the columns.

All three runs at a 30 mph (13.4 m/s) inlet, air at standard conditions (ρ 1.205 kg/m³, μ 1.817×10⁻⁵ Pa·s), steady-state incompressible, k-epsilon turbulence with mesh refinement at the wing surface. Reynolds numbers ran 772,398 at +5° to 1,153,020 at +40°, fully turbulent across every case. Forces taken from the fluid-forces-on-walls output.

Cruise is the mode that earns its keep.

Opening from neutral to cruise multiplies downforce roughly tenfold and costs under a newton of drag. The full sweep to the airbrake is the dramatic one, 1,620 N more downforce and 253 N more drag end to end, but that angle only runs while you are actually on the brakes. The car spends most of its life at cruise, so that is the angle that has to be worth having.

How I built it.

Why the wing has to move.

Downforce and drag pull against each other. Set a wing up for grip through a corner and it holds the car back down the straight. Set it up for a low-drag top speed and it gives you very little when you actually need the rear planted. Every fixed wing bolted to a car picks one point on that trade and stays there for the life of the car.

This one does not pick. An accelerometer on the wing reads how hard the car is accelerating or slowing, and the wing moves to the angle that suits what the car is doing right then: flat under throttle, a shallow angle at cruise, and fully up under braking.

1,400 mm
Span, tip to tip
3
Autonomous modes
−5° → 40°
Angle of incidence
1,620 N
Downforce swing across the range
20 Hz
Control loop
0
Wires into the car
The finished wing mounted on the trunk lid of a black BMW E93, seen from behind

The finished system on the development car. The whole assembly (wing, brackets, servos, electronics and its own battery) mounts to the trunk lid on suction cups and comes off without leaving a mark.

The profile had to make downforce at a shallow angle.

The section started as a standard cambered airfoil, mounted inverted so the pressure differential works downward. It was then modified: more curvature on the upper surface to accelerate the flow and drop the static pressure, and a flatter lower surface to hold a higher-pressure region underneath.

Initial cambered airfoil cross-section sketched in CAD
Initial section. A standard cambered profile, inverted.
Revised airfoil cross-section with increased upper-surface curvature
Final section. Upper curvature increased, lower surface flattened, for a larger pressure asymmetry at the same angle.

1,400 mm of span, in three aerodynamic sections.

A 900 mm centre section carries the constant profile and does the bulk of the work. Either side of it, a 250 mm outboard section lofts from the centre profile at its inboard end to a higher-angle profile at the tip. That puts more downforce toward the tips and improves spanwise load distribution, with no hard geometric break to trip the flow.

Endplates close both tips. They stop high-pressure air migrating around the wingtip to the low-pressure side, which is what generates induced drag and bleeds away effective lift. They also double as the structural mounting interface, with M3 heat-set inserts moulded straight into the print so nothing needs a nut on the back face.

The 900mm central wing element extruded in CAD
Centre element. 900 mm at a constant section.
The 250mm outboard section showing its lofted transition geometry
Outboard section. 250 mm, lofted between two profiles.
Endplate CAD showing mounting hole layout
Endplate. Aerodynamic fence and mounting interface in one part.
The finished wing assembly in CAD with both endplates attached
The finished assembly in CAD, endplates on, before a single part was printed.

The plan was foam and fibreglass. It didn't survive contact.

The original fabrication route was XPS foam: hot-wire the profile using printed templates pinned to each face of the block, stack the slices, fair the surface against a printed two-part female mould, then laminate it in 4 oz fibreglass and marine epoxy.

It got abandoned before it started. Hot-wire cutting is only as good as the hand guiding it, and any deviation propagates through every slice in the stack. Fairing foam to a CAD-defined profile is slow and has no guaranteed dimensional accuracy, and lamination adds its own variables on top.

A 3D printed cross-section template for hot-wire cutting foam
The road not taken. A printed 10 mm profile template, made to guide a hot wire through an XPS block.
A wing section being printed on an FDM 3D printer
What happened instead. Every part printed straight from the CAD geometry at 5% infill, three walls.

Switching to FDM traded mass for precision, and the trade was worth making. Every part comes off the bed as the CAD file drew it, and the features that would have been miserable to build into a foam core (hinge bores, dowel holes, heat-set insert pockets, servo mounting geometry) are simply part of the print. PLA for the structural components, chosen for dimensional stability and stiffness at these speeds.

Printed in 200 mm pieces, then welded into one.

No consumer printer swallows a 1,400 mm span, and a monolithic wing would mean reprinting the whole thing to fix any part of it. The centre element is split into 200 mm modules, joined on 10 mm dowel pins in bored holes on each mating face. The dowels hold spanwise alignment and carry shear across the joint, so the assembly loads as one continuous element instead of a chain of segments.

Then every external seam was plastic welded: a soldering iron run along the joint melts and intermixes the PLA on both sides, fusing the modules into a single structure. Dowels do alignment and shear; the weld does continuous spanwise rigidity.

A printed outboard wing section with its angled lofted geometry
An outboard tip section, straight off the printer.
Close-up of a plastic welded seam between two wing modules
A welded seam between two modules, fused along its length.
A printed support bracket held in hand, showing its open lattice structure
A support bracket. The open lattice is where the wiring lives.
The fully assembled and welded 1400mm wing element with endplates, on the floor
All 1,400 mm of it, assembled and welded, before mounting.

Direct drive, because a pushrod would flex.

Two DS3218 servos, rated 20 kg·cm stall at 6 V with full metal gears, sit in pockets in the support brackets with their output shafts on the wing's hinge axis. Metal gears were non-negotiable: aerodynamic hinge moment scales with the square of velocity, and at highway speed a wing this size will strip or back-drive the plastic gears in a hobby servo like an SG90 rated at 1.8 kg·cm.

The servos drive the wing through a custom-designed horn rather than a generic one, to kill the angular slop that shows up when an off-the-shelf horn meets a third-party spline. Direct drive was chosen over a pushrod linkage because a slender rod resisting that hinge moment is a buckling risk exactly when you need it most: in the airbrake position, at maximum load.

CAD close-up of the actuation mechanism, servo and hinge axis
The mechanism. Servo pocket, hinge axis and horn, with the electronics recessed into the bracket body.
CAD view of the wing pitched to its 40 degree airbrake position
Fully deployed. The wing at its +40° airbrake stop, the top of a 45° sweep and well inside the servo's 270° range.
CAD render of the complete assembly: wing element, both support brackets and the servos
The whole system, as drawn. Wing element, both support brackets, servos and electronics. Everything that goes on the car, and nothing that goes in it.

Five components, and reasons for each.

The brief for the electronics was the fewest parts that would do the job reliably. An ESP32 has more of everything, but a single-axis loop with two inputs and one output doesn't need dual cores or WiFi, and reliability scales inversely with part count. The whole assembly is recessed into the bracket's lattice rather than boxed separately, wiring zip-tied at intervals so nothing moves under vibration.

Microcontroller
Arduino Nano. 5 V logic, hardware I²C, PWM. Talks to both the IMU and the servos with no level shifting.
Sensing
GY-521 (MPU-6050). 3-axis accelerometer and gyro over I²C. Only the longitudinal axis is used; the other five are there for the lateral version.
Actuation
2 × DS3218. 20 kg·cm, metal gears, mirrored either side of the hinge and commanded to supplementary angles so they turn the wing the same way.
Power
LM2596 buck, 12 V → 5 V. A linear LM7805 would burn the 7 V differential as 3.5 W of heat in a sealed housing; the switcher runs 77–92% efficient.
Source
12 V jump-start pack. Low internal resistance, so it holds voltage through servo current transients where alkalines sag.
Decoupling
100 µF + 100 nF. Bulk storage for actuation surges, plus a low-ESR ceramic for the megahertz switching noise the electrolytic can't touch.

One deliberate detail: the servos are fed straight from the buck output rather than through the Nano's onboard 5 V pin. A loaded DS3218 can pull over an amp, which the Nano's regulator is not rated to supply, so routing around it removes an entire failure mode.

The assembled electronics mounted in the wing bracket with wiring routed through the lattice
Built into the bracket. Red is 5 V, black and brown are the common ground, yellow and orange carry servo PWM.
Full circuit schematic showing the Nano, MPU-6050, servos and buck converter
The circuit. Servo power and logic power split at the buck output; I²C on A4/A5, servo signals on D5 and D6.

A three-state controller, and a one-second fuse.

01
Read

Raw 16-bit accelerometer over I²C, divided by 16,384 for the ±2 g full-scale range.

02
Correct

Subtract a 0.07 g offset: gravity bleeding into the longitudinal axis from an imperfect mounting angle, measured stationary and level.

03
Filter

Ten-sample moving average in a circular buffer, to kill engine vibration, road inputs and buffeting off the wing itself.

04
Debounce

A new mode has to hold for a full second before it's executed. Any reversion resets the timer.

accel > +0.09 g

Neutral, −5°. Under throttle, get out of the way.

|accel| < 0.07 g

Cruise, +5°. Holding speed, hold baseline downforce.

accel < −0.07 g

Airbrake, +40°. Braking, deploy everything.

The loop polls at 50 ms, a 20 Hz update rate. That's far faster than it needs to be: aerodynamic loads on a street car shift over hundreds of milliseconds, and the one-second debounce, not the polling rate, is what actually sets how quickly the wing responds. The filter itself adds about 500 ms of lag, which sits comfortably underneath that.

Bench first, then a real road.

On the bench: an I²C scan to confirm the MPU-6050 at address 0x68, each servo driven individually and then together to verify the mirrored position logic, the IMU tilted by hand along each axis to identify the longitudinal one, and the filter checked by tapping the sensor to confirm brief impulses didn't cross a threshold.

Then the whole thing went on the trunk lid of a 2011 E93 on suction cups, chosen precisely because they leave the car untouched and move to any other car without refabricating anything. A laptop ran into the cabin on a USB lead for live serial, and a GoPro on the roof watched the wing.

Driver's-eye GoPro view of the wing mounted on the trunk while driving
The GoPro feed. A continuous record of the wing actuating, to check mode changes landed at the right points in the acceleration profile.
A laptop in the passenger seat showing live g-force readings from the IMU
Live calibration. Serial output in the passenger seat. This is how the 0.07 g offset and both thresholds got tuned on the road rather than the bench.

It worked. The wing flattened under throttle, settled back to cruise at steady speed, and deployed fully under braking, at the points in the acceleration profile it was supposed to. The one-second debounce turned out to be the critical detail. Earlier firmware without it hunted between modes on road undulations, gear changes and small throttle inputs. The thresholds proved sensitive enough for ordinary street driving without needing to be provoked. The suction mount didn't move.

The wing mounted on the car during an on-road test run through a neighbourhood
On the road, mid-test.

And then something broke.

The fractured connecting arm, showing the failure at a thin structural section
The failure. A thin cross-section that should have been thicker, with a sharper fillet than it should have had.
A design deficiency, not a dead end.

This is a part-level mistake with a part-level fix, and it is first in the queue for the next revision: more wall thickness at the failure location, a larger fillet radius at the stress concentration, and probably CF-PLA for that one component to buy stiffness without much mass. Nothing about the architecture needs to change.

Where it goes from here.

The architecture was drawn with the second axis in mind from the beginning, which is why the IMU's full six degrees of freedom are read even though the controller currently uses exactly one of them.

Built solo, in a week, with a consumer 3D printer and off-the-shelf parts. The core system works, the one failure mode is understood, and the next iteration is already specified.

Interested in building one? The full how-to guide: CAD and print settings, the wiring, the firmware, and how to calibrate it on your own car.