3 Simple Ways to
Share What You Make

With Instructables you can share what you make with the world — and tap into an ever-growing community of creative experts.

PhotosPhotos

Share one or more photos of a project, recipe, or whatever you've made, quickly and easily.

Step by StepStep-By-Step

Share your step-by-step photos with text instructions of what you made so others can do it too!

VideoVideo

Share your how-to video. You'll need your embed code from a video site such as YouTube.

Arduino, Gyroscope and Processing

Arduino, Gyroscope and Processing
«
  • DSC05022.JPG
  • DSC05023.JPG
  • processing gyro.jpg
Hi guys, this is my first attempt to post a project here.

This is an instructable on how to read a gyro sensor and plot the data using processing software at your desktop. I am using gyroscope model XV81-000 and an arduino. The device is a rough prototype of what will eventually become a self balance robot, this is the first part of the hole thing (read accelerometer and control a motor to self balance).

 
Remove these adsRemove these ads by Signing Up
 

Step 1What you need?

What you need?
You will need:

- Breadboard
- Microcontroller, I used the Arduino board
- Wire
- Jumper Wires
- Gyroscope XV-8100
« Previous StepDownload PDFView All StepsNext Step »
45 comments
1-40 of 45next »
Feb 10, 2012. 9:07 PMontreus says:
Blz Otávio
o Codigo do arduino_gyro.pde
é o codigo do processing e não do arduino
Vc poderia corigir.
Agradeço pelo tutorial.
Aug 21, 2011. 8:39 PMontreus says:
Olá Otávio, me chamo ontreus e também me encontro em São Paulo.
Na busca por informações sobre Giroscópio, cheguei no seu tutorial.
Bem, possuo os seguintes componentes:
- Giroscopio0 XV-3500CB PROTOTYPE PCB
- Arduino Duemilanove
- Servo Motor
Estou tentando fazer o mesmo desse link que segue:
http://www.youtube.com/watch?v=xkVRZC0e8Vk
Depois de testes verifiquei que este meu sensor possui um sinal muito baixo na porta analógica
Denominada de ANA0 e verifiquei que você usou dois capacitores para amplificar o sinal.
Meu sensor possui já uma saída de sinal digital compatível com l2c pois assim o sinal fica melhor
Pergunto que capacitores você usou em seu projeto e conectado aonde?
Jan 28, 2011. 10:37 PMvivekchopra says:
i need algorithm of above code for my LABVIEW programming... so plz post it here...
Nov 19, 2010. 12:30 AMpaolo.mosna says:
Dear otaviousp, sorry if I bother you, but I'm trying to reproduce your realization using an Arduino Mega BT (Blue Tooth) 368 and what I get as output visualization is a very unstable angle indicator also with gyro device laying on the table without movements.

To verify A2D (arduino Analog to Digital) converter I connected analog input 0 to ground. With this configuration the A/D converter is giving me strange values ranging (randomly) from a minimum of 0 to a maximum of 64.
Is that possible? Do you know something about poor A/D conversion with arduino.
What kind of dynamic shows your realization?

Thanks for any comment.
Nov 22, 2010. 6:54 AMpaolo.mosna says:
Currently I'm using a LPR510AL on a micro board which provides an output voltage which represents the angular acceleration.

I fixed the A/D conversion problem on arduiono using a resistive partition on AREF pin on arduino board. AREF is now connected to GND with a 10microF, and with a 10K resistor to Vcc (5V). This give me a reference voltage for A/D of 3.77 V.

Yes, I'm using your sample code.
But I'm still having problem with angular value computation.

The angular value is slowly drifting apart when gyro is kept steady
(no force applied).

But I have just found out that in your code you have this constraint:

if(teta>-1 && teta<1) teta=0; //avoid drift error
teta = teta + ( valor * time ) / 1000;

to avoid drifting.
I would like to change it to:

deltaTeta = ( valor * time ) / 1000; // Angle infinitesimal increment

if(deltaTeta>-1 && deltaTeta<1) {
deltaTeta=0; //avoid drift error
}

teta = teta + deltaTeta;

Probably this would avoid spurious variation is steady state.
But I haven't yet tried this solution.
I would let you know as soon I get tested with new code.

Thanks.

Nov 23, 2010. 12:11 AMpaolo.mosna says:
Yes correct.
This is what I'm doing. I'm reading teta, the A/D output (from 0 to 1023) which is the gyro output voltage read with the arduino A/D converter.

The gyro output from the A/D has a range from 328 to 330 [count] when gyro is in a steady state ( I do not know if this variability is normal in a gyro or not). So I did use value 329 as offset inside the equation used to compute teta.

This produce, anyway, a drifting value for teta which keeps increasing or decreasing (depending on the value i choose for offset).
Also tuning the offset value using 0.1 resolution (let's suppose 329.4 instead of 329.0) can improve performance in the sense that I reduce the speed with which teta is increasing (decreasing) when gyro is in steady state but i?m not able to stop it.

I do not want to bother you too much with this problem.
Probably I would try with a different gyro with a I2C interface with integrated A/D conversion.

Thanks for you help.
Paolo.


Dec 15, 2010. 2:56 AMpaolo.mosna says:
OK I got the solution to my problem.
The problem was related to the fact that I was querying the arduino's A/D converter to fast, a was not giving enough delay in between two consecutive readAnalog() calls.

Introducing a delay of at least 50 ms definitively solved my problem.
By the way I did find a solution to increase speed in A/D conversion on arduino.
Here are few lines of "code":

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

#define FASTDAC 1

#if FASTDAC
#define DELAY 10 // delay in ms
#else
#define DELAY 50
#endif

so you can use less than 10 ms as delay time in between A/D calls.
I tested this with 5 ms delay and A/D conversion worked grate.

Thanks.
Jul 17, 2010. 5:41 AMperfo says:
Hello, I'm interested in finding out more about these solid state gyros. My question is:- If you had the device on the worktop and it read say 20 degrees. If you pick it up and drive around the block then put it back on the table in exactely the same place would it still show 20 degrees? what kind of accuracy can you get with these? Lastely where can I get chep ones in the UK to play with? Thanks, and sorry for so many questions...
May 6, 2010. 8:18 AMjust_watching says:
ok so this is the code i would need just to get the angle



float sens= 0.512;
float offset= 316 ;
float count= 0;
float valor =0;
float first_time, time;
float teta=0;


//####################################################################//
// //
// Gyro //
// Scale Factor 2.5mV/ ý/s = 0.512 counts/ ý/s //
// Offset 316 counts = 1562mV = 1.562V //
// ADC 4.88 mV/count // 0.2048 count/mV //
// //
//####################################################################//

count =0;
for(int i=0;i<20;i++){

count = count + arduino.analogRead(0);

}

count = count /20;

valor = (count - offset ) / sens;

time=millis()-first_time;

first_time=millis();

teta=teta+valor*time/1000;

if(teta>-1 && teta<1) teta=0; //avoid drift error

May 6, 2010. 9:48 AMjust_watching says:
...ok just one other thing if I use a gyro with a accelerometer I would need this:

Angle=HPF*(teta) + LPF*(arctg( Ay / sqrt( Ax^2 + Az^2 ))

(from your other instructable)
May 17, 2010. 9:14 AMjust_watching says:
how did you got the          float sens= 0.512; ?
May 18, 2010. 9:49 AMjust_watching says:
so for this sensor (http://www.sparkfun.com/datasheets/Sensors/IMU/lpr530al.pdf)it would be (with 4x amplified)

3.3mV / (º/s)  ) / (4.8mV / count) = 0.512 count(raw value) / (º/s)

and if you would wire up 3.3v to Aref pin it would be

From the ADC 3.3V / 1024 = ...
May 20, 2010. 5:08 AMjust_watching says:
ok thanks ...just one question why is the offet=
316
May 20, 2010. 1:21 PMjust_watching says:
ok thanks a lot this really helped me
May 20, 2010. 4:53 AMjust_watching says:
ok thanks

May 7, 2010. 8:05 AMjust_watching says:
I know what you mean ... so Ill get a tetax,and tetay, and anglex, angley.

Thanks this realy helped a lot because there isnt much about gyros or 6DOF on arduino.cc



May 6, 2010. 9:44 AMjust_watching says:
ok thanks for that fast reply
im gonna use this for a quadrocoper with a razor 6dof from Sparkfun
Dec 15, 2009. 8:31 PMtdragovich says:

Can you provide the manufacturer of the breakout board or the retailer from who you got it? I have only been able to find the Gyro in SMD w/o breakout board. Thanks

Dec 14, 2009. 4:13 PMWillTheRescue says:
 Is there anyway I can use Processing to send a command to my Arduino?

Right now I have it set so if I type "T" into my serial monitor, it sends the command out digital pin 9, through my relay, and "presses" a button on my TV controller, thus turning it on.

Can I do something so that pressing a button in my Processing sketch would be like typing "T"?
Dec 14, 2009. 6:38 PMWillTheRescue says:
 Ah, I see!
Thank you very much.

I'm pretty new to Processing, so I'm not too sure of all it's capabilities.
Nov 13, 2009. 6:43 PMrokag3 says:
andrew  this type of gyroscope use the stability of a blade in vibration.
1)take a cork and insert in the center a long steel stick
2)put your stick in vibration vertical and hold the cork under your palm
3)turn the cork the axe of the stick stay vertical and you feel a force under your palm

in this type of chips they use a double (A,A')=x=(B,B') lyre the extremity (A and A')is put in vibration by a solenoid the other extremity (B and B') will vibrate then generate a current in a receptive solenoid the difference between the current generate by B and B' with a constant vibration  A and A' will mesure the anti couple
Jul 3, 2009. 1:40 PMSarah_mu says:
Please explain, why you add 270 here: line(200,200,50*cos(radians(teta+270))+200,50*sin(radians(teta+270))+200);
Jul 4, 2009. 1:32 AMSarah_mu says:
Thank you! I'm still confused ;)
Would you please explain it mathematically? For I see here:
if(teta>-1 && teta<1) teta=0; //avoid drift error
That the absolute value of teta is less than 1, then teta could not be in degree...right? next I don't see any conversion to degree, and then it is added to 270 and used as a degree. The program works with my IMU and it means that it is correct. I anyway can't understand the math behind this angle offset! do you see where my problem in understanding is? ;)
Jul 5, 2009. 10:52 AMSarah_mu says:
Thank you for the answer. Well then I will go for trial and error, to find out what that 270 does there! Your software is anyway nice! It didn't need any alteration when I uploaded to my Arduino, and worked fine with my IMU. I am doing the same thing, i.e. balancing a robot, toward DIY Segway. What I have now, is good tools for Kalman filtering the balancing process. I am seeking complementary filter code and information. It would be nice if we could share info ;)
1-40 of 45next »

Pro

Get More Out of Instructables

Already have an Account?

close

All Steps Viewing
View all steps of an Instructable on the same page when you're a Pro Member.

Upgrade to Pro today!
31
Followers
5
Author:otaviousp