Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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:
dθ
ω=
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 }