Medición de ángulos de dos planos y corrección de uno con respecto de otro con acelerómetros.
August 19, 2007 – 4:37 pmVamos a realizar la medición de ángulos de dos planos y realizar la corrección de uno con respecto al otro mediante el uso de sensores de alceleración y motores Paso a Paso.
Desarrollo
A través del manejo de sensores analógicos captaremos la aceleración gravitatoria en cada instante que deseamos realizar la medición del ángulo, una vez esto, nos basamos en el principio físico que indica que la aceleración es directamente proporcional al seno del ángulo. Posteriormente realizamos la corrección de la inclinación de un plano con respecto al otro a través del adecuado manejo de motores Paso a Paso (en adelante PAP).
Si bien la medida de la aceleración se realiza en forma analógica, por avances en este tipo de tecnología, la salida que obtendremos se encuentra digitalizada en forma de modulación de ancho de pulso (en adelante PWM) el cual es directamente proporcional a la medición.
La PC tiene el control absoluto de los sensores y de los motores PAP. La misma establece un protocolo de comunicación vía RS-232 con un dispositivo externo (Microchip PIC 16F877A), el cual le entrega el estado de la cuenta de un contador que mide el PWM de cierto acelerómetro que la PC crea necesario sensar. Todo el proceso de medición lleva un tiempo de 6 milisegundos, pero como los sensores tienen la capacidad de medir inercia, nosotros realizaremos un promedio de varias mediciones hasta obtener una medida con baja inestabilidad y así podremos realizar la conversión angular.
Por otro, lado cuando la etapa de sensado esta lista, la PC realiza los cálculos necesarios y manipula los motores PAP mediante el puerto paralelo a través de una etapa de potencia que protege y le da la corriente (amperes) necesaria al mismo.
El movimiento del plano de referencia es realizado por el usuario, mientras que el otro plano es movido automáticamente por los motores PAP, donde se aprecia una copia del movimiento del plano de referencia casi en tiempo real, descartando el tiempo que demoran los motores en posicionarse.
Materiales Utilizados
2 Motores Paso A Paso (JAPAN SERVO CO.)
1.8 DEG / STEP - 9 Volt - 1 Amp.
1 PIC 16F877A (MICROCHIP)
8 Transistores TIP122 (NPN)
2 Acelerómetros Capacitivos ADXL202 2 g. (ANALOG DEVICES) - 5 Volt
1 MAX233 (RS232 – TTL)
Componentes varios (resistencias, capacitores, etc.)
Acelerómetro ADXL202
ADXL202E El sensor lo forma una superficie micromecanizada, es un minúsculo sensor de aceleración de movimiento en un circuito integrado de silicio de bajo costo. Solamente la superficie micromecanizada puede dar la combinación de alta seguridad en su funcionamiento y tamaño pequeño. El elemento sensor del acelerómetro mide cerca de 1 mm².
La superficie micromecanizada es una técnica de procesamiento utilizada para fabricar estructuras mecánicas extremadamente pequeñas de silicio. En realidad, el movimiento del elemento micromecanizado en el acelerómetro es menor de 1 mm². Utilizando los mismos pasos para hacer circuitos electrónicos convencionales, la superficie micromecanizada crea estructuras pequeñas que están cerca de la superficie del silicio, no obstante están libres para moverse.
Cuando se observa el sensor micromecanizado parece una “H”. Los delgados y largos brazos de la “H” están fijos al substrato. Los otros elementos están libres para moverse, lo forman una serie de filamentos finos, con una masa central, cada uno actúa como una placa de un condensador variable, de placas paralelo. La aceleración o desaceleración en el eje “SENSOR”, ejerce una fuerza a la masa central. Al moverse libremente, la masa desplaza las minúsculas placas del condensador, provocando un cambio de capacidad.
Este cambio de capacidad es detectado y procesado para obtener la medida de aceleración.
Motores Paso A Paso
Básicamente estos motores están constituidos por un rotor sobre el que van aplicados distintos imanes permanentes y por cuatro bobinas excitadoras bobinadas en su estator.
Toda la conmutación (o excitación de las bobinas) deber ser externamente manejada por un controlador. La característica principal de estos motores es el hecho de poder moverlos un paso a la vez por cada pulso que se le aplique. Este paso puede variar desde 90° hasta pequeños movimientos de tan solo 1.8°, es decir, que se necesitarán 4 pasos en el primer caso (90°) y 200 para el segundo caso (1.8°), para completar un giro completo de 360°.
Estos motores poseen la habilidad de poder quedar enclavados en una posición o bien totalmente libres. Si una o más de sus bobinas está energizada, el motor estará enclavado en la posición correspondiente y por el contrario quedará completamente libre si no circula corriente por ninguna de sus bobinas.
El algoritmo de la PC
Básicamente la PC se comunica con el dispositivo conectado en el puerto serie a 9600 baudios con el fin de capturar los valores medidos por el acelerómetro, cada vez que se recibe un valor se almacena en una variable y luego se hace el promedio para mantener un valor angular estable. La siguiente es la trama enviada por el dispositivo cada vez que la PC lo solicita. Los valores son almacenados en variables de tipo Int.
0xFF | T2(HIGH) | T2(LOW) | 0xFF | T1Y(HIGH) | T1Y(LOW) | 0XFF | T1X(HIGH) | T1X(LOW) | 0xFF
La PC realiza el arco seno de cada aceleración obtenida, y en caso de que el argumento de la función no sea válido, una rutina de excepción es llamada, la cual teniendo como argumento la operación en la que ocurrió el error, corrige la misma, en nuestro caso, le indicamos que devuelva 0 (cero) como resultado de la operación arco seno.
if (a->type == DOMAIN)
if (!strcmp(a->name,”asin”)) {
a->retval = asin (0);
return 1;
}
return 0;
}
Luego se realiza la diferencia de los ángulos medidos por los dos acelerómetros y se divide por la cantidad de grados por paso de ambos motores, éste valor es entregado a las funciones que ponen en movimiento los mismos. Si bien los motores PAP pueden perder pasos, en la próxima medición se auto corregirán. Además se puede optar guardar en disco los valores de una referencia, para obtener una medida de ángulos con respecto a ella.
El iniciarse el programa realiza una auto configuración de los puertos (el mismo establece como puertos de trabajo al primer puerto serie encontrado y al primer puerto paralelo hallado), esta configuración también puede ser realizada manualmente. Ya que los puertos tienen una esencial importancia, el programa no permite realizar ninguna operación si los mismos no existen o se encuentran incorrectamente configurados.
En pantalla se mostrará la toma de datos y decisión futura de cada medida.
El firmware del PIC 16f877A
Principalmente quiero aclarar que se utilizó este micro porque ya tenía la base donde realizar la conexiones, pero con un micro más pequeño (prodría ser el 16f818) funcionaría perfectamente, lo unico que se busco cuando se eligió en microntrolador es que el mismo tuviera un contador de 16 bits, ya que para realizar la medición del Duty Cycle del PWM, sobre un período de 2ms y trabajando a 20 Mhz. un contador de 8 bits hubise causado Overflow. También se pudo haber implementado una rutina para salvar el overflow sobre el contador de 8 bits pero esa no era la idea principal del proyecto.
Basicamente se utiliza la UART que el mismo posee y para la lectura de bajada de los flancos se implementaron pequeñas rutinas en ASM, si bien el código generado por el compilador C es bastante limpio, consideramos que de esta manera iba a ser más rápido.
En funcionamiento normal, el micro espera una consulta por parte de la PC en formato ASCII, la consulta puede ser por uno de los acelerómetros o por una verificación de comunicación, en esta verificación, el pic genera aleatoriamente 10 bytes de información que son enviados a la PC junto un un checksum, una vez que la PC obtiene todos los bytes realiza una suma descartando el overflow y lo compara con el checksum, comprobando el estado de la conexión.
Aca está el listado del codigo del PIC
#include <math.h>
#include <stdlib.h>
#fuses XT, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define XOUTA 5
#define YOUTA 4
#define XOUTB 3
#define YOUTB 2
#byte PORTB = 6
//(i + n, *(&data + i) ) ;
// estos son los prototipos de las funciones
void start_timer(void);
void acelerometro1 (void);
void acelerometro2 (void);
void test (void);
// se implemento una funcion de lectura en ASM para cada flanco
void edge1 (void);
void edge2 (void);
void edge3 (void);
void edge4 (void);
void edge5 (void);
void edge6 (void);
void edge7 (void);
void edge8 (void);
main () {
int input;
set_tris_a (0b00000);
set_tris_b (0b00111100);
set_tris_c (0b10000000);
set_tris_d (0b00000000);
set_tris_e (0b000);
do{
input=getch();
switch (input) {
case ‘a’: acelerometro1 (); break;
case ‘b’: acelerometro2 (); break;
case ‘t’: test (); break;
}
} while (1);
}
// FUNCIONES COMPLEMENTARIAS
void test (void) {
int i,n,chksum;
chksum=0;
delay_ms (5);
for (i=0;i<10;i++){
n=rand();
putc(n);
chksum+=n;
}
putc(chksum);
}
void acelerometro1 (void) {
int16 Tb,Tc,Td,T1X_A1,T1Y_A1,T2_A1;
edge1 (); //espero que este bajo XOUT
edge2 (); //espero el flanco de subida de XOUT
start_timer(); //pongo a contar
edge1 (); //espero el flanco de bajada de XOUT
Tb=get_timer1(); //tomo el tiempo Tb
edge3 (); //espero que baje YOUT
edge4 (); //espero el flanco de subida de YOUT
Tc=get_timer1(); //tomo el tiempo Tc
edge3 (); //espero el flanco de bajda de YOUT
Td=get_timer1(); //tomo el tiempo Td
T1X_A1=Tb;
T1Y_A1= Td-Tc;
T2_A1= (Td-((Td-Tc)/2))-(Tb/2);
putc (0xff);
putc (*(&T1X_A1));
putc (*(&T1X_A1+1));
putc (0xff);
putc (*(&T1Y_A1));
putc (*(&T1Y_A1+1));
putc (0xff);
putc (*(&T2_A1));
putc (*(&T2_A1+1));
putc (0xff);
} //acelerometro 1 //
void acelerometro2 (void) {
int16 Tb,Tc,Td,T1X_A2,T1Y_A2,T2_A2;
edge5 (); //espero que este bajo XOUT
edge6 (); //espero el flanco de subida de XOUT
start_timer(); //pongo a contar
edge5 (); //espero el flanco de bajada de XOUT
Tb=get_timer1(); //tomo el tiempo Tb
edge7 (); //espero que baje YOUT
edge8 (); //espero el flanco de subida de YOUT
Tc=get_timer1(); //tomo el tiempo Tc
edge7 (); //espero el flanco de bajada de YOUT
Td=get_timer1(); //tomo el tiempo Td
T1X_A2=Tb;
T1Y_A2=Td-Tc;
T2_A2= (Td-((Td-Tc)/2))-(Tb/2);
putc (0xff);
putc (*(&T1X_A2));
putc (*(&T1X_A2+1));
putc (0xff);
putc (*(&T1Y_A2));
putc (*(&T1Y_A2+1));
putc (0xff);
putc (*(&T2_A2));
putc (*(&T2_A2+1));
putc (0xff);
} //acelerometro 2//
void start_timer(void) {
set_timer1 (0);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
}
void edge1 (void) {
#asm
EDGE1:
btfsc PORTB,XOUTA //Wait for low on XOUT
goto EDGE1
#endasm
}
void edge2 (void) {
#asm
EDGE2:
btfss PORTB,XOUTA //Wait for high on XOUT
goto EDGE2
#endasm
}
void edge3 (void) {
#asm
EDGE3:
btfsc PORTB,YOUTA //Look a low level on YOUT
goto EDGE3
#endasm
}
void edge4 (void) {
#asm
EDGE4:
btfss PORTB,YOUTA //Look for rising edge on YOUT
goto EDGE4
#endasm
}
//ACELEROMETRO 2//
void edge5 (void) {
#asm
EDGE5:
btfsc PORTB,XOUTB //Wait for low on XOUT
goto EDGE5
#endasm
}
void edge6 (void) {
#asm
EDGE6:
btfss PORTB,XOUTB //Wait for high on XOUT
goto EDGE6
#endasm
}
void edge7 (void) {
#asm
EDGE7:
btfsc PORTB,YOUTB //Look a low level on YOUT
goto EDGE7
#endasm
}
void edge8 (void) {
#asm
EDGE8:
btfss PORTB,YOUTB //Look for rising edge on YOUT
goto EDGE8
#endasm
}
Agradecimientos
A Seba Pons, con el cual hicimos este proyecto, y me dio su autorización para que yo lo publicara.
Bibliografía
AN-604 APPLICATION NOTE, Using The ADXL202 Duty Cycle Output, Analog Devices, 2002.
ADXL202E Datasheet, REV. A, Analog Devices, 2000.
Http://www.Todorobot.Com.Ar/Productos/Motores/Motores.Htm
Apunte R2CT14 “Puerto Serie” Informática 2 F.R.B.A, Ing. Jorge A. Argibay
Apunte R2CT17 “Puerto Paralelo” Informática 2 F.R.B.A, Ing. Rubén M. Lozano
Apunte R2CT15 “Archivos de Disco” Informática 2 F.R.B.A, Ing. Jorge A. Argibay
Http://www.todopic.com.ar
7 Responses to “Medición de ángulos de dos planos y corrección de uno con respecto de otro con acelerómetros.”
Hola Gabriel:
Muy bueno tu proyecto con los ADXL2xx. Yo estoy armando un datalogger que guarda los datos el comportamiento de un auto del TN. Ya resolví algunos problemas sobre sensores en los amortiguadores y en el chasis.
Ahora estoy con los “virajes” y la “cosa” está orientada con estos benditos ADXL2xx, el único problema que no los puedo conseguir. Me harías el favor de orientarme en dónde los puedo comprar (en Argentina).
Cordiales saludos.
Rodrigo.
By Rodrigo on Sep 19, 2007
hola rodrigo,
te comento que hasta lo que yo sabia no se podian comprar aca esos sensores.
Lo que yo hice fue pedir muestras gratis directamente a la gente Analog.
Fijate si conseguis por ese medio y sino contactame de nuevo a ver si con un poco mas de tiempo me fijo si tengo alguno por ahi tirado.
saludos
By Gabriel on Sep 20, 2007
Buen dato (lo de las muestras gratis). Gracias Master…
Salute. Rodrigo.
By Rodrigo on Sep 24, 2007
Hola Gabriel, bueno después de leer esto me dieron ganas de preguntarte sobre los acelerómetros. Resulta que necesito hacer un medidor de potencia para deportistas, por ej un guante que se lo pongan y hagan un movimiento y captar los datos, después meterlos en una PC y con un soft mostrarles de manera más amigable las cosas. En fin mi duda es, que resolución verdadera tienen, porque por ej 1 Kilo de fuerza equivale a 10 N aprox. y yo necesitaría una resolución no mayor al 3 / 4 % o sea 0.4 N max. es posible esto con estos acelerómetros? Gracias por tomarte el tiempo para la rta. desde ya.
By Aristides on Oct 12, 2007
Aristides
me vas a disculpar pero ya hace rato que no estoy con los acelerometros y no te puedo ayudar con esa informacion, lo que si recuerdo es que en su momento nosotros sacamos toda la info de la página de analog, la cual tenia unos PDF muy copados con bastante info
saludos
gabriel
By Gabriel on Oct 17, 2007
hola me gustaria saber donde puedo conseguir un ADXL202 en BS.AS. necesito alguna direccion o telefono para comprarlo. Gracias
By carlos on Jun 10, 2008
carlos,
yo el micro lo pedi directamente a Analog, no creo que lo esten comercializando aca en argentina, porque no intentas pidiendolo por la web.
cuando tengas alguna novedad hacemelo saber, creo que tengo algun micro tirado por ahi.
By Gabriel on Jun 19, 2008