Tricopter based on ArduCopter, yaw-issues and solutions


I just build a Tri based on ArduCopter. I had some issues with yaw and did some changes in the code. In this post I want to share my experience and I would like the developers to take my changes into the official release, that it will be easier for others to build a Tricopter.

First of all, this is the result:

One of the most interesting mechanical parts, the Yaw-Servo:

Now my yaw-issues and solutions, starting from code release 2.1:

1) Yaw-Servo not in middle position on "power on"

2) Yaw-Servo reverse with Mavlink RC7_REV

1) Yaw-Servo not in middle position on "power on"

Issue: On "power on" the Yaw-Servo moved into mechanical limit (bad sound, high current consumtion and reduced lifetime for the servo). After a few seconds it returned to the middle position.


In file "radio.pde" in function "output_min()":


    APM_RC.OutputCh(CH_7,   g.rc_3.radio_min);

By this:
    APM_RC.OutputCh(CH_7,   g.rc_4.radio_trim); // Yaw servo middle position
    APM_RC.OutputCh(CH_7,   g.rc_3.radio_min);

2) Yaw-Servo reverse with Mavlink RC7_REV

Issue: Depending on how you mount your Yaw-Servo the stabilisation of yaw can run in the wron direction. Reversing yaw on the remote doesnt help. You need to reverse the servo or change it mechanically. To reverse the servo:


In file "ArduCopter.pde" in function "fifty_hz_loop()":

    APM_RC.OutputCh(CH_7, g.rc_4.radio_out);

    APM_RC.OutputCh(CH_7, (   (-1 * (g.rc_4.radio_out - g.rc_4.radio_trim) ) + g.rc_4.radio_trim  ) );

I got this change from this Link!  Now you can reverse the yaw-servo by putting "-1" to the parameter "RC7_REV" via Mavlink.

Regards, Igor

Views: 11615

Comment by Randy on January 27, 2012 at 7:56pm


     Thanks a lot for testing.  A great help.  So this new version should appear in the AP Mission planner the next time Jason pushes out a new version.  We're definitely moving our focus towards the big refactor that will bring us to ver3 of the software..still, I suspect a new version will go out within a week based on recent history anyway.

Comment by Don Brooks on January 27, 2012 at 8:30pm

Yeah I've been following the b5 stuff. Hopefully Marco's mishap will have just been a hardware failure and not a code issue. If the release version of B5 is as stable as all the other reports seem to indicate, then I think a little while of slow development while the code is rearranged will be good.

Comment by Igor van Airde on January 28, 2012 at 3:29am

Update: I published the full source and hex file for my tricopter:

Comment by Colin on February 12, 2012 at 12:09pm

When I lift off in acro mode, my tricopter yaws to the right. Did you guys with tricopters set your yaw servo angle for 1500ms (mid stick) to be a certain angle to get acro working? Or did you manage to find some rate pid values on yaw to do the job?

When I turn the rates up the yaw servo goes nuts oscillating on the ground: it moves, which wobbles the IMU and then corrects back the other way.

I flew this frame with a KK board, with the yaw pot set to 50% and it flew like an absolute dream.



Comment by eric.stubkjaer on April 20, 2012 at 10:15pm

Got my tri flying last night. When using the KK board I ended up tilting the 2 front motors (about 7 deg) so the craft would hover in one position LEVEL. Before this the frame tilted to one side to counter the side thrust of the tail rotor which had to tilt to prevent yaw (all props spin same direction). With this frame and the APM2 the craft flew first time with default settings. Starting to tune but flys well already. I needed to add a servo reverser to correct the yaw servo direction. Am waiting for this in Ground Control but may try the software change soon.

Comment by Glenn M on April 22, 2012 at 7:18pm

I'm just setting up a tri, and need to reverse my yaw direction. In 2.5.4 I can't see the following code in arducopter.pde. Where should this be changed, and is this the best way to do it?

    APM_RC.OutputCh(CH_7, g.rc_4.radio_out);

    APM_RC.OutputCh(CH_7, (   (-1 * (g.rc_4.radio_out - g.rc_4.radio_trim) ) + g.rc_4.radio_trim  ) );

Comment by Randy on April 22, 2012 at 10:56pm


     I moved all the motors code into the AP_Motors library in 2.5.4.  So you need to go into AP_MotorsTri.cpp and change somewhere around line 129 to be this:

 // also send out to tail command (we rely on any auto pilot to have updated the rc_yaw->radio_out to the correct value)
 // note we do not save the radio_out to the motor_out array so it may not appear in the ch7out in the status screen of the mission planner
 if( _rc_yaw->get_reverse() == true ) {
  _rc->OutputCh(AP_MOTORS_CH_TRI_YAW, _rc_yaw->radio_trim - (_rc_yaw->radio_out - _rc_yaw->radio_trim));
  _rc->OutputCh(AP_MOTORS_CH_TRI_YAW, _rc_yaw->radio_out);


     I've actually checked this fix into trunk so it'll come out in the next official version and you won't need to manually upload using Arduino anymore.

     By the way, I don't actually have a Tri so I'm interested to hear if this fix works ok for you.

Comment by Glenn M on April 22, 2012 at 11:57pm

Thanks for that. I'll give it a go and report back. 

Comment by Glenn M on April 23, 2012 at 9:33pm

Hi Randy, that change of yours didn't work for me. Details of what happened are here:

Comment by Randy on April 25, 2012 at 6:21am


     I think maybe the fix is working but you've got some other issues there.  I've commented on that thread, I hope it helps. 


You need to be a member of DIY Drones to add comments!

Join DIY Drones

© 2017   Created by Chris Anderson.   Powered by

Badges  |  Report an Issue  |  Terms of Service