Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Acelermetro MAA7361
El MMA7361LC es un acelermetro micromecanizado capacitivo de baja potencia, con
acondicionamiento de seal, filtro de 1 polo, compensacin de temperatura, autoprueba,
deteccin de 0g que detecta la cada libre lineal y g-Select que permite seleccionar entre 2
sensibilidades . El offset y la sensibilidad de cero-g se ajustan de fbrica y no requieren
dispositivos externos. El MMA7361LC incluye un modo de reposo que lo hace ideal para
electrnica de mano con pilas.
Acel x
MMA7361
Acel y
Acel z
Arduino UNO
Despejando x se tiene que x = 0.042, lo cual representa el factor por el cual debe
multiplicarse la variable para obtener finalmente una salida en aceleracin, como la
mostrada en la figura 4.
Aceleracin (m/s2)
Tiempo (s)
Figura 4. Seal de aceleracin en el eje Y con ruido.
Como se observa de la figura 4, la seal oscila en un rango de aproximadamente 9.81 2 ,
que corresponde correctamente con la magnitud fsica del campo gravitacional terrestre.
//Filtro de Kalman
Pc = P + varProceso;
G = Pc/(Pc + varVoltX);
P = (1-G)*Pc; // Covarianza del error asociada a la estimacin a
posteriori en cada iteracin
Xp = Xe; //Valor a posteriori = Valor estimado (Xe = 0.0 primer
iteracin)
Zp = Xp; //Actualizacin del valor medido
Xe = G*(acelX-Zp)+Xp; // Valor estimado por el Filtro de Kalman*/
En la figura 6 se observa el resultado de la seal filtrada mediante el algoritmo de Kalman
implementado.
Seal ruido
Seal filtrada
Aceleracin (m/s2)
Tiempo (s)
Figura 6. Grafica comparativa de seal filtrada vs seal ruidosa.
Por otra parte variando el valor de , se puede disminuir an ms el ruido en la seal, sin
embargo, la seal filtrada presentar un retraso respecto de la seal con ruido, ejemplo de
ello se aprecia en la figura 8.
Aceleracin (m/s2)
Tiempo (s)
Figura 7. Efecto de retraso en la seal filtrada considerando = 1 = 5E-6.
La seal filtrada fue graficada en el IDE de Arduino mediante el Serial Plotter (ver Figura 6 y
7), sin embargo, para la integracin de la seal, esta es enviada va puerto serie a la
computadora, a una taza de 9600 baudios, y mediante un enlace con Matlab Simulink se
procede a la integracin.
Comunicacin arduino-Simulink (doble integracin de la seal de aceleracin)
Para introducir los datos provenientes del puerto serie, el cual corresponde al puerto USB
donde est conectado Arduino a la computadora, es preciso ubicar el nmero exacto del
puesto COM asignado por el sistema operativo (Windows), para ello puede revisarse desde
el IDE de arduino siguientico la ruta mostrada en la figura 8.
Figura 10. Ubicacin del bloque Query Instrument, dentro de la librera de Simulink.
Para acceder a los parmetros del bloque, es necesario hacer doble clic sobre l, y se
desplegar una ventana como la mostrada en la fiura 11.
1.- En el parmetro Block Sample Time, tiene que indicrsele un valor de Inf, puesto que de
esta forma el bloque acceder a los datos del puerto serie, cuando se presente uno.
Introducir: Inf
Figura 14. Acceso a los parmetros del modelo para introducir la funcin de CallBack.
En la ventana de propiedades del modelo (ver figura 15), se introduce el siguiente cdigo
de Matlab, en el apartado de: InitFnc del cuadro Model CallBacks.
serialPort = 'COM11';
serialObject = serial(serialPort);
set(serialObject, 'BaudRate',9600);
fopen(serialObject);
pause(1);
En el cdio introducido se indica el puerto COM que se le asign a la placa Arduino, tambin
se declara la variable de tipo Serial, en este caso nombrada como serialObject, as mismo
se indica la velocidad de trasmisin de datos: 9600 baudios, que debe de coincidir con el de
Arduino. Final mente se tiene que abrir el puerto con la funcin fopen(). Este fragmento de
cdigo se correr cada vez que se ejecute la simulacin.
Mtodo de
integracin
Ganancia igual a 1
Tiempo de
muestreo
Figura 18. Establecimiento del umbral de la zona muerta, de -0.5 a 0.5 se toma como cero.
Bloque To Workspace
Este bloque sirve para transferir los datos desde Simulink hacia el workspace de Matlab,
realizando esto con el objetivo del posterior graficado de los datos. Dentro del bloque tiene
que especificarse el nombre de la variable con el que se guardarn los datos y el tipo de
variable, es recomendable que sea de tipo Array, para facilidad en el tratamiento de los
datos, como se observa en la figura 19.
Nombre de la
variable
Tipo de dato
void loop() {
int sensorVal = analogRead(sensorPin);
float vol = map(sensorVal, 0, 1023, -550, 400);
float acelX = vol * 0.04;
//Filtro de Kalman
Pc = P + varProcess;
G = Pc/(Pc + varVoltX); // ganancia de Kalman
P = (1-G)*Pc;
Xp = Xe;
Zp = Xp;
Xe = G*(acelX-Zp)+Xp; // Valor estimado por el Filtro de Kalman*/