Angle Measurement Using Gyro, Accelerometer and Arduino
Intro: Angle Measurement Using Gyro, Accelerometer and Arduino
The device is a rough prototype of what will eventually become a self balance robot, this is the second part of the hole thing (read accelerometer and control a motor to self balance). The first part with only the gyro can be found here.
On this instructable we will measure the angle using both gyro and accelerometer, and using a technique to merge both sensor to get a smooth signal. The technique is called "complementary filter".
previous
On this instructable we will measure the angle using both gyro and accelerometer, and using a technique to merge both sensor to get a smooth signal. The technique is called "complementary filter".
previous
STEP 1: What We Gonna Need:
Some part can be replace, and some modification at the code have to be made to fit your hardware.
On this project we will use:
- Breadboard
- Microcontroller, I used the Arduinoboard
- Wire
- Jumper Wires
- Gyroscope XV-8100
- Nunchuck Wii (for the accelerometer)
- Nunchuck Wii adapter for Arduino
On this project we will use:
- Breadboard
- Microcontroller, I used the Arduinoboard
- Wire
- Jumper Wires
- Gyroscope XV-8100
- Nunchuck Wii (for the accelerometer)
- Nunchuck Wii adapter for Arduino
STEP 2: Building...
The circuit consists of a gyroscope connected direct to port 0 at your arduino and a nunchuck wii connect at the I2C port.
Assembling the gyro:
1. - plug the gyro at the breadboard
2. - wire ever thing:
- Vo pin from gyro connected to analog port0 at arduino (Light orange wire)
- G pin from gyro connected to ground (White wire)
- V+ pin from gyro connected to Vdd(3.3V) (Orange wire)
Assembling the accelerometer:
1. - plug the adapter at the nunchuck
2. - plug the nunchuck at the arduino using the adapter
3. - place the accel sensor like the photo above
Assembling the gyro:
1. - plug the gyro at the breadboard
2. - wire ever thing:
- Vo pin from gyro connected to analog port0 at arduino (Light orange wire)
- G pin from gyro connected to ground (White wire)
- V+ pin from gyro connected to Vdd(3.3V) (Orange wire)
Assembling the accelerometer:
1. - plug the adapter at the nunchuck
2. - plug the nunchuck at the arduino using the adapter
3. - place the accel sensor like the photo above
STEP 3: Some Extra Information Before We Proceed
From both sensor we can measure the angle but using two distinct technique.
To measure the angle using the gyro we have to integrate the signal.
But why we have to do this?
Because the gyro give us the angular rate, so a simple way to get the angle is have the angular rate multiplied by the time [angle = angle + w * dt]
To measure the angle using an accelerometer we have to sense the gravity in each axis of the accelerometer, what it means, the projection of the gravity acceleration on each direction of the sensor give us an idea about the angle. [angle_accel = arctg( Ay / sqrt( Ax^2 + Az^2 ) )]
So why we gonna use two sensor instead one?
To take the advantage of both sensor properties. If you look at the graphic the gyro data continuous increase, this is called drift and the accelerometer data change a lot at a small time.
And how to merge both signal?
We will use a technique called complementary filter. I don't know the exact theory behind this, but it works fine. There are some information at the internet, just google it if you need more information. This link has a lot of information and can be useful.
filtered_angle = HPF*( filtered_angle + w* dt) + LPF*(angle_accel); where HPF + LPF = 1
The values of HPF and LPF can be found at this link, on the filter.pdf file. Thanks you guys from "The DIY Segway".
Just for test purpose we gonna set this values like this, HPF = 0.98 and LPF = 0.02.
To measure the angle using the gyro we have to integrate the signal.
But why we have to do this?
Because the gyro give us the angular rate, so a simple way to get the angle is have the angular rate multiplied by the time [angle = angle + w * dt]
To measure the angle using an accelerometer we have to sense the gravity in each axis of the accelerometer, what it means, the projection of the gravity acceleration on each direction of the sensor give us an idea about the angle. [angle_accel = arctg( Ay / sqrt( Ax^2 + Az^2 ) )]
So why we gonna use two sensor instead one?
To take the advantage of both sensor properties. If you look at the graphic the gyro data continuous increase, this is called drift and the accelerometer data change a lot at a small time.
And how to merge both signal?
We will use a technique called complementary filter. I don't know the exact theory behind this, but it works fine. There are some information at the internet, just google it if you need more information. This link has a lot of information and can be useful.
filtered_angle = HPF*( filtered_angle + w* dt) + LPF*(angle_accel); where HPF + LPF = 1
The values of HPF and LPF can be found at this link, on the filter.pdf file. Thanks you guys from "The DIY Segway".
Just for test purpose we gonna set this values like this, HPF = 0.98 and LPF = 0.02.
STEP 4: Code:
The code is a adaptation from a code that I used on another project. Probably there are some variables unused.
I used a library to read the nunchuck data from http://todbot.com/blog/. Thank you Tod E. Kurt.
The comments on code are in portuguese, as soon as I have a free time, I will translate it.
The code output trough the serial line some numbers with this pattern:
dt : w : teta : pitch : filter_teta $
time:angular_velocity:gyro_angle:accel_angle:filtered_angle$
So you can save this values at a serial terminal and plot a graphic or use the angle for other things.
If you need any explanation about the code fell free to ask.
The code is ziped. Just unzipe, open and upload it to your arduino.
I used a library to read the nunchuck data from http://todbot.com/blog/. Thank you Tod E. Kurt.
The comments on code are in portuguese, as soon as I have a free time, I will translate it.
The code output trough the serial line some numbers with this pattern:
dt : w : teta : pitch : filter_teta $
time:angular_velocity:gyro_angle:accel_angle:filtered_angle$
So you can save this values at a serial terminal and plot a graphic or use the angle for other things.
If you need any explanation about the code fell free to ask.
The code is ziped. Just unzipe, open and upload it to your arduino.
STEP 5: Testing and Conclusion
To test the system I saved the data using a program called Termite, then import this data at excel and plot the graphic to see how good my filter is. The results are amazing. Of course you can use the signal to drive a motor, or other things.
Any comments, any doubt, any information missing, just tell me and I correct it.
Please if you like this, rate.
Thank you all.
Any comments, any doubt, any information missing, just tell me and I correct it.
Please if you like this, rate.
Thank you all.
23 Comments
Sgoode7 3 years ago
rouis.jihene.20 6 years ago
Please help me in getting the angle from the gyroscope, i applied the equation metined but i got incorrect results
i write: angleGyro+=(w*dt)*RAD_TO_DEG;
with: w=w=(int)gyro.g.y;
where is the problem??????? please help, it's very urgent
MamunEdt 7 years ago
this is nesessery encoder motor needed for self balancing robot
HichS1 8 years ago
ok
kwickramasinghe 9 years ago
Hello, First of all great work and thank you very much for sharing the knowledge.
I need to know a couple of things.
1. Are the angle measurements accurate. Does a 45 degree change show 45 degrees approxiamtely.
2. Up to what value of angle the device measure ? Is it capable of handling more than 90 degree angles
mba7 9 years ago
I made an equivalent tool in python that print real time data from ADXL345 accelerometer.
https://github.com/mba7/SerialPort-RealTime-Data-P...
may be it will be helpful for someone
saurabh.more.92167 9 years ago
is this possible to use only accelerometer for angle measurement.
otaviousp 9 years ago
It is possible to use only the accelerometer but the result may not to be so good.
It is recommended use both sensors.
ihelmi 10 years ago
otaviousp 10 years ago
You can use it for a variety of things, depend what are you doing or your need.
ontreus 12 years ago
Não vi nenhuma linha para a execução dos motores que vc usou no seu robô.
estes comandos estão em um outro arquivo a parte?
Obrigado pela atenção.
jgeidl 13 years ago
Thanks,
Jim
vivekchopra 13 years ago
thanks
skeleton1102 13 years ago
otaviousp 13 years ago
https://www.instructables.com/id/Accelerometer-Gyro-Tutorial/
Any doubt feel free to ask.
skeleton1102 13 years ago
paolo.mosna 13 years ago
otaviousp 13 years ago
Accentrix 13 years ago
WyoJustin 14 years ago
Justin