Munoz Garnica MC Marb
Munoz Garnica MC Marb
UNIDAD ZACATENCO
DEPARTAMENDO DE INGENIERÍA ELÉCTRICA
SECCIÓN DE ELECTRÓNICA DEL ESTADO SÓLIDO
TESIS
Que presenta:
ING. CARMEN CARITINA MUÑOZ GARNICA
En la especialidad de:
Ingeniería Eléctrica
Directores de Tesis:
Dr. Mario Alfredo Reyes Barranca
Dra. Griselda Stephany Abarca Jiménez
A Mis Padres: Por ser la motivación de cada uno de los pasos que doy día a día,
por ser mi más grande apoyo, por estar para mi incondicionalmente y por todos y
cada uno de los sacrificios y actos de amor que han hecho por mí, porque sin
ustedes yo no sería nada.
A mi esposo Aldo: Por ser mi guía y mi apoyo cada día, por brindarme la fuerza
necesaria para salir adelante y estar conmigo en las buenas y malas. Gracias por
toda tu ayuda en esta etapa y por ser esa motivación que necesité cada vez que
quise darme por vencida, por toda la paciencia y el cariño; sólo puedo estar
agradecida contigo por todo lo que haces por mí.
A mi familia: A mis sobrinos, mi hermana y cuñado, por haber sido tan pacientes
conmigo durante este tiempo, pero en especial, por su compañía y apoyo, porque
siempre han estado ahí para brindarme su cariño cuando los he necesitado.
A mis asesores, el Dr. Alfredo Reyes y la Dra. Stephany Abarca: Por recibirme
en su grupo de trabajo y haber puesto su confianza en mí, por el apoyo
incondicional durante mi etapa de maestría y por toda la experiencia y la guía
aportada durante la elaboración de este trabajo, pero especialmente por su
comprensión y entendimiento para conmigo.
A los miembros del jurado: Por cada una de las enseñanzas otorgadas para
mejorar y avanzar en el desarrollo de este proyecto y por sus atinados comentarios
y aportaciones.
Al CONACyT: Por la beca otorgada para poder realizar mis estudios de Maestría
a través del apoyo 489059 con número de registro de becario 634981.
RESUMEN
Índice de Figuras
Figura 1.1 Principio de la Aceleración 6
Figura 1.2 Dispositivo en Forma de Pluma 8
Figura 1.3 Elementos básicos del dispositivo para su funcionamiento 8
Figura 1.4 Conexión inalámbrica entre el dispositivo y una interfaz para la visualización y captura del trazo 9
Figura 1.5 Patente US20050231488A1 11
Figura 1.6 Patente JP2004199591A 13
Figura 1.7 Patente US20060084039A1 16
Figura 2.1 Esquema del Acelerómetro Mecánico 20
Figura 2.2 Diagrama de un Acelerómetro Piezo-Eléctrico 20
Figura 2.3 Diagrama de un Acelerómetro Piezorresistivo 21
Figura 2.4 Sistema de Placas para Sensor Capacitivo 22
Figura 2.5 Esquema del Acelerómetro Capacitivo 23
Figura 2.6 Esquema del Principio de Funcionamiento de un Acelerómetro de Condensador 23
Figura 2.7 Componentes del sensor y ejes de referencia de las variables asociadas 24
Figura 3.1 Módulo MPU-6050 36
Figura 3.2 Descripción del Módulo MPU-6050 37
Figura 3.3 Diagrama de Conexiones 40
Figura 3.4 Módulo Bluetooth HC-05 43
Figura 3.5 Visualización de los datos en la herramienta TeraTerm 46
Figura 3.6 Visualización de los datos en Python 47
Figura 3.7 Primer gráfico obtenido (Nueva Figura) 48
Figura 3.8 Segundo gráfico obtenido (Actualización en la Figura) 48
Figura 3.9 Intento de gráfica a partir de un archivo de texto 49
Figura 3.10 Gráfica en función del tiempo 49
Figura 3.11 Gráfica final de aceleración 50
Figura 3.12 Visualización de los Valores de los ángulos de Inclinación en 2D y 3D 52
Figura 3.13 Diseño Esquemático de la Tarjeta de Circuito Impreso 56
Figura 3.14 Diseño de la Tarjeta de Circuito Impreso 58
Figura 3.15 Impresión de la Tarjeta de Circuito 58
Figura 3.16 Tarjeta de Circuito Impreso Ensamblada 59
Figura 3.17 Ejemplo 1 de los trazos obtenidos 60
Figura 3.18 Ejemplo 2 de los trazos obtenidos 60
Figura 3.19 Ejemplo 3 de los trazos obtenidos 61
Figura 3.20 Ejemplo 4 de los trazos obtenidos 61
Figura 3.21 Ejemplo 5 de los trazos obtenidos 62
Figura 3.22 Página de Presentación de la Interfaz Gráfica de Usuario 63
Figura 3.23 Ventana de Visualización de Gráficos de la Interfaz Gráfica de Usuario 64
Figura 3.24 Proyección Isométrica de la Cubierta del Dispositivo 65
Figura 3.25 Vista Lateral de la Cubierta del Dispositivo 65
Figura 3.26 Proyección Isométrica del Cuerpo 66
Figura 3.27 Ranuras Implementadas en el Cuerpo de la Cubierta 67
Figura 3.28 Corte Longitudinal del Cuerpo de la Cubierta 67
Figura 3.29 Ranuras para las barras de soporte 68
Figura 3.30 Vista de las barras de soporte para la fijación de la tarjeta 68
Figura 3.31 Proyección Isométrica de la Tapa de la Cubierta del Dispositivo 69
Figura 3.32 Cubierta del Dispositivo Impresa 69
Figura 3.33 Piezas Impresas de la Cubierta del Dispositivo 70
Figura 3.34 Vista de las ranuras para las barras de soporte en la pieza impresa 70
Figura 3.35 Integración de los Componentes 71
Figura 3.36 Dispositivo en Funcionamiento 71
Figura 4.1 Dispositivo Lápiz en Funcionamiento 73
Figura 4.2 Prueba de Funcionamiento del Sistema 74
Figura 4.3 Trazo Obtenido del Sistema en Funcionamiento 74
Figura 4.4 Capacidad de Almacenamiento del Trazo 75
Índice de Tablas
Tabla 3.1 Direcciones I2C 37
Tabla 3.2 Rangos de escala y sensitividad 38
Tabla 3.3 Conexiones entre Arduino y MPU6050 39
Tabla 3.4 Conexiones entre el HC-05 y Arduino 43
Tabla 3.5 Componentes implementados en la tarjeta de circuito impreso 56
Índice de Ecuaciones
Ecuación 1.1 Segunda Ley de Newton 5
Ecuación 2.1 Filtro Complementario 30
Ecuación 2.2 Medición de la Aceleración Dinámica 31
Ecuación 3.1 Cálculo del Ángulo en 2D 51
Ecuación 3.2 Cálculo del Ángulo X en 3D 51
Ecuación 3.3 Cálculo del Ángulo Y en 3D 51
Capítulo 1
Introducción
Las siglas MEMS son un acrónimo para denotar a lo que actualmente se conoce
como Sistemas Microelectromecánicos (Microelectromechanical systems). Son
definidos típicamente como dispositivos de pequeñas dimensiones compuestos
por elementos activos y pasivos microfabricados y que realizan diferentes
funciones como percepción, procesado de datos, comunicación y actuación sobre
el entorno. Los tipos de dispositivos MEMS pueden variar desde estructuras
relativamente simples que no tienen ninguna parte móvil, hasta sistemas
electromecánicos muy complejos en los que múltiples elementos se mueven bajo
el control de la electrónica integrada.
1
La motivación para el uso de esta tecnología con respecto a los dispositivos
utilizados hasta ahora es que ofrece, además de un costo menor, un menor
consumo, un peso más reducido y un alto desempeño.
1.1. ANTECEDENTES
1.1.1. Sistemas Microelectromecánicos
Los sistemas microelectromecánicos (MEMS) son pequeños dispositivos
integrados o sistemas que combinan componentes eléctricos y mecánicos. Su
2
tamaño varía desde el nivel submicrométrico (o submicrónico) hasta el nivel
milimétrico, y puede haber cualquier número, desde unos pocos hasta millones,
en un sistema en particular. MEMS extiende las técnicas de fabricación
desarrolladas para la industria de circuitos integrados para agregar elementos
mecánicos como vigas, engranajes, diafragmas y resortes a los dispositivos.
1.1.2. Acelerómetros.
Un acelerómetro como se intuye por su nombre es una herramienta para medir la
aceleración de un objeto al que va unido, lo hace midiendo respecto de una masa
inercial interna.
3
Existen diversos tipos de tecnologías y diseños que, aun cuando todos poseen el
mismo propósito que es medir la aceleración tienen la posibilidad de ser bastante
diversos unos de otros conforme a la aplicación para la cual van destinados y las
condiciones en las que han de desempeñarse. [2]
Muchos acelerómetros operan detectando la fuerza ejercida en una masa por una
limitación elástica. Considerando un sistema mecánico simple como el mostrado
en la Figura 1.1, que consiste en una masa fija (𝑚), con un muelle o resorte con una
rigidez (𝑘) constante. Si la masa se desplaza una distancia 𝑥, la aceleración debida
a la fuerza restauradora del muelle o resorte es 𝐹 = 𝑘 ⋅ 𝑥, conocida como La Ley
de Hooke. Para términos prácticos en esta tesis se hace caso omiso al signo menos
que se incluye en la ley de Hooke, ya que como recordará el lector, la masa inercial
de estudio está referenciada sobre el objeto mismo en movimiento y la aceleración
que experimenta es en sentido opuesto a la aceleración del objeto a medir, por lo
cual resulta correcta esta simplificación.
5
FIGURA 1.1 PRINCIPIO DE LA ACELERACIÓN
6
1.2. PLANTEAMIENTO DEL PROBLEMA
La idea de este proyecto surge para resolver varios problemas que actualmente
presentan los sistemas convencionales como:
1.3. OBJETIVO
Diseñar, fabricar y caracterizar un sistema electrónico capaz de escribir en el aire,
sin ninguna superficie de apoyo, que sea portable (inalámbrico), que permita la
transferencia de los datos (el trazo) en tiempo real, que sea versátil (con un diseño
en forma de pluma), y amigable con el medioambiente, y que, mediante un
segundo dispositivo conectado de forma inalámbrica, se permita la visualización
y el almacenamiento del trazo realizado, basado en el funcionamiento de un
acelerómetro.
7
FIGURA 1.2 DISPOSITIVO EN FORMA DE PLUMA
8
FIGURA 1.4 CONEXIÓN INALÁMBRICA ENTRE EL DISPOSITIVO Y UNA INTERFAZ PARA LA VISUALIZACIÓN Y CAPTURA DEL TRAZO
9
• Desarrollo de una interfaz simple en Python para observar el trazo en forma
de PDF/JPEG/etc.
1.4. JUSTIFICACIÓN
El impacto de la integración de sensores, actuadores y elementos electrónicos a
nivel micrométrico proporciona soluciones con bajo consumo de energía,
reducción en el tamaño de los componentes, mayores anchos de banda de trabajo,
mejorando la calidad de vida, desarrollando mejores aplicaciones y dispositivos en
diversas áreas entre ellas biomedicina (salud y calidad de vida),
telecomunicaciones (radiofrecuencia y redes ópticas), automotriz y aeroespacial
por mencionar algunas. Sin embargo, algunos otros, también son utilizados con
fines tecnológicos, es decir, su uso se dirige más al área comercial y al desarrollo
de dispositivos destinados al entretenimiento o a la prestación de servicios de
menor complejidad, pero de mayor utilidad en las actividades diarias.
10
1.5. ESTADO DEL ARTE
11
o gráficos en la plataforma de la computadora a través del dispositivo de lápiz
electrónico. El dispositivo de lápiz electrónico incluye una unidad de
microprocesamiento (MPU), una unidad de almacenamiento para almacenar
códigos correspondientes al color, una unidad de entrada que permite al usuario
establecer un color de visualización para los datos de escritura a mano y / o
gráficos que se mostrarán en la pantalla. unidad, y un módulo de salida de señal.
Entre sus principales funcionalidades es que permite transmitir el trazo del
usuario con una muy alta fidelidad. Esta característica se la da el sistema de
sensado que utiliza, en este caso un sensor de posición electromagnético. Por otra
parte, entre sus principales desventajas está que requiere una superficie de apoyo,
como una pizarra digital de escritura, para que el transductor electromagnético
funcione. Se puede observar en la Figura 1.5 el diagrama de aplicación del
dispositivo de lápiz electrónico (20) de acuerdo con esta patente, usado con una
plataforma informática, que comprende un host (11), una unidad de detección de
entrada (13), que puede ser una pizarra o tablero digital de escritura a mano, y una
unidad de visualización (14). Tanto la unidad de detección de entrada (13) y la
unidad de visualización (14) están conectadas al ordenador central (11).
Procedencia: Japón
12
FIGURA 1.6 PATENTE JP2004199591A
Procedencia: China
14
delimitada por el dispositivo sobre el cual se traza. Esta invención utiliza de
manera adicional un sistema de sensado óptico que auxilia al sistema de sensado
de presión para lograr un mejor desempeño.
Inventor: 李俊峰
Procedencia: China
16
cuerpo es un cuerpo de madera construido de arce duro girado en un torno que
contiene o sostiene todo el cepillo. electrónica, sensores, cámara, cerdas, etc.
17
18
Capítulo 2
Marco Teórico
A partir de la adaptación del micromaquinado para la definición de
microestructuras en 1982, se tenía que en aquellos años los primeros
acelerómetros eran sistemas de gran complejidad y poco confiables que basaban
su funcionamiento en el desplazamiento de una masa inercial sujeta a la
aceleración con resortes que contrarrestaban el efecto de la fuerza generada por
la masa.
Específicamente, se debe decir que los acelerómetros son sensores inerciales que
miden la segunda derivada de la posición, es decir la fuerza de inercia generada
cuando una masa se ve afectada por un cambio de velocidad. [2]
1
Galgas Extensiométricas: Son dispositivos electrónicos que aprovechan el efecto piezorresistivo para medir
deformaciones. Ante una variación en la estructura del material de la galga se producirá una variación de su
resistencia eléctrica.
19
FIGURA 2.1 ESQUEMA DEL ACELERÓMETRO MECÁNICO
20
Su principal inconveniente radica en su frecuencia máxima de trabajo y en la
incapacidad de mantener un nivel permanente de salida ante una entrada común.
Así que poniendo un cristal de este tipo entre la carcasa (unida al objeto cuya
aceleración se quiere medir) y una masa inercial se producirá una corriente
cuando ocurra una aceleración ya que la masa ejercerá una fuerza sobre el cristal.
Midiendo esta corriente es posible calcular la aceleración, bien directamente si se
trata de un acelerómetro de salida de corriente (𝐶𝑜𝑢𝑙𝑜𝑚𝑏𝑠/𝑔) o bien
convirtiéndola a un voltaje de baja impedancia si se trata de un acelerómetro de
salida de voltaje.
21
2.1.4. Acelerómetros basados en Tecnología Capacitiva.
En este tipo de dispositivos, la distancia o posición de las placas de un micro
condensador de placas paralelas se modifica cuando éste experimenta
aceleraciones. Los sensores basados en esta tecnología miden aceleración siempre
que se encuentren integrados en un chip de silicio. La integración en chips de
silicio reduce diferentes tipos de problemáticas como son la dependencia de
humedad, temperatura, capacidades parásitas, número total de terminales, etc.
Cuando se observa el sensor micromecanizado, éste 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 paralelas, como
se observa en la Fig. 2.4.
22
FIGURA 2.5 ESQUEMA DEL ACELERÓMETRO CAPACITIVO
23
estructura se consigue que se forme una cavidad de aire caliente, que se llama
burbuja, sobre los termopares.
FIGURA 2.7 COMPONENTES DEL SENSOR Y EJES DE REFERENCIA DE LAS VARIABLES ASOCIADAS
Es necesario, además, tener en cuenta al encapsular que se debe dejar una cavidad
de aire, o burbuja, sobre la que se producirá la variación de las condiciones de
temperatura al producirse movimiento. Este cambio de temperatura entre los
termopares creará una señal diferencial que será amplificada y condicionada
según las aplicaciones para las que esté diseñado el acelerómetro, obteniéndose
como salida de éste.
24
2.1.6. Acelerómetros basados en Tecnología Microelectromecánica MEMS.
Los avances en tecnología de sistemas microelectromecánicos (MEMS) han
permitido la detección del movimiento o los sensores de inercia, conocidos como
acelerómetros, para ser puesto en ejecución en muchos usos para las varias
industrias.
Los sistemas MEMS son básicamente una mejora en los procesos de fabricación,
que permite ofrecer ventajas en cuanto a miniaturización, uso eficiente de
potencia, alto rendimiento, portabilidad, y fácil interconexión con sistemas
múltiples.
25
dentro de las industrias de cómputo y de electrónica de consumo para los sensores
basados en MEMS.
Cuando se trata de Unidades de Medida Inercial (IMU por sus siglas en inglés),
la mayoría de éstas tienen 6 DOF (grados de libertad), esto significa que hay 3
acelerómetros monoaxiales y 3 giroscopios monoaxiales dentro de la unidad, pero,
aun así, no es posible medir la posición y orientación precisas del objeto al que
está conectado, los datos del sensor no son lo suficientemente fiables para usarse
de esta manera.
La mejor manera de utilizar una IMU es combinando los datos del acelerómetro y
del giroscopio para obtener la posición angular del objeto. El giroscopio puede
hacer esto integrando la velocidad angular a lo largo del tiempo, mientras que con
el acelerómetro es necesario determinar la posición relativa del vector de gravedad
(fuerza 𝑔) que siempre está visible en el acelerómetro. Esto se puede hacer
fácilmente usando una función arco tangente inversa. Para llevar a cabo esta
combinación de una manera ideal es necesario realizar un correcto filtrado de los
datos.
Uno de los filtros más comúnmente utilizados para llevar a cabo la tarea de
combinar el ángulo calculado por el giroscopio (de rotación) y el ángulo calculado
por el acelerómetro (de inclinación) es el Filtro Kalman, que, aunque posee
muchos atributos, implementarlo resulta muy complejo porque presenta dos
grandes problemas que dificultan su uso, estos son:
27
calculado previamente y además su matriz de incertidumbre, y no requiere
ninguna otra información adicional.
Este enfoque, que ha llegado a llamarse filtro de Kalman, es la base para la mezcla
de datos en los sistemas modernos de navegación inercial asistida y se ha
convertido en una fuente importante de mejora en la precisión de los sistemas de
navegación.
28
Además, el filtro Kalman proporciona un diseño mejorado y flexibilidad operativa.
Como filtro variable en el tiempo, puede acomodar fuentes de error no
estacionarias cuando se conoce su comportamiento estadístico.
El punto clave aquí es que la respuesta de frecuencia de los filtros de paso bajo y
paso alto suman 1 en todas las frecuencias. En su forma más simple, la ecuación
para calcular el ángulo usando el filtro complemento es (Ver Ec. 2.1):
La primera lectura son los datos del giroscopio que se integran en cada paso de
tiempo con el valor del ángulo actual. Después de esto, se combina con los datos
del filtro paso bajo del acelerómetro (ya procesados con la función arco tangente
inversa). 𝐴 y 𝐵 son dos constantes que siempre deben de sumar 1 pero, por
supuesto, se pueden variar para ajustar el filtro correctamente. [5]
30
El filtro complementario se comporta como un filtro pasa altas para la medición
del giroscopio y un filtro pasa bajas para la señal del acelerómetro. Es decir, la
señal del giroscopio manda a corto plazo, y la del acelerómetro a medio y largo
plazo, que es exactamente lo que queremos para compensar sus ventajas y
defectos.
La función del filtro debe utilizarse en un bucle infinito. En cada iteración, los
valores del ángulo de inclinación y rotación se actualizan con los nuevos valores
del giroscopio mediante integración a lo largo del tiempo. Luego, el filtro verifica
si la magnitud de la fuerza vista por el acelerómetro tiene un valor razonable que
podría ser el vector de fuerza g real. Si el valor es demasiado pequeño o grande, se
sabe con certeza que se trata de una perturbación que no se necesita tener en
cuenta. Posteriormente, actualizará los ángulos de inclinación y rotación con los
datos del acelerómetro tomando el porcentaje equivalente a la constante 𝐴 del
valor actual y sumando el porcentaje equivalente a la constante 𝐵 del ángulo
calculado por el acelerómetro. Esto asegurará que la medición no se desvíe, pero
que será muy precisa a corto plazo.
Donde:
𝑋𝐴𝑐𝑡𝑢𝑎𝑙 es el valor actual del sensor, que puede estar dado en volts o en digital.
Para determinar el valor de la aceleración de manera dinámica, solo basta con leer
continuamente el valor que entrega el sensor y sustituirlo en la regla de tres. Cabe
31
aclarar que si se sustituye el valor 𝑋𝐺 en volts, el valor de 𝑋𝑎𝑐𝑡𝑢𝑎𝑙 también deberá
estar en volts; por el contrario, si se sustituye el valor de 𝑋𝐺 en digital, el valor de
𝑋𝑎𝑐𝑡𝑢𝑎𝑙 también deberá estar en digital. Esto se elige según si el acelerómetro es
analógico o digital, respectivamente.
2
Se dice que un sensor es sensitivo al medio, no sensible.
32
Capítulo 3
Desarrollo
3.1. IDENTIFICACIÓN DE LOS REQUERIMIENTOS DE DISEÑO
Para llevar a cabo el correcto desarrollo del proyecto, se debe ser capaz de verlo
como un todo, que estará compuesto por varias partes pequeñas que conllevan a
su vez el progreso del proyecto mediante el cumplimiento de los objetivos
específicos planteados.
El primer punto que se debe conocer es la función deseada a llevar a cabo por el
dispositivo; sabemos que el objetivo que se persigue es ser capaces de realizar
trazos virtuales en el aire que se puedan visualizar, por lo que se requiere de un
algoritmo que desempeñe esta tarea con ayuda de un circuito electrónico del que
al menos basta darse una idea de sus partes. Se conoce que para realizar tareas
semejantes a ésta es necesario hacer uso de un acelerómetro, y que se necesita un
elemento que sea capaz de procesar esta información y pueda enviarla por
comunicación inalámbrica, por lo que se debe tener en cuenta el funcionamiento
de estas tres partes en el desarrollo del que llamaremos “Algoritmo de Escritura
Libre”, para cuyo inicio se necesita establecer una referencia para enseguida llevar
a cabo en primera instancia, la lectura de los datos del acelerómetro, enseguida
que procese esta información y, finalmente, la envíe por medio de la comunicación
inalámbrica a un dispositivo de visualización. Esto a grandes rasgos es el
funcionamiento deseado, buscando en medida de lo posible que la descripción de
dicho algoritmo y de la configuración de sus partes se realice con un lenguaje de
programación libre de licencias ya que el proyecto está orientado a la elaboración
de un producto que puede llegar a ser del tipo comercial.
33
descritos anteriormente y hacer las adecuaciones necesarias para que el sistema
funcione de la forma esperada. Para esto, se propone construir un circuito
electrónico impreso con las menores dimensiones posibles para que éste pueda
asemejarse a un lápiz de escritura digital real semejante a los dispositivos
comerciales actuales, y así como hacer lo posible para que el manejo por el usuario
sea práctico y cómodo.
Con esto es posible concluir los requerimientos de diseño del proyecto con el
siguiente listado a grandes rasgos:
2. Circuito electrónico
34
3.2. PRELIMINARES DEL PROYECTO
Como ya se mencionó anteriormente el dispositivo en el que se basa el proyecto
está compuesto por tres elementos principales que realizan funciones específicas
que son:
Para esto se utilizaron a lo largo del desarrollo de la tesis, tres diferentes placas de
Arduino, primero se utilizó el Arduino Uno, ya que es uno de los más completos
y sencillos de utilizar y no se presentaba ningún inconveniente para poder realizar
las configuraciones y pruebas iniciales.
Tanto con el Arduino Uno como con el Arduino Nano, el algoritmo para la
Escritura Libre trabaja de forma adecuada, mas no ideal, ya que, al enviar la
35
información procesada para poder visualizar la gráfica del trazo, se presentó un
importante retraso en la graficación de los datos, debido a que utilizamos la
misma vía para la obtención de los datos de los módulos implementados y para
enviarlos a nuestro segundo dispositivo. Como resultado, se optó por utilizar el
Arduino Leonardo, que en características es similar a los anteriores, sin embargo,
posee la capacidad de realizar el procesamiento de la información y enviarla de
forma separada, logrando así que el bus de comunicación no se sature,
solucionando con esto el retraso generado en la graficación de los datos.
36
FIGURA 3.2 DESCRIPCIÓN DEL MÓDULO MPU-6050
El pin ADDR internamente en el módulo tiene una resistencia a tierra (GND), por
lo que, si no se conecta, la dirección por defecto será 0x68.
El procesador interno del IMU es capaz de realizar cálculos precisos de los valores
que miden sus sensores internos que son, aceleraciones lineales y angulares, para
informarnos de valores útiles como los ángulos de inclinación con respecto a los 3
ejes principales. Un dato importante es que ni la aceleración ni la velocidad lineal
afectan la medición de giro.
37
La dirección de los ejes está indicada en el módulo el cual hay que tener en cuenta
para no equivocarse en el signo de las aceleraciones. Como la comunicación del
módulo es por medio del protocolo 𝐼 2 𝐶, esto le permite trabajar con la mayoría de
los microcontroladores. En el módulo los pines SCL y SDA tienen una resistencia
de tiro (pull-up) en placa para una conexión directa al microcontrolador que se
esté utilizando.
3.2.2 Acelerómetro.
El acelerómetro (contenido en el módulo MPU-6050) puede medir la aceleración
dinámica, inclinación o vibración y transforma esta magnitud física en otra
magnitud eléctrica que será la que se empleará en los equipos estándar de
adquisición. Los rangos de medida de este acelerómetro van desde las décimas de
𝑔, hasta las decenas de 𝑔.
Cuenta con una resolución de 16-bits, lo cual significa que divide el rango
dinámico en 65,536 fracciones. Estas características aplican para cada eje X, Y y Z
al igual que en la velocidad angular. El sensor es ideal, entre otras cosas, para
diseñar control de robótica, medición de vibración, sistemas de medición inercial
“IMU”, detector de caídas, sensor de distancia y velocidad, y muchas cosas más.
El MPU-6050 mediante el protocolo 𝐼 2 𝐶 regresa unos valores conocidos como
raw o “crudos” según el registro seleccionado.
38
Características Técnicas del MPU-6050.
• Salida digital de 6 ejes
• Interrupciones programables
39
GND GND GND GND
SCL A5 21 3
SDA A4 20 2
En la Figura 3.3 se muestra el diagrama de interconexión que empata con los datos
mostrados en la Tabla 3.3.
40
Se deberá tomar en cuenta que la resolución de las lecturas es de 16 bits por lo que
el rango de lectura es de -32768 a 32767.
3.2.5 Calibración.
Esto es necesario ya que el sensor MPU6050 probablemente de fábrica no se
encuentre 100% en una posición horizontal, esto debido a que al ser soldado en el
módulo puede estar desnivelado agregando un error en cada componente debido
a desalineación con respecto a la base del encapsulado. De igual manera, cuando
se instale el módulo en el proyecto, puede estar desnivelado a pesar de que a
simple vista lo notemos correctamente nivelado.
41
Inicialmente se leen los offsets actuales y se espera que el usuario envíe un caracter
por el puerto serie.
42
FIGURA 3.4 MÓDULO BLUETOOTH HC-05
En este trabajo este módulo quedó asociado al puerto serial denominado “COM9”,
mismo que cambiará para cada dispositivo que el usuario decida emplear con el
receptor, por lo que antes de abrir el Monitor serial, en el IDE Arduino se
selecciona dicho “COM”.
43
4) Y el Modo AT 2, en el que para entrar a este estado el módulo se debe
encender con el botón presionado, después de haber encendido se puede
soltar y permanecerá en este estado.
Los comandos AT, son la base del conjunto de comandos Hayes, que es un
lenguaje desarrollado por la compañía Hayes Communications que prácticamente
se convirtió en estándar abierto de comandos para configurar y parametrizar
módems. Los caracteres «AT», que preceden a todos los comandos, significan
«Atención», e hicieron que se conociera también a este conjunto de comandos
como comandos AT. Con ellos, se puede comprobar la disponibilidad del
dispositivo, y verificar que todo vaya bien
En seguida, se abre el monitor serial del IDE de Arduino y se lleva a cabo, mediante
comandos AT, una prueba de comunicación y la configuración del módulo. Es
posible configurar el nombre del módulo bluetooth, el código de vinculación, la
velocidad de comunicación, el rol de trabajo, el modo de conexión e inclusive
especificar la dirección del dispositivo al cual se desea conectar; sin embargo, para
esta aplicación sólo se cambió del nombre del módulo para su fácil identificación.
44
3.2.7 Primera Prueba.
Se realizó la descripción de la primera rutina (MPU_Bluetooth) que fue creada
con base en el marco de referencia estudiado previamente y en las especificaciones
de la hoja de datos del módulo MPU6050 para realizar lecturas exclusivamente
del acelerómetro descartando al giroscopio y al sensor de temperatura.
Las características que presenta esta primera prueba son las siguientes:
La Figura 3.5, muestra la pantalla que resulta al leer los datos del acelerómetro con
TeraTerm, donde las columnas corresponden, de izquierda a derecha con los ejes
X, Y y Z.
3
TeraTerm: Es un programa de emulador de terminal (comunicaciones) de código abierto, gratuito e
implementado por software que emula diferentes tipos de terminales de computadora.
45
FIGURA 3.5 VISUALIZACIÓN DE LOS DATOS EN LA HERRAMIENTA TERATERM
El primer ejercicio práctico realizado en el lenguaje Python fue obtener los datos
y visualizarlos, justo como se hacía en la herramienta TeraTerm. La Figura 3.6
muestra los resultados obtenidos.
46
FIGURA 3.6 VISUALIZACIÓN DE LOS DATOS EN PYTHON
• El primer resultado obtenido fue el gráfico del punto de cada lectura del
sensor, mismo que al actualizarse generaba una nueva figura, y así por cada
lectura realizada, además que la figura tenía una mala representación de los
ejes ya que sólo indicaba la ubicación de dicho punto, como se puede ver en
la Figura 3.7, en la cual se emplean, como ya se mencionó las lecturas
registradas en los ejes X y Y que corresponden a los valores de aceleración
en ese momento, en esos ejes.
47
FIGURA 3.7 PRIMER GRÁFICO OBTENIDO (NUEVA FIGURA)
48
vez generaba una gráfica. Sin embargo, el archivo de texto se sobrecargaba
y finalmente se encontraba vacío, resultando en la gráfica mostrada en la
Figura 3.9.
• La siguiente prueba realizada fue una de las más acertadas ya que el gráfico
obtenido era algo muy similar a lo esperado. éste permitía visualizar las
aceleraciones y graficar en X y Y, pero, su inconveniente es que es una
gráfica en función del tiempo. Por lo cual después de determinadas lecturas,
la gráfica era insuficiente por lo que los valores anteriores se eliminaban
automáticamente. Esto se puede ver en la Fig. 3.10.
49
• Finalmente, la última de las gráficas con la que se concluyó la etapa de
exploración para la obtención de la gráfica, es una animación que mantiene
fijos los ejes X y Y, que permite que observemos los valores de la aceleración
sin perder ningún dato, teniendo así el trazo del acelerómetro en una gráfica
en el lenguaje Python, como se observa en la Figura 3.11
Para llevar a cabo esta tarea, en la cual se basará la mayor parte del trabajo, ya que
el algoritmo es la parte central en la cual trabajará el sistema, se plantearon tres
primeras hipótesis para su desarrollo, las cuales señalan un buen potencial para
obtener resultados exitosos que cumplan con el funcionamiento esperado; dichas
hipótesis para realizar el trazo son:
50
2) Integración de los datos de aceleración.
Esto sin embargo no descarta que en el camino se formulen nuevas hipótesis o las
aquí presentadas se vean modificadas, mezcladas o descartadas.
Ángulo en 2D:
𝑔𝑥 ECUACIÓN 3.1
𝜃 = arctan ( )
𝑔𝑧
Ángulo en 3D:
𝑎𝑥 ECUACIÓN 3.2
𝜃𝑥 = arctan ( )
√𝑎𝑦2 + 𝑎𝑧2
𝑎𝑦 ECUACIÓN 3.3
𝜃𝑦 = arctan ( )
√𝑎𝑥2 + 𝑎𝑧2
Se debe señalar, que el cálculo de los ángulos se realizó tanto para 2D como para
3D, porque de primera instancia se planeaba utilizar los ángulos en 2D, pero
debido a la perdida de la señal por las asíntotas de la función arcotangente, donde
la función no existe, las lecturas entregadas por el sensor son erróneas en dichos
51
puntos, por lo que la implementación de estos ángulos fue reemplazada por la de
los ángulos en 3D.
La estrategia inicial para esta hipótesis consistió en graficar como puntos los
ángulos obtenidos partiendo de la lectura anterior como nuevo origen y trazando
un vector entre ambos puntos (ya sea con una longitud unitaria o modificando el
módulo con base en medidas experimentales de acuerdo al trazo realizado por el
movimiento natural de la mano).
52
los ángulos de inclinación de la IMU para la graficación del trazo, modifican esta
hipótesis en su forma original.
Por esta razón, se decidió buscar una alternativa que rescate la propuesta de
trabajo y que sea capaz de complementar los resultados obtenidos, por lo que,
analizando las opciones, se decidió utilizar la tercera hipótesis, que en resumen es
una alternativa que permite seguir empleando el ángulo de inclinación.
3.3.2 Algoritmo.
El desarrollo del algoritmo actualmente se basa en la implementación de lo
anterior, es decir se puede describir mediante los siguientes puntos:
53
no corresponde al trazo realizado para la escritura natural, sin embargo, es posible
realizar trayectorias que se asemejen a partir de su inclinación.
Tampoco descarta la existencia de otros métodos que sí cumplan con el trazo para
la escritura natura, sin embargo, sí los excluye por su falta de valor en propuesta
de innovación.
Con pruebas experimentales con los Arduino UNO, Nano y Leonardo, se pudo
comprobar que el desempeño del algoritmo es bueno, robusto y constante, es decir
que se comporta de manera regular sin importar el microcontrolador utilizado
(aunque requiere mejoras), sin embargo se presenta una ligera mejoría al separar
el envío de los datos de su procesamiento, esto último comprobado en el Arduino
Leonardo, por lo que fue posible descartar su uso y reemplazarlo con un
microcontrolador con características similares y de dimensiones óptimas para
este trabajo, eligiéndose así el PIC18F4550.
54
A partir de esto, se realizó el diseño esquemático empleando casi en su totalidad
dispositivos de montaje superficial por cuestiones de estética, pero
principalmente para conseguir el objetivo de llevar a cabo la miniaturización del
circuito, por lo que se colocaron cada uno de los dispositivos y sus componentes
prescindiendo de la implementación de módulos completos, a excepción del
bluetooth para descartar cualquier falla por interferencias y para facilitar su
configuración.
Como se puede observar en el esquemático del circuito, cada uno de los módulos
originalmente empleados en el sistema fue reconstruido con todas y cada una de
sus partes colocando todos los elementos utilizados en el circuito procurando así
que el circuito quedase íntegro y que cada elemento funcione correctamente. Así
mismo, es posible observar que se colocaron dos reguladores de voltaje, uno de
3.3V y uno de 5V, como una medida de seguridad y para otorgarle a cada elemento
dispuesto en el circuito la alimentación requerida. Por último también se
implementaron dos conectores, de 6 pines cada uno, donde el primero estará
enlazado con el PIC18F4550, que al ser de tipo SMD sería imposible de
reprogramar una vez ensamblada la tarjeta de circuito impreso, por lo que se hace
uso de la programación ISP (por sus siglas en inglés, in-system programming) o ICSP
(por sus siglas en inglés, in-circuit serial programming), la cual permite a
algunos dispositivos lógicos programables, microcontroladores y otros circuitos
electrónicos, que sean programados mientras están instalados en un sistema
completo, en lugar de requerir que el chip sea programado antes de ser instalado
dentro del sistema. Este conector facilita entonces cargar el programa del
algoritmo al microcontrolador con cualquier programador de PICs que disponga
de esta función; el segundo de los conectores de 6 pines será utilizado para
ensamblar el módulo bluetooth HC-05 una vez que éste esté configurado.
55
FIGURA 3.13 DISEÑO ESQUEMÁTICO DE LA TARJETA DE CIRCUITO IMPRESO
56
1 Header o conector de Normal
01x02
1 Botón Normal
1 Microcontrolador SMD
PIC18F4550
57
Una vez realizada la disposición de todos los componentes indicados arriba, es
posible realizar el diseño del circuito impreso (PCB), el cual, para facilitar su
elaboración, dispone de dos caras únicamente, una anterior y una posterior.
58
Una vez ensamblados los componentes electrónicos, la PCB puede verse de la
siguiente manera en la Figura 3.16:
El programa descrito para la graficación de los datos del trazo realizado se puede
observar en los anexos de este trabajo de Tesis.
A continuación, se muestran en las Figuras 3.17, 3.18, 3.19, 3.20 y 3.21 los trazos
correspondientes a los gráficos resultantes obtenidos con el algoritmo graficando
los ángulos en el eje X y en el eje Y resultantes de la aplicación del filtro
complementario. En estas figuras se observa que existe un desempeño viable del
mismo, mas no el óptimo. Sin embargo, con ellos se puede comprobar que ya es
posible realizar trazos más armoniosos, incorporar curvaturas en el mismo y que
probablemente con las mejoras adecuadas, permita realizar escritos o figuras que,
aunque no sean realizados bajo el trazo natural del usuario puedan ser dibujados
con movimientos de inclinación del dispositivo.
59
FIGURA 3.17 EJEMPLO 1 DE LOS TRAZOS OBTENIDOS
60
FIGURA 3.19 EJEMPLO 3 DE LOS TRAZOS OBTENIDOS
61
FIGURA 3.21 EJEMPLO 5 DE LOS TRAZOS OBTENIDOS
Una vez obtenida la gráfica del trazo realizado, se desarrolló una interfaz gráfica
(GUI) amigable con el usuario, permitiéndole así la correcta visualización del
trazo y su almacenamiento y a su vez, permita reiniciar el funcionamiento del
dispositivo para crear un nuevo trazo.
La creación de esta GUI, se llevó a cabo con el Diseñador de QT, para permitir así
la conexión entre el programa descrito en Python para la graficación y la interfaz
creada, además de brindar más herramientas de diseño que vuelvan más agradable
a la vista esta interfaz de la aplicación que se le otorgará al usuario. Esta se muestra
en las Figuras 3.22 y 3.23.
Esta interfaz cuenta con una primera página para la introducción del producto
con su nombre característico, que es, Hypen, imágenes demostrativas del
dispositivo y un botón de inicio, como se puede observar en la Figura 3.22.
62
Botón de
Inicio
63
FIGURA 3.23 VENTANA DE VISUALIZACIÓN DE GRÁFICOS DE LA INTERFAZ GRÁFICA DE USUARIO
64
FIGURA 3.24 PROYECCIÓN ISOMÉTRICA DE LA CUBIERTA DEL DISPOSITIVO
65
FIGURA 3.26 PROYECCIÓN ISOMÉTRICA DEL CUERPO
Cabe mencionar que, como parte del diseño, conforme a la disposición de los
elementos en la tarjeta de circuito impreso, en la cara anterior o superior de la caja
se hicieron 3 orificios que facilitan al usuario la operación del dispositivo. El
primero que se encuentra en la parte superior cercana a la tapa y sirve para alojar
el interruptor de encendido del dispositivo; el siguiente sirve para visualizar el led
de operación del dispositivo con lo cual es posible corroborar que se encuentre
encendido o apagado; y por último, el inferior más cercano a la punta del lápiz,
contiene al botón para realizar los trazos, dando así confort durante la experiencia
de uso al usuario ya que de esta forma se obtiene un agarre natural del dispositivo,
como se hace con un lápiz o bolígrafo común. Estos detalles se pueden apreciar en
la Figuras 3.27 y 3.28.
66
FIGURA 3.27 RANURAS IMPLEMENTADAS EN EL CUERPO DE LA CUBIERTA
67
FIGURA 3.29 RANURAS PARA LAS BARRAS DE SOPORTE
La otra parte importante de la cubierta o carcasa es la tapa, la cual posee una forma
cuadrangular que se ajusta a presión al cuerpo del objeto evitando que la
circuitería se salga de posición. Ésta también cuenta con un orificio para
68
introducir el cable que lleva la alimentación al circuito, como se muestra en la
Figura 3.31.
69
FIGURA 3.33 PIEZAS IMPRESAS DE LA CUBIERTA DEL DISPOSITIVO
FIGURA 3.34 VISTA DE LAS RANURAS PARA LAS BARRAS DE SOPORTE EN LA PIEZA IMPRESA
70
FIGURA 3.35 INTEGRACIÓN DE LOS COMPONENTES
71
3.8. CONCLUSIÓN DEL CAPÍTULO
Este capítulo en especial presenta una importante relevancia, ya que muestra el
desarrollo parte por parte del presente trabajo de tesis. Aquí es posible conocer
cada uno de los elementos que conformaran de forma física e intangible al
dispositivo que se realizó, y se explica de manera detallada cada uno de los
procedimientos que se llevó a cabo, desde la estructuración y descripción del
Algoritmo para la Escritura Libre, el diseño de la placa de circuito impreso, la
elaboración de la interfaz gráfica de usuario y por último el diseño de la imagen
del producto.
72
Capítulo 4
73
FIGURA 4.2 PRUEBA DE FUNCIONAMIENTO DEL SISTEMA
74
Por último, la Fig. 4.4 muestra la capacidad del software del dispositivo para
almacenar el trazo y, obtener así, un archivo del que el usuario pueda hacer uso
según su conveniencia.
75
reales del ángulo calculado y que no sufre ninguna pérdida de información al
graficarse.
También, se debe señalar que este trabajo puede llevarse a otras aplicaciones y
enfocarlo en otros usos, o que es posible llevar a cabo la misma tarea mediante
distinto desarrollo de software, aunque carezca de innovación, pero que pueda
presentar resultados más favorecedores en cuanto a su manipulación y la
comodidad de su uso para el usuario, ya que es un dispositivo tan completo, que
la electrónica empleada puede decirse universal para casi todas las aplicaciones
que se puedan implementar, de igual forma, la interfaz creada cuenta con estas
capacidades, por lo que bastaría únicamente con programar al microcontrolador
del dispositivo un algoritmo que cumpla con las características deseadas y que
realice las tareas solicitadas.
Con todas estas características, se puede decir, que el dispositivo obtenido al final
de este trabajo de tesis no sufre de limitaciones para otras implementaciones a
futuro, y que la mayoría de las partes que lo componen, de igual manera, poseen
esta capacidad, teniendo así, un dispositivo que cumple con todos los
requerimientos puntualizados y que además puede modificarse a conveniencia de
otras necesidades y usos.
76
Capítulo 5
Conclusiones
De manera muy puntual, dentro del Grupo de Sistemas de VLSI de la SEES, en
esta ocasión se propuso seleccionar un tema de Tesis que fuese diferente en su
desarrollo a los trabajos realizados habitualmente, ya que se eligió trabajar en la
aplicación de uno de sus principales elementos de estudio, un acelerómetro en su
tipo comercial, dando paso así, a la idea de llevar a cabo un producto que disponga
de este elemento como base de su funcionamiento.
77
• La metodología seguida para definir el algoritmo que se terminó
empleando, fue cambiando conforme al desarrollo del proyecto, debido a la
experimentación y al análisis de las pruebas realizadas, lo que permitió la
implementación de las mejores características o cualidades de cada una de
las hipótesis planteadas en este trabajo.
78
destacar que la implementación de los módulos y elementos electrónicos de
los mismos en tipo SMD brinda ventajas importantes en el ahorro de
espacio y le suma atributos de estética a la tarjeta, teniendo así un diseño
más prolijo y profesional.
79
80
Trabajo Futuro
Es posible comprender este trabajo de tesis como la suma de todas las partes
desarrolladas de este proyecto para la conformación de un todo, que es lo que se
busca, desarrollar un sistema completo de trazos y escritura virtual trabajando en
cada uno de los detalles desde lo más simple hasta lo más complejo y desde la
ingeniería hasta el diseño. Más, sin embargo, la culminación de este proyecto no
implica más que sentar bases y precedentes para proyectos que puedan
desarrollarse a futuro, puesto que, aunque es un trabajo completo y funcional que
cumple con los objetivos planteados al inicio de este trabajo, aún existen
posibilidades de crecer su desarrollo y agregarle nuevas características o
modificar algunas existentes para empatar con otras necesidades tecnológicas
empleadas en distintos enfoques y áreas.
Como ya se hizo mención anteriormente, las características con las que cuenta
nuestro dispositivo son a grandes rasgos, la electrónica necesaria para desarrollar
cualquier función que tenga que ver con ubicar una posición en un plano y poder
enviar esta información de forma inalámbrica para su visualización, por lo que es
casi seguro que no se requieran mayores modificaciones en ese aspecto, pero si
pudiendo variar sus dimensiones, sin dejar de tener la posibilidad de manipular la
tarea que desempeñe.
• Rediseño de su imagen.
82
Referencias
1. Historia de los MEMS. Antecedentes. Recuperado de
http://www.csa.com/discoveryguides/mems/overview.php
2. Universidad de Sevilla. Diseño Integrado. Capítulo 4 Sensor medidor de Aceleración
ACELERÓMETRO. Recuperado de
http://bibing.us.es/proyectos/abreproy/11638/fichero/Capitulo+4.pdf
3. Universidad Politécnica de Catalunya. Diseño e implementación de un acelerómetro,
velocímetro móvil digital Controlado por un PIC de MICROCHIP. Recuperado de
https://upcommons.upc.edu/bitstream/handle/2099.1/7998/Mem%C3%B2ria.pdf
4. Corona Ramírez L. G., & Abarca Jiménez G. S., & Mares Carreño J. (2015). Sensores y Actuadores.
Aplicaciones con Arduino®. México: Grupo Editorial Patria S.A. de C.V.
5. Pieter-Jan (2013). Reading an IMU Without the Kalman. Recuperado de http://www.pieter-
jan.com/node/11
6. Kalman, R.E., "A New Approach to Linear Filtering and Prediction Problems", J. Basic Eng.,
March 1960.
7. Kalman, R.E. and Bucy, R.S., "New Results in Linear Filtering and Prediction Theory”, J. Basic
Eng., March 1961.
8. A short Course on Kalman Filtering Theory, The Analytic Sciences Corporation, Reading,
Mass., EM-146,1969.
9. Ditecno Makers (2019). Como configurar el acelerómetro y giroscopio del MPU6050.
Recuperado de https://ditecnomakers.com/como-configurar-el-acelerometro-y-giroscopio-del-
mpu-6050/
10. Naylamp Mechatronics (2016). Configuración del módulo bluetooth HC-05 usando comandos
AT. Recuperado de https://naylampmechatronics.com/blog/24_configuracion-del-modulo-
bluetooth-hc-05-usa.html
83
84
Apéndice
CÓDIGO PARA LA CALIBRACIÓN DEL MÓDULO MPU-6050 EN ARDUINO
// Librerias I2C para controlar el mpu6050
// la libreria MPU6050.h necesita I2Cdev.h, I2Cdev.h necesita Wire.h
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
void setup() {
Serial.begin(57600); //Iniciando puerto serial
Wire.begin(); //Iniciando I2C
sensor.initialize(); //Iniciando el sensor
Serial.println("Offsets:");
Serial.print(ax_o); Serial.print("\t");
85
Serial.print(ay_o); Serial.print("\t");
Serial.print(az_o); Serial.print("\t");
Serial.print(gx_o); Serial.print("\t");
Serial.print(gy_o); Serial.print("\t");
Serial.print(gz_o); Serial.print("\t");
Serial.println("nnEnvie cualquier caracter para empezar la
calibracionnn");
// Espera un caracter para empezar a calibrar
while (true){if (Serial.available()) break;}
Serial.println("Calibrando, no mover IMU");
void loop() {
// Leer las aceleraciones y velocidades angulares
sensor.getAcceleration(&ax, &ay, &az);
sensor.getRotation(&gx, &gy, &gz);
f_ay = f_ay-(f_ay>>5)+ay;
p_ay = f_ay>>5;
f_az = f_az-(f_az>>5)+az;
p_az = f_az>>5;
f_gx = f_gx-(f_gx>>3)+gx;
p_gx = f_gx>>3;
f_gy = f_gy-(f_gy>>3)+gy;
p_gy = f_gy>>3;
f_gz = f_gz-(f_gz>>3)+gz;
p_gz = f_gz>>3;
86
else {ay_o++;}
if (p_az-16384>0) az_o--;
else {az_o++;}
sensor.setXAccelOffset(ax_o);
sensor.setYAccelOffset(ay_o);
sensor.setZAccelOffset(az_o);
sensor.setXGyroOffset(gx_o);
sensor.setYGyroOffset(gy_o);
sensor.setZGyroOffset(gz_o);
counter=0;
}
counter++;
}
87
CÓDIGO PARA OBTENER LAS MEDICIONES DE ACELERACIÓN Y VELOCIDAD
ANGULAR DEL MÓDULO MPU-6050 EN ARDUINO
// Librerias I2C para controlar el mpu6050
// la libreria MPU6050.h necesita I2Cdev.h, I2Cdev.h necesita Wire.h
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
void setup() {
Serial.begin(57600); //Iniciando puerto serial
Wire.begin(); //Iniciando I2C
sensor.initialize(); //Iniciando el sensor
void loop() {
// Leer las aceleraciones y velocidades angulares
sensor.getAcceleration(&ax, &ay, &az);
sensor.getRotation(&gx, &gy, &gz);
delay(100);
}
88
CÓDIGO DE PRUEBA DEL MÓDULO MPU-6050 EN ARDUINO
#include <Wire.h>
89
#define MPU6050_GYRO_YOUT_H 0x45 // R
#define MPU6050_GYRO_YOUT_L 0x46 // R
#define MPU6050_GYRO_ZOUT_H 0x47 // R
#define MPU6050_GYRO_ZOUT_L 0x48 // R
#define MPU6050_EXT_SENS_DATA_00 0x49 // R
#define MPU6050_EXT_SENS_DATA_01 0x4A // R
#define MPU6050_EXT_SENS_DATA_02 0x4B // R
#define MPU6050_EXT_SENS_DATA_03 0x4C // R
#define MPU6050_EXT_SENS_DATA_04 0x4D // R
#define MPU6050_EXT_SENS_DATA_05 0x4E // R
#define MPU6050_EXT_SENS_DATA_06 0x4F // R
#define MPU6050_EXT_SENS_DATA_07 0x50 // R
#define MPU6050_EXT_SENS_DATA_08 0x51 // R
#define MPU6050_EXT_SENS_DATA_09 0x52 // R
#define MPU6050_EXT_SENS_DATA_10 0x53 // R
#define MPU6050_EXT_SENS_DATA_11 0x54 // R
#define MPU6050_EXT_SENS_DATA_12 0x55 // R
#define MPU6050_EXT_SENS_DATA_13 0x56 // R
#define MPU6050_EXT_SENS_DATA_14 0x57 // R
#define MPU6050_EXT_SENS_DATA_15 0x58 // R
#define MPU6050_EXT_SENS_DATA_16 0x59 // R
#define MPU6050_EXT_SENS_DATA_17 0x5A // R
#define MPU6050_EXT_SENS_DATA_18 0x5B // R
#define MPU6050_EXT_SENS_DATA_19 0x5C // R
#define MPU6050_EXT_SENS_DATA_20 0x5D // R
#define MPU6050_EXT_SENS_DATA_21 0x5E // R
#define MPU6050_EXT_SENS_DATA_22 0x5F // R
#define MPU6050_EXT_SENS_DATA_23 0x60 // R
#define MPU6050_MOT_DETECT_STATUS 0x61 // R
#define MPU6050_I2C_SLV0_DO 0x63 // R/W
#define MPU6050_I2C_SLV1_DO 0x64 // R/W
#define MPU6050_I2C_SLV2_DO 0x65 // R/W
#define MPU6050_I2C_SLV3_DO 0x66 // R/W
#define MPU6050_I2C_MST_DELAY_CTRL 0x67 // R/W
#define MPU6050_SIGNAL_PATH_RESET 0x68 // R/W
#define MPU6050_MOT_DETECT_CTRL 0x69 // R/W
#define MPU6050_USER_CTRL 0x6A // R/W
#define MPU6050_PWR_MGMT_1 0x6B // R/W
#define MPU6050_PWR_MGMT_2 0x6C // R/W
#define MPU6050_FIFO_COUNTH 0x72 // R/W
#define MPU6050_FIFO_COUNTL 0x73 // R/W
#define MPU6050_FIFO_R_W 0x74 // R/W
#define MPU6050_WHO_AM_I 0x75 // R
#define MPU6050_ADDRESS 0x68
void setup(void){
Serial.begin(9600);
Wire.begin();
delay(50);
90
MPU6050_configuracion(MPU6050_CONFIG,0x03); //(EXT_SYNC_SET=0,
DLPF_CFG=3)
MPU6050_configuracion(MPU6050_GYRO_CONFIG,0x10); //(XG_ST=0,
YG_ST=0, ZG_ST=0, FS_SEL=2 [1000°/s] )
MPU6050_configuracion(MPU6050_ACCEL_CONFIG,0x10); //(XA_ST=0,
YA_ST=0, ZA_ST=0, FS_SEL=2 [8g] )
MPU6050_configuracion(MPU6050_PWR_MGMT_1,0x00);
//(DEVICE_RESET=0, SLEEP=0,
// CYCLE=0, TEMP_DIS=0, CLK_SEL=0 [Internal 8MHz oscillator] )
delay(50);
}
void loop(void){
unsigned short int gyro_x_h=0, gyro_x_l=0, gyro_y_h=0,
gyro_y_l=0,gyro_z_h=0, gyro_z_l=0;
unsigned short int accel_x_h=0, accel_x_l=0,
accel_y_h=0,accel_y_l=0, accel_z_h=0, accel_z_l=0;
unsigned short int temp_h=0, temp_l=0;
int gyro_x=0, gyro_y=0, gyro_z=0;
int accel_x=0, accel_y=0, accel_z=0;
int temp=0;
Wire.beginTransmission(MPU6050_ADDRESS);
Wire.write(MPU6050_ACCEL_XOUT_H);
Wire.requestFrom(MPU6050_ADDRESS, 14);
accel_x_h = Wire.read();
accel_x_l = Wire.read();
accel_y_h = Wire.read();
accel_y_l = Wire.read();
accel_z_h = Wire.read();
accel_z_l = Wire.read();
temp_h = Wire.read();
temp_l = Wire.read();
gyro_x_h = Wire.read();
gyro_x_l = Wire.read();
gyro_y_h = Wire.read();
gyro_y_l = Wire.read();
gyro_z_h = Wire.read();
gyro_z_l = Wire.read();
Wire.endTransmission();
accel_x=(((int)accel_x_h)<<8 ) | ((int)accel_x_l);
accel_y=(((int)accel_y_h)<<8 ) | ((int)accel_y_l);
accel_z=(((int)accel_z_h)<<8 ) | ((int)accel_z_l);
temp=(((int)temp_h)<<8 ) | ((int)temp_l);
gyro_x=(((int)gyro_x_h)<<8 ) | ((int)gyro_x_l);
gyro_y=(((int)gyro_y_h)<<8 ) | ((int)gyro_y_l);
gyro_z=(((int)gyro_z_h)<<8 ) | ((int)gyro_z_l);
Serial.print("Giroscopio x,y,z: ");
Serial.print(gyro_x);
Serial.print(",");
Serial.print(gyro_y);
Serial.print(",");
Serial.println(gyro_z);
Serial.print("Acelerometro x,y,z: ");
91
Serial.print(accel_x);
Serial.print(",");
Serial.print(accel_y);
Serial.print(",");
Serial.println(accel_z);
Serial.print("Temperatura: ");
Serial.println((float)temp/340 + 36.53); //basado en la hoja de
especificaciones
Serial.println();
delay(500);
}
92
CÓDIGO PARA LA CONFIGURACIÓN DEL MÓDULO BLUETOOTH HC-05 EN
ARDUINO
#include <SoftwareSerial.h>
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH); //Enciende el LED 13 durante 4s antes de
configurar el Bluetooth
delay(4000);
93
CÓDIGO PARA EL CÁLCULO DEL ÁNGULO DE INCLINACIÓN DE LA IMU EN
ARDUINO
// Librerias I2C para controlar el mpu6050
// la libreria MPU6050.h necesita I2Cdev.h, I2Cdev.h necesita Wire.h
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
void setup() {
Serial.begin(57600); //Iniciando puerto serial
Wire.begin(); //Iniciando I2C
sensor.initialize(); //Iniciando el sensor
void loop() {
// Leer las aceleraciones
sensor.getAcceleration(&ax, &ay, &az);
//Calcular los angulos de inclinacion:
float accel_ang_x=atan(ax/sqrt(pow(ay,2) +
pow(az,2)))*(180.0/3.14);
float accel_ang_y=atan(ay/sqrt(pow(ax,2) +
pow(az,2)))*(180.0/3.14);
//Mostrar los angulos separadas por un [tab]
Serial.print("Inclinacion en X: ");
Serial.print(accel_ang_x);
Serial.print("tInclinacion en Y:");
Serial.println(accel_ang_y);
delay(10);
}
94
CÓDIGO PARA EL CÁLCULO DEL ÁNGULO DE ROTACIÓN DE LA IMU EN ARDUINO
// Librerias I2C para controlar el mpu6050
// la libreria MPU6050.h necesita I2Cdev.h, I2Cdev.h necesita Wire.h
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
void setup() {
Serial.begin(57600); //Iniciando puerto serial
Wire.begin(); //Iniciando I2C
sensor.initialize(); //Iniciando el sensor
void loop() {
// Leer las velocidades angulares
sensor.getRotation(&gx, &gy, &gz);
dt = millis()-tiempo_prev;
tiempo_prev=millis();
girosc_ang_x_prev=girosc_ang_x;
girosc_ang_y_prev=girosc_ang_y;
95
Serial.print("tRotacion en Y: ");
Serial.println(girosc_ang_y);
delay(100);
}
96
CÓDIGO PARA EL CÁLCULO DE LOS ÁNGULOS DE INCLINACIÓN Y ROTACIÓN DE
LA IMU EN ARDUINO
// Librerias I2C para controlar el mpu6050
// la libreria MPU6050.h necesita I2Cdev.h, I2Cdev.h necesita Wire.h
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
long tiempo_prev;
float dt;
float ang_x, ang_y;
float ang_x_prev, ang_y_prev;
void setup() {
Serial.begin(57600); //Iniciando puerto serial
Wire.begin(); //Iniciando I2C
sensor.initialize(); //Iniciando el sensor
void loop() {
// Leer las aceleraciones y velocidades angulares
sensor.getAcceleration(&ax, &ay, &az);
sensor.getRotation(&gx, &gy, &gz);
dt = (millis()-tiempo_prev)/1000.0;
tiempo_prev=millis();
97
ang_x_prev=ang_x;
ang_y_prev=ang_y;
Serial.print("Rotacion en X: ");
Serial.print(ang_x);
Serial.print("tRotacion en Y: ");
Serial.println(ang_y);
delay(10);
}
98
CÓDIGO PARA EL ALGORITMO DE ESCRITURA LIBRE EN ARDUINO
//PROGRAMA CON MODIFICACIONES PARA ARDUINO LEONARDO
//programa que emplea switch
// MPU-6050 FILTRO COMPLEMENTARIO
// retardo para sincronizar comunicacion
#include <Wire.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5);
99
#define MPU6050_ACCEL_ZOUT_L 0x40 // R
#define MPU6050_EXT_SENS_DATA_00 0x49 // R
#define MPU6050_EXT_SENS_DATA_01 0x4A // R
#define MPU6050_EXT_SENS_DATA_02 0x4B // R
#define MPU6050_EXT_SENS_DATA_03 0x4C // R
#define MPU6050_EXT_SENS_DATA_04 0x4D // R
#define MPU6050_EXT_SENS_DATA_05 0x4E // R
#define MPU6050_EXT_SENS_DATA_06 0x4F // R
#define MPU6050_EXT_SENS_DATA_07 0x50 // R
#define MPU6050_EXT_SENS_DATA_08 0x51 // R
#define MPU6050_EXT_SENS_DATA_09 0x52 // R
#define MPU6050_EXT_SENS_DATA_10 0x53 // R
#define MPU6050_EXT_SENS_DATA_11 0x54 // R
#define MPU6050_EXT_SENS_DATA_12 0x55 // R
#define MPU6050_EXT_SENS_DATA_13 0x56 // R
#define MPU6050_EXT_SENS_DATA_14 0x57 // R
#define MPU6050_EXT_SENS_DATA_15 0x58 // R
#define MPU6050_EXT_SENS_DATA_16 0x59 // R
#define MPU6050_EXT_SENS_DATA_17 0x5A // R
#define MPU6050_EXT_SENS_DATA_18 0x5B // R
#define MPU6050_EXT_SENS_DATA_19 0x5C // R
#define MPU6050_EXT_SENS_DATA_20 0x5D // R
#define MPU6050_EXT_SENS_DATA_21 0x5E // R
#define MPU6050_EXT_SENS_DATA_22 0x5F // R
#define MPU6050_EXT_SENS_DATA_23 0x60 // R
#define MPU6050_MOT_DETECT_STATUS 0x61 // R
#define MPU6050_I2C_SLV0_DO 0x63 // R/W
#define MPU6050_I2C_SLV1_DO 0x64 // R/W
#define MPU6050_I2C_SLV2_DO 0x65 // R/W
#define MPU6050_I2C_SLV3_DO 0x66 // R/W
#define MPU6050_I2C_MST_DELAY_CTRL 0x67 // R/W
#define MPU6050_SIGNAL_PATH_RESET 0x68 // R/W
#define MPU6050_MOT_DETECT_CTRL 0x69 // R/W
#define MPU6050_USER_CTRL 0x6A // R/W
#define MPU6050_PWR_MGMT_1 0x6B // R/W
#define MPU6050_PWR_MGMT_2 0x6C // R/W
#define MPU6050_FIFO_COUNTH 0x72 // R/W
#define MPU6050_FIFO_COUNTL 0x73 // R/W
#define MPU6050_FIFO_R_W 0x74 // R/W
#define MPU6050_WHO_AM_I 0x75 // R
#define MPU6050_ADDRESS 0x68
void setup() {
Serial.begin(9600);
timer = millis();
100
mySerial.begin(9600);
pinMode(7, INPUT);
Wire.begin();
delay(50);
MPU6050_configuracion(MPU6050_CONFIG, 0x03); //(EXT_SYNC_SET=0,
DLPF_CFG=3)
MPU6050_configuracion(MPU6050_ACCEL_CONFIG, 0x10); //(XA_ST=0,
YA_ST=0, ZA_ST=0, FS_SEL=2 [8g] )
MPU6050_configuracion(MPU6050_PWR_MGMT_1, 0x00);
//(DEVICE_RESET=0, SLEEP=0,
// CYCLE=0, TEMP_DIS=0, CLK_SEL=0 [Internal 8MHz oscillator] )
delay(50);
tiempo_prev=millis();
}
void loop() {
unsigned short int gyro_x_h=0, gyro_x_l=0, gyro_y_h=0,
gyro_y_l=0,gyro_z_h=0, gyro_z_l=0;
unsigned short int accel_x_h = 0, accel_x_l = 0, accel_y_h = 0,
accel_y_l = 0, accel_z_h = 0, accel_z_l = 0;
int gyro_x=0, gyro_y=0, gyro_z=0;
int accel_x = 0, accel_y = 0, accel_z = 0;
int sw;
int accel_ang_xz, accel_ang_yz, accel_ang_xy, accel_ang_x3,
accel_ang_y3, accel_ang_z3;
double proyX, proyY;
//ADQUISION DE DATOS
Wire.beginTransmission(MPU6050_ADDRESS);
Wire.write(MPU6050_ACCEL_XOUT_H);
Wire.requestFrom(MPU6050_ADDRESS, 14);
accel_x_h = Wire.read();
accel_x_l = Wire.read();
accel_y_h = Wire.read();
accel_y_l = Wire.read();
accel_z_h = Wire.read();
accel_z_l = Wire.read();
gyro_x_h = Wire.read();
gyro_x_l = Wire.read();
gyro_y_h = Wire.read();
gyro_y_l = Wire.read();
gyro_z_h = Wire.read();
gyro_z_l = Wire.read();
Wire.endTransmission();
accel_x = (((int)accel_x_h) << 8 ) | ((int)accel_x_l);
accel_y = (((int)accel_y_h) << 8 ) | ((int)accel_y_l);
accel_z = (((int)accel_z_h) << 8 ) | ((int)accel_z_l);
gyro_x=(((int)gyro_x_h)<<8 ) | ((int)gyro_x_l);
101
gyro_y=(((int)gyro_y_h)<<8 ) | ((int)gyro_y_l);
gyro_z=(((int)gyro_z_h)<<8 ) | ((int)gyro_z_l);
dt = (millis()-tiempo_prev)/1000.0;
tiempo_prev=millis();
//CALCULO DE ANGULOS
ang_x_prev=ang_x;
ang_y_prev=ang_y;
// proyX= 0.5*cos(ang_x);
// proyY= 0.5*sin(ang_x);
sw = digitalRead(7);
if (sw == LOW) {
mySerial.print(ang_x);
102
mySerial.print(",");
mySerial.print(ang_y);
mySerial.print(",");
mySerial.println(sw);
}
if (sw == HIGH) {
mySerial.print(0);
mySerial.print(",");
mySerial.print(0);
mySerial.print(",");
mySerial.println(sw);
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Serial.println(dt);
103
CÓDIGO PARA EL ALGORITMO DE ESCRITURA LIBRE EN C
/*
* MPU6050 Interfacing with PIC18F4550
* http://www.electronicwings.com
*/
#include <pic18f4550.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "USART_Header_File.h" /* Include USART header file */
#include "I2C_Master_File.h"
#include "MPU6050_res_define.h"
#include "Configuration_header_file.h"
void MPU6050_Init()
/* Gyro initialization function */
{
MSdelay(150); /* Power up time >100ms */
/*I2C_Start_Wait(0xD0);
I2C_Write(PWR_MGMT_1); /* Write to power management
register */
/*I2C_Write(0x01); /* X axis gyroscope reference frequency
*/
/*I2C_Stop();
104
I2C_Start_Wait(0xD0);
I2C_Write(CONFIG); /* Write to Configuration register */
/*I2C_Write(0x00); /* Fs = 8KHz */
/*I2C_Stop();
I2C_Start_Wait(0xD0);
I2C_Write(GYRO_CONFIG); /* Write to Gyro configuration
register */
/*I2C_Write(0x18); /* Full scale range +/- 2000 degree/C */
/*I2C_Stop();
I2C_Start_Wait(0xD0);
I2C_Write(INT_ENABLE); /* Write to interrupt enable
register */
/*I2C_Write(0x01);
I2C_Stop();
*/
void MPU_Start_Loc()
{
I2C_Start_Wait(0xD0); /*
I2C start with device write address */
I2C_Write(ACCEL_XOUT_H); /*
Write start location address from where to read */
I2C_Repeated_Start(0xD1); /*
I2C start with device read address */
}
void main()
{
char buffer[20];
int Ax,Ay,Az,T,Gx,Gy,Gz;
float Xa,Ya,Za,t,Xg,Yg,Zg;
int aax3,aay3,aaz3;
float angx,angy;
float angxp=0,angyp=0;
int uno=1, cero=0;
OSCCON = 0x72;
TRISCbits.TRISC0=1;
I2C_Init();
/* Initialize I2C */
MPU6050_Init();
/* Initialize Gyro */
105
USART_Init(9600);
/* Initialize USART with 9600 baud rate */
while(1)
{
MSdelay2 (140);
MPU_Start_Loc(); /*
Read Gyro values continuously and send to terminal over USART */
Ax = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
Ay = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
Az = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
T = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
Gx = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
Gy = (((int)I2C_Read(0)<<8) | (int)I2C_Read(0));
Gz = (((int)I2C_Read(0)<<8) | (int)I2C_Read(1));
I2C_Stop();
aax3=atan(Ax/sqrt(Ay*Ay+Az*Az))*(180.0/3.14);
aay3=atan(Ay/sqrt(Ax*Ax+Az*Az))*(180.0/3.14);
aaz3=atan(Az/sqrt(Ax*Ax+Ay*Ay))*(180.0/3.14);
angx=0.7*(angxp+(Gx/131)*0.001)+0.3*aax3;
angy=0.7*(angyp+(Gy/131)*0.001)+0.3*aay3;
angxp=angx;
angyp=angy;
if (TRISC0 == 1){
sprintf(buffer,"%.2f,",angx);
USART_SendString(buffer);
sprintf(buffer,"%.2f,",angy);
USART_SendString(buffer);
sprintf(buffer,"%i \r \n",cero);
USART_SendString(buffer);
if (TRISC0 == 0){
sprintf(buffer,"%i,",cero);
USART_SendString(buffer);
sprintf(buffer,"%i,",cero);
USART_SendString(buffer);
sprintf(buffer,"%i \r \n",uno);
USART_SendString(buffer);
106
//USART_SendString(buffer);
//sprintf(buffer," T = %.2f%cC\t",t,0xF8); /*
0xF8 Ascii value of degree '°' on serial */
//USART_SendString(buffer);
//sprintf(buffer," Gx = %.2f%c/s\t",Xg,0xF8);
//USART_SendString(buffer);
//sprintf(buffer," Gy = %.2f%c/s\t",Yg,0xF8);
//USART_SendString(buffer);
//sprintf(buffer," Gz = %.2f%c/s\r\n",Zg,0xF8);
//USART_SendString(buffer);
}
}
107
CÓDIGO PARA LA RECEPCIÓN DE LOS DATOS VÍA BLUETOOTH EN PYTHON
import serial
import time
import matplotlib.pyplot as plt
import numpy as np
def Init():
port="COM9"
bluetooth=serial.Serial(port, 9600)
print("Connected")
bluetooth.flushInput()
return bluetooth
def Adq(myBlue):
bluetooth=myBlue
input_data=bluetooth.readline()
print(input_data.decode())
#time.sleep(0.01)
new_data=input_data.decode().split(",")
x=float(new_data[0])
y=float(new_data[1])
#z=int(new_data[2])
print(x)
print(y)
#print(z)
return x, y
108
CÓDIGO PARA LA GRAFICACIÓN EN PYTHON
import serial
import time
from matplotlib import pyplot
from matplotlib.animation import FuncAnimation
import numpy as np
import Bluetoo
from datetime import datetime
blue=Bluetoo.Init()
x_data=[]
y_data=[]
xoff=0.0
yoff=0.0
figure = pyplot.figure()
line, = pyplot.plot(x_data, y_data, 'o')
def update(frame):
global xoff, yoff
xs,ys=Bluetoo.Adq(blue)
xs=xs+xoff
ys=ys+yoff
x_data.append(-xs)
y_data.append(ys)
xoff=xs
yoff=ys
line.set_data(x_data, y_data)
figure.gca().relim()
figure.gca().autoscale_view()
return line,
pyplot.show()
blue.close()
print('Disconnected...')
109
CÓDIGO FUENTE DE LA INTERFAZ GRÁFICA DE USUARIO EN QT CREATOR PARA
PYTHON
#include "hypen.h"
#include "ui_hypen.h"
Hypen::Hypen(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Hypen)
{
ui->setupUi(this);
}
Hypen::~Hypen()
{
delete ui;
}
void Hypen::on_pushButton_clicked()
{
ui->stackedWidget->setCurrentIndex(1);
}
void Hypen::on_buttonBox_accepted()
{
void Hypen::on_buttonBox_rejected()
{
ui->stackedWidget->setCurrentIndex(0);
}
110
VISTAS FRONTAL, SUPERIOR Y LATERAL DEL CUERPO DE LA CUBIERTA DEL
DISPOSITIVO
111
VISTAS FRONTAL, SUPERIOR Y LATERAL DE LA BARRA DE SOPORTE DERECHA
DE LA CUBIERTA DEL DISPOSITIVO
112
VISTAS FRONTAL, SUPERIOR Y LATERAL DE LA BARRA DE SOPORTE IZQUIERDA
DEL CUERPO DE LA CUBIERTA DEL DISPOSITIVO
113
VISTAS FRONTAL, SUPERIOR Y LATERAL DEL TAPÓN DE LA CUBIERTA DEL
DISPOSITIVO
114