Está en la página 1de 3

Aviónica

Ejercicios sobre la lectura de ángulos con acelerómetro y


giróscopo

Curso 2019-2020 Cuadrimestre de primavera


Grado en ingeniería en tecnologías aeroespaciales

1. Escribir un programa para arduino UNO que calcule los ángulos roll y pitch y saque sus valores por el monitor
serie (basaros en el programa de ejemplo que hay en la teoría para calcular las aceleraciones y consultar la web de
Arduino).
En los documentos de teoría se especifica que los ángulos de cabeceo (pitch) y alabeo (roll) se determinan de acuerdo a
las medidas del acelerómetro mediante las siguientes expresiones:
  −1
AX,OU T
Cabeceo −→ θ = tan  q 
A2Y,OU T + A2Z,OU T

  −1
AY,OU T
Alabeo −→ ψ = tan  q 
A2X,OU T + A2Z,OU T

Donde A es la medida del acelerómetro, donde el primer subíndice denota la dirección cartesiana de la medida. Estas
expresiones pueden aplicarse directamente para obtener los valores de inclinación, una vez transformada debidamente la
señal recibida.
1 / / D e f i n i c i ó n de p u e r t o s de l e c t u r a
2 c o n s t i n t p i n x =A0 ;
3 c o n s t i n t p i n y =A1 ;
4 c o n s t i n t p i n z =A2 ;
5
6 / / I n i c i a l i z a c i ó n de v a r i a b l e s
7 double l e c t u r a s [3 ] ;
8 i n t i =0 ;
9 d o u b l e t h e t a =0 ; / / Se p o d r í a n d e f i n i r como v o l a t i l e
10 d o u b l e p s i =0 ; / / d e b i d o a l a p o s i b l e r a p i d e z de cambio
11
12
13 / / D e f i n i c i ó n de c o n s t a n t e s , c o n f i g u r a d a s p o r c a l i b r a c i ó n t e ó r i c a
14 d o u b l e a0=512 ; / / V a l o r de o f f s e t
15 d o u b l e a1=10.04 ; / / V a l o r de g a n a n c i a
16
17 / / P r o g r a m a de a r r a n q u e
18
19 void setup ( ) {
20 S e r i a l . b e g i n ( 9600 ) ;
21 }
22
23 / / B u c l e de r e p e t i c i ó n
24
25 void loop ( ) {
26 / / L e c t u r a s y p r o c e s a d o de l a s e ñ a l d e l a c e l e r ó m e t r o
27 l e c t u r a s [ 0 ] = ( a n a l o g R e a d ( p i n x )−a0 ) * ( a1 / 1024.0 ) ;
28 l e c t u r a s [ 1 ] = ( a n a l o g R e a d ( p i n y )−a0 ) * ( a1 / 1024.0 ) ;
29 l e c t u r a s [ 2 ] = ( a n a l o g R e a d ( p i n z )−a0 ) * ( a1 / 1024.0 ) ;
30
31 / / Se c a l c u l a n l o s á n g u l o s a p a r t i r de l a s l e c t u r a s
32 t h e t a = a t a n 2 ( l e c t u r a s [ 0 ] , s q r t ( pow ( l e c t u r a s [ 1 ] , 2 ) +pow ( l e c t u r a s [ 2 ] , 2 ) ) ) ;
33 p s i = a t a n 2 ( l e c t u r a s [ 1 ] , s q r t ( pow ( l e c t u r a s [ 0 ] , 2 ) +pow ( l e c t u r a s [ 2 ] , 2 ) ) ) ;

1
Aviónica

34
35 / / I m p r e s i ó n de d a t o s p o r p a n t a l l a
36 Serial . println () ;
37 S e r i a l . p r i n t ( " Angulo de c a b e c e o − Angulo de a l a b e o " ) ;
38 Serial . println () ;
39 Serial . print ( theta ) ;
40 Serial . print ( " − ");
41 Serial . print ( psi ) ;
42 Serial . println () ;
43 d e l a y ( 1000 ) ;
44 }

2. Queremos calcular los ángulos roll y pitch con el giróscopo LPY503AL cuyas características os he adjuntado en
Atenea. Indicar las conexiones del giróscopo al Arduino, es decir, anotar a qué pin del Arduino se debe conectar
cada pin del giróscopo. Partir del montaje recomendado en el pdf del LPY503AL

Figura 1: Esquema de la página 3/12 del Datasheet del giróscopo LPY503AL.

Para el conexionado de alimentación:


Puerto 16 Vdd: conectado al pin de 5 V, ya que es el puerto de alimentación (Power Supply).
Puerto 14-15 Res: puertos reservados que deben ir conectados a Vdd.
Puerto 1 GND: conectado al pin de GND, ya que es el puerto de tensión nula o conexión a tierra.
Para la transmisión de datos, en caso de mayor sensibilidad y menor rango:
Puerto 8 4xOUTZ, correspondiente al alabeo: conectado al pin A0.
Puerto 6 4xOUTX, correspondiente al alabeo: conectado al pin A1.

3. Escribir un programa para el cálculo de los ángulos roll y pitch de forma similar al programa realizado en el
ejercicio 1.
En este ejercicio se pide hacer un programa que haga lo mismo que el 1, pero utilizando las medidas del giróscopo. Este
dispositivo mide frecuencias angulares, es decir ω, a diferencia del acelerómetro, que mide orientaciones fijas.
Para medir ángulos a partir del giróscopo, seria necesario integrar matemáticamente respecto del tiempo la omega, ya
que:

ω=
dt

2
Aviónica

En la práctica, no podemos integrar de forma teórica, por lo que se debe implementar una integral numérica. Lo que se
hará será implementar una función de interrupción con un intervalo de tiempo pequeño para que, en cada ejecución de la
función de interrupción, el programa mida la velocidad de rotación instantánea, multiplique por el intérvalo de tiempo, y
se lo sume a una cantidad previamente calibrada al inicio, theta o psi, en los casos pertinentes.
1 # i n c l u d e <TimerOne . h>
2
3 # d e f i n e T 2000 / / En m i c r o s e g u n d o s
4
5 / / D e f i n i c i ó n de p u e r t o s de l e c t u r a
6 c o n s t i n t p i n _ c a b e c e o =A0 ;
7 c o n s t i n t p i n _ a l a b e o =A1 ;
8
9 / / I n i c i a l i z a c i ó n de v a r i a b l e s
10 double l e c t u r a s [2 ] ;
11 d o u b l e t h e t a =0 ;
12 d o u b l e p s i =0 ;
13
14 / / D e f i n i c i ó n de c o n s t a n t e s , a c o n f i g u r a r p o r c a l i b r a c i ó n
15 a0=0 ; / / V a l o r de o f f s e t
16 a1=0 ; / / V a l o r de g a n a n c i a
17
18 / / F u n c i ó n de i n t e r r u p c i ó n
19
20 void calculo_angulos ( void ) {
21 / / Se o b t i e n e n l o s v a l o r e s de r o t a c i ó n en l a s u n i d a d e s c o r r e c t a s
22 l e c t u r a s [ 0 ] = ( a n a l o g R e a d ( p i n x )−a0 ) * a1 ;
23 l e c t u r a s [ 1 ] = ( a n a l o g R e a d ( p i n z )−a0 ) * a1 ;
24
25 / / Se c a l c u l a n l o s c o r r e s p o n d i e n t e s i n c r e m e n t o s a n g u l a r e s
26 i n c r e m e n t o _ a n g u l a r _ p i t c h = l e c t u r a s [ 0 ] * 0.002 ;
27 i n c r e m e n t o _ a n g u l a r _ r o l l = l e c t u r a s [ 1 ] * 0.002 ;
28
29 / / Se o b t i e n e n l o s c o r r e s p o n d i e n t e s v a l o r e s de á n g u l o
30 theta=theta+incremento_angular_pitch ;
31 psi=psi+incremento_angular_roll ;
32 }
33
34 / / P r o g r a m a de a r r a n q u e
35
36 void setup ( ) {
37 S e r i a l . b e g i n ( 9600 ) ;
38 Timer1 . i n i t i a l i z e ( T ) ;
39 Timer1 . a t t a c h I n t e r r u p t ( c a l c u l o _ a n g u l o s ) ;
40 }
41
42 / / B u c l e de r e p e t i c i ó n
43
44 void loop ( ) {
45 / / I m p r e s i ó n de d a t o s p o r p a n t a l l a
46 Serial . println () ;
47 S e r i a l . p r i n t ( " Angulo de c a b e c e o − Angulo de a l a b e o " ) ;
48 Serial . println () ;
49 Serial . print ( theta ) ;
50 Serial . print ( " − ");
51 Serial . print ( psi ) ;
52 Serial . println () ;
53 d e l a y ( 1000 ) ;
54 }

También podría gustarte