[Documentation] Sky Snake

Sky Snake

Experimental propulsion system for airplanes, based on mass redistribution.

An airplane flying within its flight envelope can follow a broad class of curves through space through proper actuation of its control surfaces. We will assume that our airplane is controlled so that it follows a flight path where the vertical component of the velocity of the aircraft’s center of mass is sinusoidal, i.e. the airplane flies like a rollercoaster, while staying within its flight envelope at all times.

We attach a mass to a wire hanging under the airplane. The mass can be moved up or down using a powered mechanism, i.e. a winch. The winch is controlled such that the vertical acceleration of the mass is sinusoidal, equal in frequency and 180 degrees out of phase with the airplane’s vertical velocity.

We will assume that the tension in the wire will be essentially vertically directed, sinusoidal and in phase with the airplane’s vertical motion. Integrating the scalar product of the tension vector and the airplane’s velocity vector over one period of oscillation gives the net mechanical power provided to the airplane over the course of one period. Under the given conditions, this will be a positive number, and since the vertical motion is constrained to a periodic curve, conservation of energy dictates that the net effect of the wire tension and aerodynamic forces result in a forward thrust.



Benjamin Skirlo
Saulé Magomedoviene
Svein Berge
Toni Hyyppä


  • Remote controlled glider
  • Water balloon


  • Assemble the remote controlled glider
  • Fill a water balloon to a mass equal to 50 % of the airplane’s mass
  • Build a winch capable of accelerating the balloon to 1 g vertically up and down
  • Connect the winch and airplane’s elevator to an Arduino or other microcontroller
  • Connect the remote control receiver to the microcontroller
  • Program the microcontroller to add a sinusoidal deflection to the elevator and to drive the winch with a similarly sinusoidal function
  • Adjust the phase difference and amplitudes of the two sinusoids until the plane flies




The code probably needs adapting to the specific implementation

#define HZ 60.

#define ELE_IN 12
#define ELE_OUT 6
#define WINCH_OUT 7
#define THRUST_IN 9
#define AIL_IN 8
#define AIL_L_OUT 10
#define AIL_R_OUT 11

#define F_CURVE 0.7
#define AMP_MUL_WINCH 1.
#define AMP_MUL_ELE 1.
#define PHASE -20.

unsigned long now = 0;
unsigned long dt;

void setup() {
  pinMode(THRUST_IN, INPUT);
  pinMode(ELE_IN, INPUT);
  pinMode(ELE_OUT, OUTPUT);
  analogWrite(11, 50);

void pulseOut(int pin, int pol, int us) {
  digitalWrite(pin, pol);
  digitalWrite(pin, !pol);

int calc(int ail_in, int ele_in, int thrust_in, int *pail_l_out, int *pail_r_out, int *pele_out) {
  int winch_out;
  int ele_out;
  int ail_l_out;
  int ail_r_out;

  float phi = (float)now / 1e6 * 2. * PI * F_CURVE;
  ele_out = ele_in + AMP_MUL_ELE * thrust_in * sin(phi);
  winch_out = AMP_MUL_WINCH * thrust_in * sin(phi + PHASE * PI / 180.f);

  ail_l_out = ail_in;
  ail_r_out = -ail_in;

  *pele_out = ele_out;
  *pail_l_out = ail_l_out;
  *pail_r_out = ail_r_out;
  return winch_out;

void limitoutput(int pin, int value) {
  value += 1500;
  if (value<0)
    value = 0;
  if (value>3000)
    value = 3000;
  pulseOut(pin, 1, value);

static int thrust_zero = -999;

void loop() {
  int ail_in = pulseIn(AIL_IN, 1)-1500;
  unsigned long last = now; // do this afer reading first channel
  now = micros() - ail_in;
  dt = now - last;
  int ele_in = pulseIn(ELE_IN, 1)-1500;
  int thrust_in = pulseIn(THRUST_IN, 1);

  if (thrust_zero == -999)
    thrust_zero = thrust_in;
  thrust_in -= thrust_zero;

  int ail_l_out;
  int ail_r_out;
  int ele_out;
  int winch_out = calc(ail_in, ele_in, thrust_in, &ail_l_out, &ail_r_out, &ele_out);

//  unsigned long t2 = micros();
//  unsigned long dt = t2 - now;
//  delayMicroseconds(4000-dt);

//  Serial.println(winch_out);

  limitoutput(WINCH_OUT, winch_out);
  limitoutput(ELE_OUT, ele_out);
  limitoutput(AIL_L_OUT, ail_l_out);
  limitoutput(AIL_R_OUT, ail_r_out);


Introduction to flapping wing design

Next iterations

The motor controller used to control the winch engine does not provide external access to a positional feedback and we had no other positional feedback system. This led to a lack of control over the weight’s position under the plane. A feedback system or programmatic control over the motor coils must be implemented.


Probabry you already know but here is another projects might be helpful.

Festo SmartBird

Festo eMotionButterflies