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/04/improving-the-beginners-pid...)
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
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.
I hope this can help http://hefnycopter.net/index.php/developing-source-code/22-quadcopt...
I am doing the same thing what you are doing.
I have filtered data using kalman and passing them to two PIDs for roll and pitch running on the Arduino.I am driving ESCs using standard Servo library which gives 50Hz PWM. One more thing I would like to specify is that I am running kalman on separate Atmega 328 which is available on ArduIMU v3 and gets the angles information serially to my main Arduino Mega.
As I am using 'X' Quad frame, the movement of any motors can affect both pitch and roll at the same time. So, the outputs of these two PIDs decide the motors speed..
Now, the problem is such that according to PIDs' response the quadcopter is reacting but it is not able to stabilze itself. It remains in oscillitation of +5 to -5 degrees.. My current PID values for both roll and pitch are same. P = 0.93, I = 0, D = 0.08.
I am simply directly add/substract the PIDs output with the motor's speed. My main loop of arduino is running at approx 60-70Hz frequency.. I am using the PID library which is attached with this post.
And other thing I would like to tell is that my angles' kalman output from the sensors are not that much stable. when the propellers start spinning and then it juggles around +/- 1 degree.
What could be the problem?
Let me first say that i finished this project more than a year ago so I forgot a lot of things, but lets see...
50Hz to the ESC is not good enough for a quadcopter, quadcopter need the fastest response you can give them, I think i ended up somewhere around 350HZ. You can modify the servo library to go faster but only up to a point i think it was 150HZ after that the PWM gets distorted (check on your osciloscope) the best thing is to do your own program for that. I dont see a problem getting the angles from another processor as long as you are getting them correctly and fast enough.
Your main loop should be faster the faster the better.
Buddy you need to get your angles perfectly stable, they need to have almost 0 error, think about this if your quadcopter thinks that is tilted by 1 degree it will actually tilt 1 degree thus your quadcopter will never be able to stay at one place by itself. This is probably why you have a +-5 degree oscilation.
I also had a lot of problems with noise in my sensors, What i did was:
Buy better sensors
Avoid all vibrations as much as possible
And since you are sending them serially to your main arduino you probably also have electromagnetic noise, the motors produce a lotttt of it. Reduce the length of your wires and if you can handle a little more weight try isolating the circuit. Dont ask me how cause its a mess i tried plastic aluminum and plastic but it didnt work that well.
I hope that with these you will be able to fly, it probably wont be perfect but this might help.
I forgot, there are also lot of things more like hobby related. So if you werent into this before you might probably not know. You need to balance your propellers to reduce vibrations as much as possible, the easiest is to use nail paint (i dont know how you call it the paint that women use on their finger nails). The quadcopter needs to be balanced with the center of mass below its actual center. Your motors need to be working perfectly i made the mistake to buy the cheapest motors i could find and its just not worth the time you spend fixing them.
I would have remcomended to do a + configuration instead of x, i think its more stable and it would be easier to calibrate the PID.
Another recomendation i had 3 potentiometers on the quadcopter one for each coefficient of the PID its waaayy faster to calibrate it this way, and you learn a lot just by seeing how the quadcopter changes, and it is waaay much more fun and cooler haha.