Arduino, Gyroscope and Processing

Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

Home Sign Up!

Browse Community Submit


All Art Craft Food Games Green Home Kids Life Music Offbeat Outdoors Pets Photo Ride Science Tech

Arduino, Gyroscope and Processing


by otaviousp on March 13, 2009

Table of Contents

Arduino, Gyroscope and Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Intro: Arduino, Gyroscope and Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

File Downloads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Step 1: What you need? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Step 2: Building . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Step 3: Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Step 4: Turn on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Related Instructables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
Intro: Arduino, Gyroscope and Processing
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).

Image Notes Image Notes


1. gyroscope XV-8100 1. Vout pin
2. filtring capacitor 1uF 2. Vdd pin, connected to 3.3V
3. arduino 3. Ground pin
4. Epson gyro sensor XV-8100

Image Notes
1. angle indicator

File Downloads

arduino_gyro.pde (2 KB)
[NOTE: When saving, if you see .tmp as the file ext, rename it to 'arduino_gyro.pde']

StandardFirmata.pde (7 KB)
[NOTE: When saving, if you see .tmp as the file ext, rename it to 'StandardFirmata.pde']

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
Step 1: What you need?
You will need:

- Breadboard
- Microcontroller, I used the Arduino board
- Wire
- Jumper Wires
- Gyroscope XV-8100

Image Notes
1. Vout pin
2. Vdd pin, connected to 3.3V
3. Ground pin
4. Epson gyro sensor XV-8100

Step 2: Building
The circuit consists of a gyroscope connected direct to port 0 from your arduino. Some capacitor added to reduce noise from analog value.

1� - plug the gyro at the breadboard


2� - plug a small ceramic capacitor to bypass the DC noise between the ground pin and the vout signal. (optional)
3� - add another capacitor to reduce even more the noise between the ground pin and the vcc pin. (optional)
4� - wire ever thing:
- Vo pin from gyro connected to analog port0 at arduino (Blue wire)
- G pin from gyroconnected to ground (White wire)
- V+ pin from gyro connected to Vdd(3.3V) (Orange wire)

Image Notes Image Notes


1. ground 1. filtring capacitor
2. Vout
3. Vcc 3.3V

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
Image Notes Image Notes
1. filtring capacitor 1. wire connected to arduino

Image Notes
1. from sensor

Step 3: Software
To communicate the arduino with the processing I used the standard firmata code, the same found inside the arduino's library. This library automatize the communicate
process between the arduino and firmata. So is not necessary any modification at the arduino code. We will gone just edit the processing code according with our desire.

The processing code:

import processing.serial.*;
import cc.arduino.*;

Arduino arduino;

int ledPin = 13;


float value=0;
int first_try=1;
String stf="";

void setup()
{
size(400,400);
println(Arduino.list());
arduino = new Arduino(this, Arduino.list()[1]);
arduino.pinMode(ledPin, Arduino.OUTPUT);

frameRate(60);
delay(500);
}

float sens= 0.512;


float offset= 316 ;

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
float count= 0;
float valor =0;
float aux1=0,aux2=0;
int[] contador={
0,0,0};
float first_time, time;
float teta=0;

void draw() {
background(150);
fill(250,250,250);
arc(200,200,100,100,0,TWO_PI);
if(first_try==1){
//delay for arduino initialization
delay(2000);
first_try=0;

if (mousePressed == true) {
fill(255,0,0);
aux1=0;
aux2=0;
contador[0]=0;
contador[1]=0;
contador[2]=0;
teta=0;
arduino.digitalWrite(ledPin, Arduino.HIGH);
}
else {
fill(0,0,0);
arduino.digitalWrite(ledPin, Arduino.LOW);
}

//####################################################################//
// //
// 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
PFont font;
font = loadFont("EngraversMT-48.vlw");
stf = str(teta);
textFont(font);
text(stf,150,270,200,200);
println("teta: "+teta+" count: "+count+" time: "+time+" valor: "+valor);
line(200,200,50*cos(radians(teta+270))+200,50*sin(radians(teta+270))+200);

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
Step 4: Turn on
Now that we have all we gonna need, lets uploaded the standard firmata code at arduino. The code is found inside the library folder of your arduino.
The processing code I posted at the previous page. The code initialize the firmata library read the analog port and plot it at your desktop .
The processing code need a little tune and I'm working on it. As soon i fix I will edit the code here. Feel free to edit and improve the code for a better performance, and let
me know.

Turn on the arduino, compile the code and you gonna see a circle with a line at middle, wait a few seconds and click at the circle to reset the angle
When you turn the bread board, the line will turn to the same side.

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
Related Instructables

Easy build self


balancing Spinnerette - A
PC Motion
Accelerometer new Sport by
skateboard/robot/segway
Gamepad by
& Gyro Tutorial platform by findus1
Angle Seg...stick. by nmcclana
measurement by nmcclana XenonJohn
scolton
using gyro,
accelerometer
and Arduino by
otaviousp

Comments
41 comments Add Comment

vivekchopra says: Jan 28, 2011. 10:37 PM REPLY


i need algorithm of above code for my LABVIEW programming... so plz post it here...

paolo.mosna says: Nov 19, 2010. 12:30 AM REPLY


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.

otaviousp says: Nov 22, 2010. 5:54 AM REPLY


What Gyro are you using?

Are you using the same code without modifications?

paolo.mosna says: Nov 22, 2010. 6:54 AM REPLY


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.

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
otaviousp says: Nov 22, 2010. 7:33 AM REPLY
Have you change de offset value?

Make a simple code to return the value read from your analog port with your gyro steady. The value show often is yout offset. Just replace this
value on the code.

This can help improve the steady problem.

paolo.mosna says: Nov 23, 2010. 12:11 AM REPLY


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.

paolo.mosna says: Dec 15, 2010. 2:56 AM REPLY


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.

perfo says: Jul 17, 2010. 5:41 AM REPLY


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...

otaviousp says: Jul 25, 2010. 1:12 PM REPLY


Here is a nice tutorial about this gyros and accelerometers.

http://www.instructables.com/id/Accelerometer-Gyro-Tutorial/

just_watching says: May 6, 2010. 8:18 AM REPLY


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;

//####################################################################//
// //

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
// 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

otaviousp says: May 6, 2010. 9:32 AM REPLY


Thats right.

cya

just_watching says: May 6, 2010. 9:48 AM REPLY


...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)

otaviousp says: May 6, 2010. 10:16 AM REPLY


Yes, but if you gonna use a 6DOF sensor, i think it is better to use the angle from only one direction. That way you have the rotation in on
direction off the acellerometer plus the rotation from your gyro. 3 times this configuration.

Sorry my bad english and worst explanation.

just_watching says: May 17, 2010. 9:14 AM REPLY


how did you got the float sens= 0.512; ?

otaviousp says: May 17, 2010. 11:31 AM REPLY


The Scale factor is 2.5mV / º/s.
From the ADC 5V / 1024 = 4.8mV / count(raw value)

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

so, if you read from the adc channel a value like 2, this means 3.9 º/s

2 / 0.512 = 3.9

just_watching says: May 18, 2010. 9:49 AM REPLY


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 = ...

otaviousp says: May 19, 2010. 1:43 PM REPLY


From the ADC 3.3V / 1024 = 3.222mV / count (raw value)

3.33mV / (º/s) / (3.222mV / count) = 1.0333 count (raw value) / (º/s)

just_watching says: May 20, 2010. 5:08 AM REPLY


ok thanks ...just one question why is the offet=
316

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
otaviousp says: May 20, 2010. 6:13 AM REPLY
When you leave your gyro on a stationary position, probably you wont read a ZERO value.

You will have something like 1.23V. Or 381 counts.

This is your offset.

So, if you extract the value you are reading from the offset you will have ZERO.

just_watching says: May 20, 2010. 1:21 PM REPLY


ok thanks a lot this really helped me

just_watching says: May 20, 2010. 4:53 AM REPLY


ok thanks

just_watching says: May 7, 2010. 8:05 AM REPLY


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

just_watching says: May 6, 2010. 9:44 AM REPLY


ok thanks for that fast reply
im gonna use this for a quadrocoper with a razor 6dof from Sparkfun

tdragovich says: Dec 15, 2009. 8:31 PM REPLY


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

otaviousp says: Dec 16, 2009. 5:34 AM REPLY


the sensor is manufactured by epson toycom.
i bought that board on ebay, but I didn't found the seller anymore.

cya

WillTheRescue says: Dec 14, 2009. 4:13 PM REPLY


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"?

otaviousp says: Dec 14, 2009. 5:39 PM REPLY


Somithing like this should work:

color fillVal = color(126);


import processing.serial.*;

void draw() {
fill(fillVal);
rect(25, 25, 50, 50);
}

void keyReleased() {
Serial myPort;
myPort = new Serial(this, Serial.list()[0], 9600);
if (keyCode == 'T') {
println("T key pressed");
myPort.write("T");
}

WillTheRescue says: Dec 14, 2009. 6:38 PM REPLY


Ah, I see!
Thank you very much.

I'm pretty new to Processing, so I'm not too sure of all it's capabilities.

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
otaviousp says: Dec 15, 2009. 3:59 AM REPLY
NP, xD

rokag3 says: Nov 13, 2009. 6:43 PM REPLY


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

Sarah_mu says: Jul 3, 2009. 1:40 PM REPLY


Please explain, why you add 270 here: line(200,200,50*cos(radians(teta+270))+200,50*sin(radians(teta+270))+200);

otaviousp says: Jul 3, 2009. 2:29 PM REPLY


This is just an offset for the angle, when add 270º to the teta angle, the line who indicates the angle stay on vertical.

Sarah_mu says: Jul 4, 2009. 1:32 AM REPLY


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? ;)

otaviousp says: Jul 4, 2009. 3:54 PM REPLY


probably your IMU measure the angle rate in º/s like mine. so you have the angle already in degrees.
if(teta>-1 && teta<1) teta=0; //avoid drift error <- when you integrate the signal from the IMU if the IMU doesn't stay still, an error will be summed
to the angle, so, this line try to prevent this.
the line() function on processing works in rad, so we have to make a conversion, that's why I use the function radians(270+teta); i really don't
remember why i choose this value of 270, but i know it's work fine for me, xD
if you need some other explanation, feel free to ask.

Sarah_mu says: Jul 5, 2009. 10:52 AM REPLY


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 ;)

otaviousp says: Jul 5, 2009. 6:48 PM REPLY


Nice, I almost finished my DIY Segway, but it doesn't stay on the vertical, xD.
Soon I will post some information about it. http://web.mit.edu/first/segway/ Here you can found some information about sensor merging
and filtering. My hole project is based on this. I'm using an accelerometer from a nunchuk to have the acceleration and the angle, that way
I have two angles, and avoid the drift error from gyro. I have some documentation but it is on portuguese.
Plz send a PM with your email and I cans send it, and more informations for you.
Good luck

Sarah_mu says: Jul 9, 2009. 4:14 AM REPLY


I received your email, thanks, but when I answered you, the mail was returned saying "access denied". :((

andrew101 says: Jul 4, 2009. 7:49 AM REPLY


its not a gyro, its an accelerometer. a gyro has a spinning disc to keep it stable

otaviousp says: Jul 4, 2009. 8:29 AM REPLY


this is a gyroscope, this is the datasheet from this http://www.epsontoyocom.co.jp/english/product/Sensor/set01/xv8100cb/index.html

otaviousp says: May 29, 2009. 5:34 PM REPLY


nice, i will try it latter, ty

http://www.instructables.com/id/ArduinoGyroscopeProcessing/
TXTCLA55 says: May 6, 2009. 8:20 AM REPLY
cool! what you need to do is get it to send this data to a lcd screen so you can see it with out a computer.

http://www.instructables.com/id/ArduinoGyroscopeProcessing/

You might also like