I’m working on a Quadcopter for my senior design in electrical engineering (this is the last semester). There are two problems with this, my professors don’t allow me to use an already made code or share my code so this makes it a little bit difficult to ask for help, but I’m going to try to explain my program as much as I can. This might also work as a guide to anyone trying to make their own program. (I’m using an arduino mega)

Right now, I’m having a lot of problems getting my PID coefficients to work. (I hope that’s the only thing I need) I’m using http://www.sparkfun.com/products/9431 6 DOF 2 gyros 1 accelerometer to get my pitch and roll angles (I also have a magnetometer to measure the yaw but I’m not implementing that yet). In order to get the angles I multiply the gyro reading times the difference of the time and to get the angles from the accelerometer I use trigonometric functions (accelerometers give the vector of the acceleration and you have to get the X and Y angles from that vector).

After calculating the angle from the gyroscope and accelerometer I use a kalman filter to mix both signals, you need to combine them because a gyro keeps increasing its error with time and the accelerometer is too noisy and gives wrong readings in certain occasions. I used to have a complementary filter but I think the Kalman filter works better, the complementary filter is only an equation: compAngleX = (0.98*(compAngleX+(gyroXrate*dtime/1000)))+(0.02*(accXangle)). I’m using almost the same script as this one: http://arduino.cc/forum/index.php/topic,58048.0.html great project and guy by the way very helpful.

After the kalman filter I’m able to get a pretty accurate angle in both directions going from -90 to 90 there might be two problems with this though, I don’t actually know if I’m getting the angle measurements fast enough because of the sensors or the script and I don’t know if I should use low pass filters (my sensors are analog not digital). The measurements look fast enough although my eyes can’t read at 50Hz or more so I have my doubts.

After the kalman filter I use the angles as input for a PID control, I’m using the arduino PID library for this. This might not be good enough I really don’t know. I know how a PID is supposed to be but I don’t think I can do a better PID that the one in the library, the guy who wrote it did a pretty good job ( here’s the explanation made by the author: http://brettbeauregard.com/blog/2011...-introduction/)

These are my settings for the PID: My set point varies with respect of the receiver signal for pitch and roll, the set point is 0 when I’m not touching the remote control stick and it can go up to 35 this means that when I move the stick all the way the PID will try to set the output (which is the actual angle of the quadcopter) to 35 degrees in the specified direction.

The PID library is on automatic which I think means that it will always be working, manual is when you want to turn the PID off at some point. My output limits go from -90 to 90 this are the same as the input angles, I don’t know if this will cause a problem. I didn’t want to have more than 90 as a limit since the PID might take longer to get to the maximum and I kind of wanted to keep the value from -90 to 90.

My sample time for the PID is 10 milliseconds which will give 100 Hz, my ESCs run at 50 Hz so this should be fine? I’m not entirely sure; maybe the sampling time should run at the exact frequency needed (50 Hz).

Finally, I have two sets of coefficients for the PID one set of conservative coefficients (really small almost 0) and a set of aggressive coefficients. The aggressive coefficients are used when the difference of the angle and the set point is more than 10 degrees and the conservative when it is less. I haven’t experimented with the two sets of coefficients that much, I used to have only one set but I found out that with vibrations the sensors can measure a little less than 10 degrees even when at an actual 0 degrees so hopefully this will eliminate some noise and increase the speed of the motors when it actually needs it.

Now, my biggest question comes right after this. Once I have the value coming out of the PID I add that value (absolute value) to the value of the throttle (the one that controls the speed of the 4 motors at the same time) my question is: what is the recommended percentage that the direction and balancing signals should have with respect of the maximum speed of the motors?

I actually have a potentiometer that changes the value of the throttle (the value for direction and balancing always go from 0 to 90 when taking absolute value) this changes the percentage of those signals. To send the signal to the ESCs I’m using the arduino servo library this should be working just fine, I used an oscilloscope to check that the signals coming out of the arduino give the same width (minimum and maximum) and frequency as my receiver of the remote control, I don’t have the values right now but it was somewhere close to 50 Hz and 1000ms minimum width and 2000ms maximum width.

I might be calibrating the ESCs the wrong way though, what you are supposed to do in order to calibrate them is to start the motors having the throttle in the maximum position then after hearing certain beeps you are supposed to lower the stick to the lowest position, this makes the ESCs know what are your maximum and minimum widths and adjusts to make them its maximum and minimum speed.

To make that work, my maximum value before going to the servo library is the maximum value of the throttle this presents a problem, if the throttle is at its maximum the motors won’t have any room to increase their speed when the PID needs it in order to get the quad to the set point, this shouldn’t be a big problem at first since I usually never go above the 50% of the throttle in order to make the quad fly.

Sorry, this is getting quite long for a post. Just to make it clearer I’m using a + configuration this means that to balance the quad I increase the speed of the motor that is tilted down and for example when I need to go forward the motor in the back increases its speed.

To calibrate my PID I start with only one axis (I disconnect the other two motors and hang them) then I start calibrating, which I think works pretty well, the working axis stabilizes really fast actually faster than some that I’ve seen in some videos, but when I try all the motors at the same time I’m having a lot of problems getting it off the ground. Let me rephrase that, it does get off the ground somewhere around 10 cm, sometimes it wobbles a lot but it is still sort of flying and some other times it looks like it is stable but when I try increasing the speed a little bit more it just flips quite fast, as if it isn’t even trying to stabilize after some point but it does stabilize when trying it on one axis.

To anyone making their own quad you need the PID control it really changes things I tried it first with no PID and you get an unstable system and I really mean unstable, instead of decreasing the angle it just keeps increasing more and more, it’s kind of fun to watch…

Anyways, is there something that I’m missing? Some secret kind of PID control no one ever talks about or am I making a mistake or having a wrong approach somewhere?

I hope someone can give me some hints and that this post helps someone. If anyone has any question I’ll try to answer as fast as I can.


Eric, this is a very good source of knowledge in that respect:




You say you've tried with just two motors and that single-axis test works - but you don't say if you then do this again on the other two motors? If not then definitely do the single-axis test on the other axis before using all 4 motors.

Also I note that with only two motors running you are using a different portion of the motors response curve - perhaps some testing with two motors on PID control and two just on throttle control?

@Pito thanks for the info i do read those forums :slight_smile:

@MarkT I never tested both axis separetely ha… maybe that will help thanks and the other idea sounds pretty reasonable too

Maybe someone knows something about this. All the quadcopters that Ive seen have the sensors in the middle but wouldnt it be better to have them as far from the center as posible? since a small degree change makes more difference as you go away from the center?


No, An angle is an angle no matter how far away it is from the center. In fact, the Accelerometer will pick up centripetal forces from this. Always mount close to the center.

In fact mount accelerometer as close as possible to the centre-of-mass - this is the point the craft will turn around naturally - so you have to compromise if you have a variable payload (such as a camera mount).

Gyros aren’t nearly so sensitive to being off-axis.