Any flight controller that can support a standard bicopter configuration will get you all the way up to manual flight, maybe even some level of position hold using GPS. I do not have enough experience with these flight controller options, so making it work is your responsibility and I can't offer any further assistance!

I personally use and recommend my opensource flight controller dRehmFlight VTOL, which runs on a Teensy 4.0 microcontroller and uses easy to understand Arduino code. You will need to configure the control mixer yourself to accommodate the bicopter mixing, and configure PID controller gains for this platform. If this sounds too difficult or you are already confused, this project is probably not for you.

"Clean" code and more details: https://github.com/nickrehm/dRehmFlight

Bicopter mixing in the controlMixer() function within dRehmFlight looks something like this:

m1_command_scaled = thro_des + roll_PID; //left motor
m2_command_scaled = thro_des - roll_PID; //right motor

s1_command_scaled = 0.5 + yaw_PID - pitch_PID; //left servo
s2_command_scaled = 0.5 + yaw_PID + pitch_PID; //right servo

//all other motors and servos zeroed

Control gains that worked well for me, using the controlANGLE() controller:

float Kp_roll_angle = 0.4;    //Roll P-gain - angle mode 
float Ki_roll_angle = 0.3;    //Roll I-gain - angle mode 
float Kd_roll_angle = 0.07;   //Roll D-gain - angle mode (has no effect on controlANGLE2) 
float B_loop_roll = 0.9;      //Roll damping term for controlANGLE2(), lower is more damping (must be between 0 to 1)
float Kp_pitch_angle = 0.7;   //Pitch P-gain - angle mode 
float Ki_pitch_angle = 0.3;   //Pitch I-gain - angle mode 
float Kd_pitch_angle = 0.055; //Pitch D-gain - angle mode (has no effect on controlANGLE2) 
float B_loop_pitch = 0.9;     //Pitch damping term for controlANGLE2(), lower is more damping (must be between 0 to 1)

float Kp_yaw = 0.05;          //Yaw P-gain
float Ki_yaw = 0.2;           //Yaw I-gain 
float Kd_yaw = 0.00015;       //Yaw D-gain (be careful when increasing too high, motors will begin to overheat!)

I will include the lidar and optical flow sensors in the parts list below for completion, but I am offering no support for the level of functionality shown in my video. The stock dRehmFlight code does not natively support these sensors or the autonomous altitude and position hold functionalities. You will need to do the implementation for this yourself, and it is not easy. That said, the simple bicopter code modifications shown above are all you need to do for fun, manually controlled flight.


All of the links above are Amazon affiliate links. I receive a small commission for every product purchased at absolutely no cost to you.


.STLs are included in the 'Files' section of this page with required quantities listed in their file names. PLA, PETG, or ABS plastic will work just fine. The back cover may be printed in LW-PLA to reduce weight.

Solid infill:

  • 4mm_collar_X2
  • motor_shroud_X2
  • tilt_horn_X2
  • phone_interface_X1

30% infill:

  • body_X1
  • backplate_X1

Chances are, the phone_interface piece will not fit your particular phone / phone case. This is why it was designed as a separate part, so you...

Read more »