Tfg-3545-Blanco Gonzalez
Tfg-3545-Blanco Gonzalez
Tfg-3545-Blanco Gonzalez
Formato
PuestadeaPublicación de la
punto de un Escuela
sistema Técnica
inalámbri-
Superior
co dedebajo
Ingeniería
coste para análisis vibratorios:
MPU6050 y módulo ESP8266 .
Autor:Autor:
F. Javier Payán
Víctor Somet
Javier Blanco González
Tutor:Tutor:
Juan Pedro
José Murillo
Galvín Fuentes
Barrera
Dpto.
Dep.Mecánica deSeñal
Teoría de la Medios Continuos y Teoría de
y Comunicaciones
Escuela Técnica Estructuras
Superior de Ingeniería
Universidad
Escuela de Sevilla
Técnica Superior de Ingeniería
Universidad de Sevilla
Sevilla, 2013
Sevilla, 2021
Proyecto Fin de Grado
Grado en Ingeniería Aeroespacial
Autor:
Víctor Javier Blanco González
Tutor:
Pedro Galvín Barrera
Catedrático
El tribunal nombrado para juzgar el trabajo arriba indicado, compuesto por los siguientes profesores:
Presidente:
Vocal/es:
Secretario:
Fecha:
Agradecimientos
Al profesorado.
I
Resumen
ste proyecto fin de grado se centrará en la puesta a punto de un sistema de bajo coste para la
E elaboración de análisis vibratorios, realizando la adquisición de datos de manera inalámbri-
ca. Para llevar a cabo dicho objetivo se ha contado con acelerómetros MPU6050 y módulos ESP8266.
III
Abstract
his final degree project will focus on the tuning of a low-cost system for the development of
T vibratory analysis, acquiring data wirelessly. MPU6050 accelerometers and ESP8266 modules
have been used to carry out this goal.
In this document, a chronological follow-up will be accomplished through the different configu-
rations that have been tested, concerning electronics, until the optimum is reached, aiming at the
frequency of data acquisition, which is the main characteristic when a vibratory analysis is executed.
Finally, the operation of the system will be checked by comparing it with more sophisticated
equipment that the Department of Mecánica de Medios Continuos y Teoría de Estructuras has in
the school laboratories.
V
Índice Abreviado
Resumen III
Abstract V
Índice Abreviado VII
1 Introducción y objetivos 1
1.1 Estado del arte 1
1.2 Objetivos y medios de cumplimiento 4
Índice de Figuras 79
VII
VIII Índice Abreviado
Índice de Tablas 81
Índice de Códigos 83
Bibliografía 85
Índice alfabético 87
Glosario 87
Índice
Resumen III
Abstract V
Índice Abreviado VII
1 Introducción y objetivos 1
1.1 Estado del arte 1
1.1.1 Estado actual de la metodología 1
1.1.2 Conclusiones de la metodología 3
1.2 Objetivos y medios de cumplimiento 4
IX
X Índice
4.3 Resultados 46
4.3.1 Comparativa excitación tipo seno de 10Hz [Con cable] 48
4.3.2 Comparativa excitación tipo seno de 20Hz [Con cable] 48
4.3.3 Comparativa excitación tipo seno de 30Hz [Con cable] 49
4.3.4 Comparativa excitación tipo seno de 40Hz [Con cable] 50
4.3.5 Comparativa excitación tipo seno de 50Hz [Con cable] 51
4.3.6 Comparativa excitación tipo burst random de 50Hz [Con cable] 51
4.3.7 Comparativa excitación tipo seno de 10Hz [Inalámbrico] 52
4.3.8 Comparativa excitación tipo seno de 20Hz [Inalámbrico] 53
4.3.9 Comparativa excitación tipo seno de 30Hz [Inalámbrico] 53
4.3.10 Comparativa excitación tipo seno de 40Hz [Inalámbrico] 54
4.3.11 Comparativa excitación tipo seno de 50Hz [Inalámbrico] 55
4.3.12 Comparativa excitación tipo burst random de 50Hz [Inalámbrico] 56
4.3.13 Filtrado de las señales arrojadas por el MPU6050 56
4.4 Conclusiones de los resultados obtenidos 59
4.5 Código elaboración de gráficas 60
Índice de Figuras 79
Índice de Tablas 81
Índice de Códigos 83
Bibliografía 85
Índice alfabético 87
Glosario 87
1 Introducción y objetivos
Este proyecto se centrará en la puesta a punto de un sistema inalámbrico para análisis vibratorios.
Con este objetivo se analizará cual es el estado actual de la metodología, sistemas empleados,
recurriendo al sector industrial donde los análisis vibratorios en la maquinaria juegan un papel
esenciales. Finalmente, se expondrán los objetivos del proyecto y los medios a analizar para su
cumplimiento.
El Análisis de Vibración es una técnica empleada para identificar y predecir anomalías mecánicas en
en una determinada estructura, midiendo la vibración e identificando las frecuencias involucradas.
Esta vibración es registrada por un acelerómetro y los datos son procesados por un analizador de
espectro. La aplicación de esta técnica en el mantenimiento predictivo mejora en gran medida la
eficiencia y la fiabilidad.
Los equipos encargados de realizar dichos análisis vibratorios son instrumentos utilizados para
medir, almacenar y diagnosticar la vibración producida por una determinada excitación. Estos
equipos emplean herramientas basadas en el FFT.
En los últimos 20 años se han mejorado los procesos de mantenimiento predictivo y las herramien-
tas utilizadas para realizarlo. En particular, la tecnología del análisis de vibraciones ha evolucionado
a niveles inimaginables.
Una de las últimas tendencias en la tecnología empleada para la realización de análisis vibratorios es
la utilización de sistemas de Monitoreo de Vibraciones con transmisión inalámbrica, remplazando
estos a los acelerómetros por cable convencionales. Dichos sistemas cuentan con un conjunto de
elementos involucrados en la adquisición y análisis de uno o más parámetros, con el fin de identificar
cambios en el comportamiento de la maquinaria. Monitorear estos parámetros ayuda a identificar
futuras fallas como pueden ser: desbalance, fallas en engranes, holgura y muchas otras.
1
2 Capítulo 1. Introducción y objetivos
Como ya se ha comentado, los acelerómetros empleados son sensores de Vibración por Bluetooth
y a continuación se muestran algunos modelos:
• Phantom ATEX: es un Sensor de Vibración Triaxial capaz de enviar 3 señales de FFT. Este
sensor de vibración también es capaz de activarse al detectar altos niveles de vibración con el
fin de enviar datos de vibración y alarma.
Como se ha podido apreciar, la monitorización inalámbrica es una tecnología puntera que permite
conocer a tiempo real cual es el estado de un determinado cuerpo. Además, al ser la transmisión sin
cable, la instalación se simplifica bastante y permite el seguimiento desde cualquier dispositivo.
4 Capítulo 1. Introducción y objetivos
Para las dos configuraciones anteriores se han probado diferentes métodos de adquisición de
datos con el objetivo de aumentar la frecuencia en dicha adquisición. Para la primera configuración
se han realizado los siguientes métodos:
• Extracción de los valores volcados en la página web con Excel (web scraping).
• Extracción de los valores de la página web directamente con MATLAB.
Con la segunda configuración:
• Extracción de los valores por el puerto serie directamente desde MATLAB.
• Extracción de los valores con un software proporcionado por Roger Meier [2] que captura los
datos del puerto serie en un archivo .txt, haciendo uso del lenguaje de programación Python.
Una vez se determine la configuración que mejores resultados presente, cumpliendo con los
requisitos, se hará una comparativa con equipos profesionales en el sector. Finalmente, se expondrán
las conclusiones y las líneas de trabajos futuros para alcanzar los objetivos iniciales.
2 Descripción de la electrónica y su
funcionamiento
El MPU-6050 es una unidad de medidas inerciales (IMU) de seis grados de libertad, que combina
un acelerómetro de tres ejes y un giroscopio de tres ejes. Este es uno de los IMUs más empleados
por su gran calidad y precio. Normalmente, se encuentra integrado en módulos como el GY-521
que incorporan la electrónica necesaria para el correcto uso de la IMU y facilita el acceso a sus
pines. Aunque la tensión de alimentación del PMU6050 es de bajo voltaje entre 2.4 y 3.6V, este
módulo incluye un regulador de voltaje que permite alimentar directamente a 5V [6].
El MPU-6050 incorpora un procesador interno DMP (Digital Motion Processor) que ejecuta
complejos algortimos de MotionFusion para combinar las mediciones de los sensores internos,
evitando tener que realizar los filtros de forma exterior. Además, consta de convertidores anológico-
digital, tres para los ejes del acelerómetro y otros tres para los del giroscopio. Como se verá más
adelante, es posible ajustar la precisión de estos variando los rangos de salidas.
La transmisión de datos entre el módulo ESP8266 y la IMU se realizará a través del sistema de
comunicación I2C con una frecuencia de 400 kHz [6].
5
6 Capítulo 2. Descripción de la electrónica y su funcionamiento
Características Medida
Con el objetivo de obtener la mayor sensibilidad, se ha configurado con el rango ±2g, más que
suficiente para la labor que va a desempeñar.
Características Medida
No se hará uso del giroscopio en nuestro proyecto, con lo cual, se dejará la configuración que
viene por defecto.
El estándar I2C (Inter-Integrated Circuit) fue desarrollado por Philips en 1982 para la comunicación
interna de dispositivos electrónicos en sus artículos. Posteriormente, fue adoptado progresivamente
por otros fabricantes hasta convertirse en un estándar del mercado [4].
Una de las principales características del bus I2C es que requiere únicamente dos cables para
su funcionamiento, uno para la señal de reloj (CLK: Serial CLocK) y otro para el envío de datos
(SDA: Serial DAta) [4].
En el bus cada dispositivo dispone de una dirección, con el objetivo de acceder a cada uno de
estos de manera individual. En general, cada dispositivo debe tener asignada una única dirección.
Se tiene una arquitectura de tipo maestro-esclavo. El dispositivo maestro inicia la comunicación
con los esclavos y puede mandar o recibir datos de estos.
El bus es síncrono: el maestro proporciona una señal de reloj que mantiene sincronizados a todos
los dispositivos del bus. De este modo, se elimina la necesidad de que cada dispositivo contenga
su propio reloj, tenga que acordar una velocidad de transmisión y mecanismos para mantener esta
sincronizada [4].
Para poder realizar la comunicación con solo un cable de datos, el bus I2C emplea una trama
amplia. La comunicación consta de:
• 7 bits para la dirección del dispositivo esclavo con el que queremos comunicar.
• Un bit restante reservado para indicar la intención: enviar o recibir información.
• Un bit de validación.
• Uno o más bytes son los datos enviados o recibidos del esclavo.
• Un bit de validación.
Con los 7 bits de de dirección es posible acceder a 112 dispositivos en un mismo bus, ya que de
las 128 direcciones posibles se reservan 16 para usos especiales. EL incremento de datos enviados,
18bits por cada 8bits de datos, supone que, en general, la velocidad del bus I2C es reducida. La
velocidad estándar de transmisión es de 100kHz con un modo de alta velocidad de 400kHz [4].
En la siguiente figura se muestra el sistema de codificación para el inicio de la comunicación y la
transmisión de datos.
Como se observa en el esquema, cuando no está iniciada la comunicación tanto la señal de reloj
como la de datos se encuentran a uno. Tras esto, un flanco de bajada en SDA indica el inicio de
la comunicación. Los siguientes 7 bits determinan la dirección del esclavo, luego, se indica si es
lectura o escritura y el siguiente flanco de subida finaliza con el proceso de inicio.
Una vez conectado, la señal de reloj se encontrará a cero y la de datos a uno. De nuevo, un flanco
de bajada en SDA inicia el proceso de comunicación, enviándose o recibiéndose paquetes de 8 bits.
Se pondrá fin a la comunicación cuando haya un flanco de subida en SDA estando SCL activa y no
encontrándose en mitad del proceso de transmisión o recepción de datos [4].
8 Capítulo 2. Descripción de la electrónica y su funcionamiento
Como conclusión, se presentan las siguientes ventajas y desventajas de la comunicación I2C. Por
un lado, requiere pocos cables: dispone de mecanismos para verificar que la señal ha llegado y, por
otro lado, su velocidad es media-baja, no es full duplex y no hay verificación de que el contenido
del mensaje sea correcto [4].
Para la codificación del MPU6050 en IDE de Arduino se comenzó, en un principio, utilizando las
librerías desarrolladas por Jeff Rowberg: "I2Cdev.h" y "MPU6050.h" y la librería "Wire.h" con la
que cuenta el propio software de Arduino. Finalmente, se terminó usando únicamente la librería
"Wire.h" ya que para nuestra aplicación, las desarrolladas por Jeff Rowberg no se han considerado
necesarias [3].
En la siguiente imagen, se muestra como es la conexión entre el módulo ESP8266 y el MPU6050.
Por un lado, los pines 4 y 5 están destinados para la comunicación I2C, siendo el 4(SDA) y el
5(SCL). Por otro lado, como se verá más adelante en el código, es necesario indicar la dirección
del MPU6050. Esta puede ser 0x68 o 0x69, dependiendo del estado del pin AD0: 0x69(HIGH) o
0x68(LOW). Si no se especifica lo contrario, la dirección por defecto será 0x68.
Ahora, se pasa a mostrar los dos códigos para la lectura del acelerómetro. Un primer código en el
que se utilizan las tres librerías y un segundo donde únicamente se usa la librería "Wire.h" [3].
MPU6050 sensor;
void setup() {
Serial.begin(57600); //Iniciando puerto serial 57600 bits/s(=baudios)
Wire.begin(); //Iniciando I2C
sensor.initialize(); //Iniciando el sensor
void loop() {
// Lectura de las aceleraciones
sensor.getAcceleration(&ax, &ay, &az);
Como se puede observar, "sensor.getAcceleration(ax, ay, az)" nos muestra el valor de la aceleración
en el rango [−32767, 32768] ya que se tiene un convertidor analógico-digital de 16bits como se ha
comentado anteriormente. Puesto que se ha ajustado el rango de aceleraciones a ±2g, 1g equivale a
216 /4 = 16384.
void setup(){
Serial.begin(115200);
Wire.beginTransmission(MPU1);
Wire.write(0x6B);// PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
void loop(){
// Lectura de las aceleraciones
Wire.beginTransmission(MPU);
Wire.write(0x3B); //Pedir el registro 0x3B - corresponde al AcX
Wire.endTransmission(false);
Wire.requestFrom(MPU,6,true); //A partir del 0x3B, se piden 6
registros
ax=Wire.read()<<8|Wire.read(); //Cada valor ocupa 2 registros
ay=Wire.read()<<8|Wire.read();
az=Wire.read()<<8|Wire.read();
Como ya se ha comentado, existen varios parámetros que pueden ser configurados, como son la
sensibilidad y escala del sensor o la frecuencia de corte del filtro LPF (low pass filter) que incorpora
a la salida. En este proyecto se han dejado dichos parámetros como vienen por defecto. No obstante, a
continuación se explicará como se realizaría la configuración en los casos en los que fuese necesario
[5].
La configuración se hará con el siguiente caso práctico: 500o /s para el giróscopo, ±2g para el
acelerómetro y 98Hz de frecuencia de corte para el filtro de salida. Será necesario disponer del
datasheet del MPU6050 de donde se extraerán los diferentes registros [5].
Como se puede observar en el siguiente código, en primer lugar se hace uso del registro 6B para
activar el modo configuración del sensor y poder modificar los parámetros internos. Seguidamente,
los registros 1B y 1C para configurar el giróscopo y el acelerómetro respectivamente. Finalmente, el
registro 1A asociado al filtro pasa bajos de la salida. Todas estas configuraciones se insertan dentro
de una subrutina que se ejecutará una única vez al iniciar el programa [5].
Wire.beginTransmission(MPU6050_address);
Wire.write(0x1A); // LPF registro 1A hex
Wire.write(0x03); // 256Hz(0ms):0x00 - 188Hz(2ms):0
x01 - 98Hz(3ms):0x02 - 42Hz(4.9ms):0x03 - 20Hz(8.5ms):0x04 - 10Hz
(13.8ms):0x05 - 5Hz(19ms):0x06
Wire.endTransmission();
}
Por último, es muy conveniente siempre calibrar el sensor y eliminar el offset. Esta tarea juega
un papel realmente importante cuando se desea emplear el sensor para estimar la inclinación de
un determinado objeto o vehículo. Generalmente la calibración del giróscopo y del acelerómetro
se realizan de forma separada durante la inicialización del código. Para ello, se toman un número
considerado de muestras tanto del giróscopo como del acelerómetro y se calcula el valor medio,
siendo este valor medio el offset del sensor (es imprescindible mantener el sensor lo más estático
posible durante la calibración) [5].
Para los objetivos de este proyecto será suficiente con eliminar los offset manualmente. Para ello, se
coloca el sensor en una superficie horizontal y se ajustan las salidas para que únicamente indique
una aceleración igual a la de la gravedad en el eje z.
12 Capítulo 2. Descripción de la electrónica y su funcionamiento
En cuanto al consumo, este dependerá de diferentes factores como el modo en el que esté trabajando,
los protocolos que se estén utilizando, la calidad de la señal WiFi y, sobre todo, de si se envía o se
recibe información a través de la WiFi. Los valores oscilan entre los 0.5µA cuando el dispositivo
está apagado y 170mA cuando se transmite [8].
El módulo wifi con el que se ha trabajado ha sido concretamente el ESP8266-DevKitC-02D-F,
cuyo fabricante es Espressif Systems. Estos módulos son pequeñas placas que ahorran espacio
y están diseñadas para admitir varios módulos ESP8266, incluidos ESP-WROOM-02D y ESP-
WROOM-02U. Estas herramientas de desarrollo ESP8266-DevKitC cuentan con 5V to 3.3V LDO,
dual switch, USB-to-UART bridge, micro USB port, boot button e I/O connector [8].
El primer paso que se debe dar es la instalación de la placa ESP8266 en el IDE de Arduino. Esto
es posible gracias a la comunidad ESP8266 que creó un complemento para el IDE Arduino que
permite programar el ESP8266, utilizando este y su lenguaje de programación. Para realizar dicha
instalación solo es necesario completar los siguientes pasos [7]:
• 1. Una vez se está en el IDE de Arduino, se despliega la pestaña de Archivo y se hace clic en
preferencia.
• 2. Se pega el siguiente enlace hhttp:// arduino.esp8266.com/ stable/ package_esp8266com_
index.jso en el campo "Gestor de URLs Adicionales de Tarjetas" y se acepta.
• 3. Se despliega la pestaña de Herramientas y se hace clic en Placa > Gestor de Tarjetas. Se
busca ESP8266 y se pulsa instalar para la" ESP8266 por ESP8266 Comunidad".
• Después de unos segundos debe aparecer como instalado, dándose por terminada la instala-
ción.
La codificación del ESP8266 en Arduino no es fija, por esta razón se detallará en función de la
configuración en el siguiente capítulo.
3 Descripción de las diferentes
configuraciones
15
16 Capítulo 3. Descripción de las diferentes configuraciones
En esta sección se hará una descripción detallada del código. Código que es cargado en el módulo
ESP8266 para poder llevar a cabo lo anteriormente comentado.
En primer lugar, se introducen las librerías necesarias. Por un lado, la librería Open Source
"ESPAsyncWebServer" que permite crear un servidor asíncrono, es decir, que es capaz de atender
a varios clientes de forma simultánea. Para que esta librería funcione se debe añadir también "
Async TCP". Por otro lado, se incluyen las necesarias tanto para comunicarse con los acelerómetros
como para identificar la placa en el IDE de Arduino. Por último, se añaden las librerías para usar el
lenguaje HTML (CSS) y la inserción de los logos en la página web.
En las dos líneas siguientes se le facilitan los credenciales para que la conexión con la red local
sea satisfactoria.
Se pasa a definir tanto la dos direcciones para la comunicación I2C como las diferentes variables
que se van a utilizar. Generalmente, las variables que almacenan tiempo se definen como "unsigned
long", ya que su valor crece rápidamente. La variable "interval" determina el tiempo que transcurre
3.1 Datos volcados en página web + adquisición con Excel o Matlab 17
AsyncWebServer server(80);
Las siguientes líneas van asociadas tanto a la programación de la página web como a la configura-
ción de la actualización automática cada X segundos de dicha página, con JavaScript. Con la etiqueta
<meta> se consigue que nuestra página web responda en cualquier navegador. La etiqueta <Link> per-
mite cargar los iconos del sitio web font awesome: https:// fontawesome.com/ icons?d=gallery&p=2.
Entre las etiquetas <style></style> se agrega algo de Css para darle estilo a la página web: básica-
mente se está configurándola para que muestre el texto con fuente Arial en un bloque sin márgenes
y centrado. Dentro de las etiquetas <body></body> es donde se establece el contenido de la página
web: con las etiquetas <h2></h2> se agrega un encabezado a la misma y los párrafos están delimita-
dos por las etiquetas <p> y </p>. Como se puede observar, las variables que se actualizan llevan
asociado una etiqueta entre %, Ej: %ACELX1 %. Resaltar que, a nuestro parecer, una de las mejores
páginas para aprender HTML de forma dinámica y autodidacta es: https:// www.w3schools.com/ .
Por último, las sentencias entre las etiquetas <script></script> configuran la actualización de las
diferentes variables de aceleración en la página web cada X(ms) definido en la variable "interval",
como ya se ha comentado.
}
h2 { font-size: 3.0rem; }
p { font-size: 3.0rem; }
.units { font-size: 1.2rem; }
.dht-labels{
font-size: 1.5rem;
vertical-align:middle;
padding-bottom: 15px;
}
.image1 {
float:left;
text-align: center;
}
.image2 {
float:right;
text-align: center;
}
.title {
border: 3px outset white;
background-color: white;
text-align: center;
}
.table1 {
float:left;
margin-top:20px;
margin-left:50px;
border: 3px outset lightblue;
background-color: white;
width:850px;
text-align: center;
}
.table2 {
float:right;
margin-top:20px;
margin-right:50px;
border: 3px outset lightblue;
background-color: white;
width:850px;
text-align: center;
}
</style>
</head>
<body>
<div class="image1">
<img src="Logo_US" alt="Logo_US" style="width:100px;height:100px;">
</div>
<div class="image2">
3.1 Datos volcados en página web + adquisición con Excel o Matlab 19
<div class="title">
<h2>ESP8266 MPU6050 Server</h2>
</div>
<div class="table1">
<h2>MPU6050_1</h2>
<p>
<i class="fas fa-arrows-alt-v" style="color:#059e8a;"></i>
<span class="dht-labels">Acelx1</span>
<span id="Acelx1">%ACELX1%</span>
<sup class="units">m/s^2</sup>
</p>
<p>
<i class="fas fa-arrows-alt-h" style="color:#059e8a;"></i>
<span class="dht-labels">Acely1</span>
<span id="Acely1">%ACELY1%</span>
<sup class="units">m/s^2</sup>
</p>
<p>
<i class="fas fa-arrow-down" style="color:#059e8a;"></i>
<span class="dht-labels">Acelz1</span>
<span id="Acelz1">%ACELZ1%</span>
<sup class="units">m/s^2</sup>
</p>
</div>
<div class="table2">
<h2>MPU6050_2</h2>
<p>
<i class="fas fa-arrows-alt-v" style="color:#059e8a;"></i>
<span class="dht-labels">Acelx2</span>
<span id="Acelx2">%ACELX2%</span>
<sup class="units">m/s^2</sup>
</p>
<p>
<i class="fas fa-arrows-alt-h" style="color:#059e8a;"></i>
<span class="dht-labels">Acely2</span>
<span id="Acely2">%ACELY2%</span>
<sup class="units">m/s^2</sup>
</p>
<p>
<i class="fas fa-arrow-down" style="color:#059e8a;"></i>
<span class="dht-labels">Acelz2</span>
<span id="Acelz2">%ACELZ2%</span>
<sup class="units">m/s^2</sup>
</p>
20 Capítulo 3. Descripción de las diferentes configuraciones
</div>
</body>
Para actualizar los valores de las aceleraciones se dispone de la función "setInterval()" que se
ejecuta en el intervalo especificado. Esta función lo que hace es realizar unas solicitudes en las
URL/Acel- -, esto para cada eje y sensor, para obtener las últimas lecturas de las aceleraciones. Una
vez que recibe los valores, actualiza los elementos HTML cuyo id son Acel- -.
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("Acely1").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/Acely1", true);
xhttp.send();
}, 100 ) ;
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("Acelz1").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/Acelz1", true);
xhttp.send();
}, 100 ) ;
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("Acelx2").innerHTML = this.responseText;
3.1 Datos volcados en página web + adquisición con Excel o Matlab 21
}
};
xhttp.open("GET", "/Acelx2", true);
xhttp.send();
}, 100 ) ;
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("Acely2").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/Acely2", true);
xhttp.send();
}, 100 ) ;
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("Acelz2").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/Acelz2", true);
xhttp.send();
}, 100 ) ;
</script>
</html>)rawliteral";
Es necesario crear la función processor() que reemplazará las etiquetas del texto HTML con los
valores actualizados de aceleraciones.
}
else if(var == "ACELZ2"){
return String(azprint2);
}
return String();
}
Se procede a definir el setup(). En primer lugar, se inicializa el monitor serial y ambos acele-
rómetros. En segundo lugar, se conecta el módulo a la red local y se saca por el puerto serie la
dirección IP del ESP8266 a la que se deberá acceder por el navegador web. Por último, se incluye
una condición if necesaria para la inserción de los logos.
Para concluir con el setup, se incluyen las siguientes líneas de código para gestionar el servidor
web.
Cuando se hace una solicitud en la URL, se envía el texto HTML que se almacena en la variable
"index_html". También es necesario pasar por la función processor() que reemplazará todas las
etiquetas de posición con los valores correctos.
3.1 Datos volcados en página web + adquisición con Excel o Matlab 23
Se necesitan agregar dos controladores adicionales para actualizar las lecturas de las aceleraciones.
Cuando se recibe una solicitud en la URL de /Acel- - simplemente se debe enviar el valor de
aceleración actualizado. Es texto sin formato y debe enviarse como un carácter, por lo que se usa el
"c_str()".
Por último, se inicializa el servidor.
server.begin();
En el loop(), se introduce un if que permite hacer lecturas de los sensores en el periodo de tiempo
definido en la variable "interval". Con esta condición, se leen los valores únicamente cuando se van
a mostrar (actualizar) en la página web.
24 Capítulo 3. Descripción de las diferentes configuraciones
El Web Scraping es una técnica usada para extraer información desde páginas Web. Se puede extraer
tanto texto, emails o links como descargar ficheros o imágenes. También se puede extraer información
adicional que no está visible en la Web. Para esta técnica se usan lenguajes de programación como
Python, no obstante, también se puede usar el lenguaje VBA (Visual Basic para aplicaciones) que
es el que se utilizará en este proyecto. Como se puede observar en el siguiente esquema, el método
consiste en la extracción de los valores de la página web con el editor de Visual Basic y el muestreo
en las celdas de Excel [12].
Se pasa a explicar las sentencias del siguiente código que permiten extraer los valores de la
página web cada X segundos. En primer lugar, se declara la variable "tiempo" como una variable
general(pública). En segundo lugar, se ha creado dos subrutinas o procedimientos. Una cuyo objetivo
es la extracción de los valores de aceleraciones cada X segundos de manera automática y otra para
parar, cuando se desee, dicha ejecución automática.
En la primera subrutina, como se puede observar, se habilita el Internet Explorer, se comprueba
que se ha hecho de manera correcta y se dirige a la URL especificada entre comillas. Una vez
se ha realizado esta apertura, es posible la extracción de los elementos por id de la página web
con el comando "ie1.document.getElementById("Acel- -").innerText". Además, se especifica entre
corchetes las celdas de Excel en las que se quiere mostrar los valores extraídos. Por último, las dos
sentencias siguientes: "tiempo = DateAdd("s", 1, Time)" y "Application.OnTime tiempo, "todo""
ejecutan de manera automática, en el periodo de tiempo impuesto, la subrutina todo(). El menor
tiempo que permite introducir es 1s, periodo muy grande para la frecuencia de adquisición que se
desea conseguir.
En la segunda subrutina, como ya se ha comentado, simplemente se cancela la ejecución automática
de la subrutina todo().
---------------------------------------------------------------------
Sub todo()
ie1.Quit
End Sub
----------------------------------------------------------------------
Sub CancelarMacro() 'Con esta macro paramos la ejecución automática cada
1 segundo
Calificación del método: Como ya se ha visto, se ha hecho Web Scraping con el objeto IE
Explorer que lo que hace es simular una navegación por una web en concreto. Este método es
demasiado lento e inestable. Además, el periodo de ejecución automática del VBA no puede ser
inferior a un segundo, con lo cual, este método de adquisición se ha descartado debido a que ha
sido imposible conseguir la frecuencia de adquisición de datos impuesta en los objetivos de partida.
3.1 Datos volcados en página web + adquisición con Excel o Matlab 27
Tal como se observa en el siguiente código, lo que se ha hecho principalmente ha sido una
manipulación de la cadena que contiene el código HTML de la página web, usando webread, con el
fin de extraer de este los valores de las aceleraciones. Por último, se representan dichas aceleraciones
frente al tiempo.
for k=1:50;
i=0;
tic
data = webread('http://192.168.0.22/'); %Con esta función copiamos el có
digo html (estructura de la página web)
%----------------MPU6050_1-----------------%
%%% Acelx1 %%%
if data(1714)=='<'
Acelx1(k) = str2double(data((1714-4):1713)); %str2double nos
convierte de caracter a número %para poder operar con él
else
i=1; %Con esto tendremos en cuenta los cambios en los signos de las
aceleraciones
Acelx1(k) = str2double(data((1714-4):1714));
end
%%% Acely1 %%%
if data(1904+i)=='<'
Acely1(k) = str2double(data((1904+i-4):1903+i));
else
Acely1(k) = str2double(data((1904+i-4):1904+i));
i=i+1;
end
%%% Acelz1 %%%
if data(2091+i)=='<'
Acelz1(k) = str2double(data((2091+i-4):2090+i));
else
Acelz1(k) = str2double(data((2091+i-4):2091+i));
i=i+1;
end
%----------------MPU6050_2-----------------%
%%% Acelx2 %%%
if data(2338+i)=='<'
Acelx2(k) = str2double(data((2338+i-4):2337+i));
else
Acelx2(k) = str2double(data((2338+i-4):2338+i));
i=i+1;
end
%%% Acely2 %%%
if data(2528+i)=='<'
Acely2(k) = str2double(data((2528+i-4):2527+i));
else
Acely2(k) = str2double(data((2528+i-4):2528+i));
i=i+1;
end
%%% Acelz2 %%%
if data(2715+i)=='<'
Acelz2(k) = str2double(data((2715+i-4):2714+i));
else
Acelz2(k) = str2double(data((2715+i-4):2715+i));
i=i+1;
3.1 Datos volcados en página web + adquisición con Excel o Matlab 29
end
end
tiempo(1)=t(1);
for k=2:50
tiempo(k)=tiempo(k-1)+t(k);
end
Calificación del método: Como se puede observar, se ha mejorado el periodo de muestreo con
respecto al método anterior. No obstante, como ya se ha comentado, la frecuencia de adquisición
lograda está muy por debajo de la deseada, en torno a 3-4 valores en cada eje por segundo por lo
que este método también ha sido descartado.
Tras realizar los dos métodos de adquisición con esta primera configuración se han detectado las
siguientes limitaciones o impedimentos:
Estas limitaciones han impulsado el análisis una segunda configuración que no depende de
Internet sino, simplemente, de una comunicación inalámbrica entres dos módulos ESP8266.
30 Capítulo 3. Descripción de las diferentes configuraciones
En esta segunda configuración será necesario disponer de dos módulos ESP8266. Lo que se hará
será establecer una comunicación Wi-Fi (HTTP) entre los dos ESP8266 para intercambiar datos sin
necesidad de conectarse a Internet. Para ello, se va a configurar un ESP8266 como punto de acceso
(servidor) y el otro ESP8266 como estación (cliente). Los intercambios de datos y lecturas de los
sensores se harán a través de solicitudes HTTP [14].
Para comprender mejor cómo funciona se muestra el siguiente esquema y las respectivas explica-
ciones.
• El servidor ESP8266 crea su propia red inalámbrica (ESP8266 Soft-Access Point). Por lo
tanto, otros dispositivos Wi-Fi pueden conectarse a esa red(SSID: ESP8266-Access-Point,
Password: bienvenido).
• El cliente ESP8266 se fija como estación por lo que puede conectarse a la red inalámbrica
del servidor ESP8266.
• El cliente puede realizar peticiones HTTP GET al servidor para solicitar datos del sensor.
Solo tiene que utilizar la dirección IP del servidor para hacer una solicitud en una determinada
ruta: /acx , /acy o /acz.
• El servidor recibe las solicitudes entrantes y envía una respuesta con las lecturas.
• El cliente recibe las lecturas y las muestra por el puerto serie.
#include "ESPAsyncWebServer.h"
A continuación, se definen los credenciales de la red para que la conexión se haga de manera sa-
tisfactoria. Además, se crea el servidor en el puerto 80 con la siguiente sentencia: "AsyncWebServer
server(80)"
AsyncWebServer server(80);
int ITER;
En las siguientes sentencias se crean tres funciones que devolverán las aceleraciones en los tres
ejes como variables String.
String readAY1_2() {
return String(vecayprint1_2);
}
String readAZ1_2() {
return String(vecazprint1_2);
}
32 Capítulo 3. Descripción de las diferentes configuraciones
En el setup(), primero que nada, se inicializa el monitor serial. Después, se establece el ESP8266
como punto de acceso con el SSID y la PASSWORD definidos anteriormente. A continuación,
se gestionan las rutas donde el ESP8266 estará escuchando las solicitudes entrantes. Por ejemplo,
cuando el servidor ESP8266 recibe una solicitud /acx1_2 , este envía la aceleración en el eje x
,devuelta por la función readAX1_2(), como un caracter (es por ello que se use el método c_str()).
Las siguientes sentencias van destinadas a inicializar el sensor MPU6050 y el servidor.
Serial.begin(115200);
IPAddress IP = WiFi.softAPIP();
Serial.println(IP);
server.begin();
}
creación de esa cadena y dos contadores. Por una parte, el tiempo es necesario para conocer cual
es el periodo de lectura y con ello la frecuencia de adquisición, por otra, los contadores también
son necesarios , como se verá, para tener claro a qué iteración y a qué eje corresponde cada cadena
mostrada por el puerto serie.
if(WiFi.softAPgetStationNum() == 1){
t1=millis();
for(ITER=0; ITER<100; ITER++){
Wire.beginTransmission(MPU1);
Wire.write(0x3B); //Pedir el registro 0x3B - corresponde al AcX
Wire.endTransmission(false);
Wire.requestFrom(MPU1,6,true); //A partir del 0x3B, se piden 6
registros
AcX1=Wire.read()<<8|Wire.read(); //Cada valor ocupa 2 registros
AcY1=Wire.read()<<8|Wire.read();
AcZ1=Wire.read()<<8|Wire.read();
myaxprint1 = String(axprint1);
vecaxprint1_1= memoryax1 + " " + myaxprint1;
memoryax1=vecaxprint1_1;
myayprint1 = String(ayprint1);
vecayprint1_1= memoryay1 + " " + myayprint1;
memoryay1=vecayprint1_1;
myazprint1 = String(azprint1);
vecazprint1_1= memoryaz1 + " " + myazprint1;
memoryaz1=vecazprint1_1;
delay(2.3);
}
memoryax1="";
memoryay1="";
memoryaz1="";
t2=millis();
t1s = t1/1000.0;
t2s = t2/1000.0;
cadt1=String(t1s);
cadt2=String(t2s);
cadcont=String(cont);
vecaxprint1_2 = cadt1 + " " + cadcont + " " + "1" + vecaxprint1_1 +
" " + cadt2;
34 Capítulo 3. Descripción de las diferentes configuraciones
Antes que nada, se incluyen las bibliotecas necesarias para la conexión Wi-Fi y para realizar
solicitudes HTTP. También es necesario crear una WiFiMulti instancia. Por último, se insertan las
credenciales de red del servidor ESP8266.
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti WiFiMulti;
A continuación, se guardan las direcciones URL donde el cliente realizará las solicitudes HTTP.
El servidor ESP8266 tiene la dirección IP 192.168.4.1, y estaremos haciendo solicitudes en el URL
/acx1_2, /acy1_2 y /acz1_2. Además, se definen las tres cadenas que utilizaremos en el código.
WiFi.mode(WIFI_STA);
WiFiMulti.addAP(ssid, password);
while((WiFiMulti.run() == WL_CONNECTED)) {
delay(500);
Serial.print(".");
3.2 Servidor y clientes + adquisición con Matlab o con aplicación Coolterm 35
}
Serial.println("");
Serial.println("Connected to WiFi");
}
En el loop() se impone la condición de que se esté conectado al servidor antes de hacer ninguna
petición. A continuación, se pasan a hacer las tres peticiones HTTP llamando a la función "httpGE-
TRequest()". Por último, el "delay(2.3)" está puesto de manera que le dé tiempo al servidor a crear
las nuevas cadenas y así, pedir lo mismo lo menos posible.
HTTPClient http;
http.begin(client, serverName);
http.end();
return payload;
}
Este primer método de adquisición para la segunda configuración no presentó un buen comporta-
miento desde el principio. La idea consistía en leer directamente el puerto serie haciendo uso de la
función "dato = fscanf(canalserie,0 %f0 ,[1,100])" de Matlab. No obstante, los resultados obtenido
no eran los adecuados debido a la complicada coordinación entre las capturas del puerto serie y los
muestreos por el mismo, lo que daba lugar a una gran pérdida de valores enviados por el puerto
serie. Además, la estructura con la que se extraían los valores no coincidía, generalmente, con la que
se habían guardado ya que se grababa en un instante que no tenía por que coincidir con el inicio de
muestreo por el puerto serie. Por estas razones y el descubrimiento del siguiente método se decidió
dejar de trabajar con él.
36 Capítulo 3. Descripción de las diferentes configuraciones
Tras haber comentado la aplicación que se usará, se pasa a explicar el siguiente esquema que
muestra el procedimiento necesario para alcanzar los objetivos.
Una vez se tienen cargados los códigos en ambos módulos, el módulo servidor desconectado y
el cliente conectado, se conecta con la aplicación el módulo cliente.
Se define ahora cuál va a ser el archivo .txt donde se quieren capturar las cadenas de las acelera-
ciones arrojadas por el servidor.
Figura 3.8 Selección del .txt donde queremos capturar los datos.
38 Capítulo 3. Descripción de las diferentes configuraciones
Finalmente, una vez se disponen de los valores leídos, se hace uso de Matlab para hacer una
correcta lectura del .txt. Se procede a continuación a detallar el código empleado.
En primer lugar, se debe recordar cuál era la estructura de cada cadena de aceleraciones almace-
nada, ya que, de esta manera, se podrá comprender mejor la lectura con Matlab.
Como se puede observar en la siguiente cadena mostrada, tanto la primera como la última compo-
nente van destinadas a definir cuál es el tiempo de inicio y fin de la creación de la cadena. A partir
de ambos tiempos se podrá conocer de manera aproximada, bastante exacta, el instante de tiempo
en el que se hace una determinada lectura en el acelerómetro. Y así, poder hacer una representación
con respecto al tiempo de las aceleraciones, además de determinar la frecuencia de adquisición en
la que se tiene tanto interés.
La segunda componente es un contador que indica en qué iteración ha sido creada la cadena. De
esta forma se asegura que no se están desechando valores a lo largo del proceso de adquisición.
La tercera componente es un segundo contador que indica a qué eje corresponde la cadena: 1 co-
rresponde con el eje x , 2 con el y y 3 con el z. Este segundo contador ha sido necesario introducirlo
debido a que las peticiones y las creaciones de las cadenas no se hacen de manera sincronizada,
como ya se ha comentado en apartados anteriores. Se detalla un poco más esto último: el servidor
crea las cadenas de 100 componentes para cada eje de manera independiente y el cliente hace
peticiones de estas cadenas cada X tiempo definido en el código. Puesto que el tiempo de petición y
respuesta no es del todo estable, puede darse el caso en el que el cliente haga la primera petición,
asociada al eje x, de la nueva iteración y al servidor no le haya dado tiempo de crear las cadenas de
dicha nueva iteración. Con lo cual, la primera cadena será repetida de la iteración anterior y las dos
siguientes son de la nueva iteración. De esta manera, con los dos contadores se pueden desechar,
por un lado, las cadenas repetidas y ordenar, por otro, las cadenas de manera que siempre el orden
sea el siguiente: eje x, y y z. Se debe aclarar que el tiempo entre peticiones ha sido elegido tanto
para que no se pierdan cadenas, ya que si el tiempo de petición es demasiado grande al cliente no le
da tiempo a hacer las peticiones antes de que el servidor actualice las cadenas, como para que el
tiempo de petición no puede ser muy corto ya que si no, se harían demasiadas peticiones repetidas,
empeorando así la adquisición de datos.
Por último, desde la componente 4 a la 103, ambas incluidas, se almacenan las 100 lecturas de
aceleraciones, en el eje correspondiente de la cadena, realizadas al sensor.
Dicha cadena es real para la configuración que se está comentando. Con lo cual, se tiene una
frecuencia de adquisición de unos 300 valores por segundo. Estando esta por encima de los requisitos
iniciales.
40 Capítulo 3. Descripción de las diferentes configuraciones
A continuación, se procede a detallar el código de Matlab que permite leer el .txt en el que se han
almacenado las cadenas. Dicho código no solo ha de leer el .txt sino que debe ser capaz de desechar
las repetidas y ordenarlas como ya se ha comentado anteriormente.
A = importdata('datos1.txt');
[i,~]=find(isnan(A));
if isempty(i)==0 %returns logical 1 if A is empty, and logical 0
otherwise.
datos = A(1:(i(1)-1),:);
else
datos = A;
end
[n,~]=size(datos);
En estas líneas del código iniciales, lo primero que se hace es cargar el archivo que se especifica
entres comillas. Seguidamente, se determina si la última fila, cadena, grabada en el .txt se ha rellenado
completamente o si se ha cortado la transmisión antes. Con esto se puede eliminar la última fila,
en caso de no estar rellena por completo, para evitar futuros problemas con las dimensiones de la
matriz datos.
En esta segunda parte, haciendo uso de diferentes condiciones, se eliminan las cadenas repetidas
y se ordenan estas según la siguiente secuencia: eje x, y y z.
figure
[m,n]=size(Acel);
acelx=[];
acely=[];
acelz=[];
t=[];
for k=1:3:(m-2)
t1 = linspace(Acel(k,1),Acel(k,104),100);
t = [t t1];
acelx = [acelx Acel(k,4:103)];
acely = [acely Acel(k+1,4:103)];
acelz = [acelz Acel(k+2,4:103)];
end
plot(t,acelx,'r',t,acely,'g',t,acelz,'c')
xlabel('t(s)')
ylabel('a (m/s^2)')
title('Aceleraciones frente al tiempo')
legend('Acelx','Acely','Acelz')
Para finalizar, se procede a plotear. En primer lugar, las aceleraciones en los tres ejes frente al
tiempo. En segundo lugar, las amplitudes asociadas al eje z con la función detrend() de matlab ya
que, como se comentará, las comparativas del sistema se harán excitando únicamente el eje z.
Se muestra en las siguientes imágenes las gráficas de salida de dicho código para el análisis
almacenado en el archivo “datos1.txt".
Figura 3.11 Representación de las aceleraciones en los tres ejes (Izq.). Representación de las ampli-
tudes de las aceleraciones en el eje z (dcha.).
42 Capítulo 3. Descripción de las diferentes configuraciones
Tras haberse probado diferentes configuraciones y métodos, se concluye con que esta segunda
configuración basada en la comunicación inalámbrica de dos ESP8266 ha sido la que mejores
resultados ha arrojado, cumpliendo con los dos requisitos impuestos desde el principio en el
proyecto: frecuencia de adquisición y transmisión inalámbrica. Las prestaciones más notorias son
las siguientes:
• Frecuencia de adquisición resultante de unos trecientos valores por segundo para cada eje.
Estando esta por encima de los 200 valores por segundo que se tenía como requisito de
partida.
• Transmisiones inalámbricas entre los dos módulos ESP8266 sin necesidad de disponer de
acceso a internet, eliminando así las limitaciones encontradas en la primera configuración
asociadas al complicado control temporal debido a: los protocolos de internet, la velocidad
de internet de la que se disponga, respuesta del navegador frente a actualizaciones...
• Control total de las cadenas almacenadas, consiguiendo así no desechar valores de acelera-
ciones durante la transmisión.
Con estos últimos comentarios, se concluye este capítulo basado en el análisis de los diferentes
tipos de configuración y métodos de adquisición.
El siguiente se centrará en la comparativa de la electrónica en su configuración definitiva con
equipos profesionales en la materia con los que cuenta el departamento de Mecánica de Medios
Continuos y Teoría de estructuras en los laboratorios de la escuela.
4 Comparativa del sistema con
acelerómetro PCB PIEZOTRONICS
352C33
43
44 Capítulo 4. Comparativa del sistema con acelerómetro PCB PIEZOTRONICS 352C33
En cuanto al acelerómetro 352C33, este cumple con la especificaciones técnicas más exigentes,
con un tamaño y masa reducido. Alguna de las especificaciones del sensor son las siguientes:
Para la adquisición de datos se ha usado el siguiente módulo de Brüel Kjaer, modelo 3160 [15].
Figura 4.2 Acelerómetro PCB PIEZOTRONICS 352C33 [14] y Módulo de adquisición de datos
[15].
Figura 4.3 APS 400 ELECTRO-SEIS [16] y Amplificador APS 124 - Power Amplifier.
Specifications Value
4.3 Resultados
Una vez se han comentado los equipos empleados, se procede a presentar cuáles han sido los
resultados obtenidos. En primer lugar, la comparativa se ha realizado con el sistema conectado por
cable. Y en segundo lugar, con el sistema funcionando inalámbricamente, como se ha estudiado en
este proyecto. De esta manera se podrá comparar, por un lado, cómo de acertados son los resultados
con el sistema de bajo coste y, por otro, las limitaciones al hacer la transmisión inalámbrica con
dicho sistema.
Antes de mostrar los resultados, en la siguiente tabla se detallan las características principales de
las excitaciones ensayadas:
Tipo de excitación Intervalo frecuencial [Hz] Resolución frecuencial [Hz] Frecuencia [Hz]
Seno 100 0.5 10
Seno 100 0.5 20
Seno 100 0.5 30
Seno 100 0.5 40
Seno 100 0.5 50
Burst Random 50 0.0625 -
1
Tensayo = (4.1)
Resolución frecuencial
Por otro lado, los intervalos (períodos) de tiempo, δT , en los que se han registrado los datos han
sido:
donde fs es la frecuencia de muestreo, número de datos por segundo registrados por el sistema.
Dichas frecuencias son mayores para el sensor 352C33. No obstante, para la configuración con
cable ambos sensores presentan frecuencias bastante cercanas. Y, como era de esperar, con la
transmisión inalámbrica se tiene la frecuencia de muestreo más pequeña, frecuencia que condicionará
la comparativa.
En cuanto a las sensibilidades de los sensores, la del PCB PIEZOTRONICS 352C33 es de 100.2
mV/g. Para el caso del MPU6050 se tiene una sensibilidad máxima de 16384 LSB / g. Esto equivale,
haciendo uso de la siguiente fórmula, a 825 mV/g en una escala analógica [18].
voltaje operación
LSB = o (4.2)
2N bitsADC
Donde el voltaje de operación del MPU6050 es de 3.3 V y la escala ADC es de 16 bits. Por lo
tanto, cada unidad de LSB equivale a 0.0504 mV y para los 16384 LSB/g se tienen los 825 mV/g.
4.3 Resultados 47
Debe resaltarse que aunque la sensibilidad para el MPU6050 sea superior, esta es una sensibilidad
teórica digital mientras que para el caso del PCB es una sensibilidad calibrada.
Para llevar a cabo la comparativa se han representado las aceleraciones en el dominio del tiempo
y en el de la frecuencia. Con este último se detecta de manera más precisa cómo de parecidas
son ambas señales, al disponer de los contenidos en frecuencia. Como se puede observar en la
siguiente imagen, el objetivo del análisis en el dominio de la frecuencia es el de descomponer la
señal compleja arrojada por los sensores en otras señales periódicas básicas que permiten un estudio
más asequible.
Figura 4.6 Comparativa para excitación tipo seno de 10Hz [Con cable].
Para la frecuencia de 10Hz las señales obtenidas por ambos sensores se asemejan bastante, tanto
en el dominio del tiempo como en el de la frecuencia. Ambos armónicos se encuentran centrados
en la frecuencia de excitación, 10Hz. Comentar que la amplitud en el dominio de la frecuencia no
coincide exactamente con la del seno debido a la variación de amplitud en la fase transitoria.
Figura 4.7 Comparativa para excitación tipo seno de 20Hz [Con cable].
Para este segundo ensayo, los resultados obtenidos siguen el mismo comportamiento que para
el primero: espectros centrados en la frecuencia de excitación, 20Hz, y amplitudes ligeramente
inferiores por el tramo transitorio.
Figura 4.8 Comparativa para excitación tipo seno de 30Hz [Con cable].
En el caso de 30Hz el sistema sigue comportándose bastante bien, arrojando resultados muy
semejantes a los del sensor PCB PIEZOTRONICS 352C33.
Figura 4.9 Comparativa para excitación tipo seno de 40Hz [Con cable].
Figura 4.10 Comparativa para excitación tipo seno de 50Hz [Con cable].
Para la excitación tipo seno de 50Hz se observa una cierta anomalía en el dominio del tiempo.
No obstante, dicha anomalía corresponde a la señal arrojada por el sensor del laboratorio al no
encontrarse centrada en cero. Finalmente se ha decidido incluirla pues, como se puede apreciar, en
permanente como en el espectro de frecuencias ambas señales son bastante similares.
Figura 4.11 Comparativa para excitación tipo burst random de 50Hz [Con cable].
En este último ensayo únicamente se han representado las señales frente al tiempo, siendo estas
muy similares. Se ha omitido el espectro de frecuencias pues al ser una señal tipo burst random el
contenido en frecuencia está bastante saturado y se dificulta mucho la comparativa.
Como se puede observar, en la configuración inalámbrica la señal no es un seno puro sino que
4.3 Resultados 53
presenta un ruido de unos 5Hz, teniéndose contenidos en 5, 10, 15, 20 y 25 Hz. No obstante, para
esta frecuencia de 10 Hz el resto de armónicos presentan unas amplitudes bastante menores.
Para esta frecuencia de 40Hz el armónico de 35Hz presenta una amplitud superior a la que
corresponde a la frecuencia de excitación.
Por último, para una excitación de 50Hz el comportamiento empeora bastante. Por un lado la
amplitud máxima no se encuentra centrada en la frecuencia de excitación y, por otro, el número de
56 Capítulo 4. Comparativa del sistema con acelerómetro PCB PIEZOTRONICS 352C33
Figura 4.17 Comparativa para excitación tipo burst random de 50Hz [Inalámbrico].
Al igual que para la configuración con cable, únicamente se han representado las señales frente
al tiempo, siendo estas bastante similares teniéndose en cuenta el tipo de excitación.
Figura 4.18 Respuestas en frecuencia de los filtros pasa bajos y pasa altos.
El objetivo de la implementación de ambos filtros era el de atenuar el ruido de 5Hz que presentan
las señales arrojadas por el MPU6050. No obstante, como se puede observar, los cambios logrados
no fueron satisfactorios.
Tras los resultados obtenidos para los filtros anteriormente comentados, se decidió aplicar filtros
con diferentes frecuencias de corte según la frecuencia de excitación, logrando así eliminar los
armónicos no deseados. No obstante, se debe tener presente que con esta segunda forma se está
eliminando gran parte señal.
En la siguiente tabla se recogen las características de los diferentes filtros empleados según la
frecuencia de excitación.
Como se puede apreciar en las siguientes gráficas, se han eliminado aquellos armónicos asociados
a la perturbación del seno de excitación por la transmisión inalámbrica. Para frecuencias de excitación
inferiores a 30Hz se obtienen señales bastante similares para ambos sensores. No obstante, aunque
para 40 y 50 Hz los contenidos en frecuencia siguen estando centrados, estos presentan una amplitud
bastante inferior, como se ha comentado en la comparativa anterior.
Figura 4.19 Comparativa para excitación tipo seno de 10Hz con señal filtrada[Inalámbrico].
Figura 4.20 Comparativa para excitación tipo seno de 20Hz con señal filtrada[Inalámbrico].
Figura 4.21 Comparativa para excitación tipo seno de 30Hz con señal filtrada[Inalámbrico].
Figura 4.22 Comparativa para excitación tipo seno de 40Hz con señal filtrada[Inalámbrico].
4.4 Conclusiones de los resultados obtenidos 59
Figura 4.23 Comparativa para excitación tipo seno de 50Hz con señal filtrada[Inalámbrico].
¿Por qué se produce esta diferencia entre la transmisión con cable y la inalámbrica? La
causa principal radica en las lecturas realizadas al MPU6050 en ambas configuraciones. En la
realizada con cable las lecturas del sensor se hacen de forma ininterrumpida, mientras que en la
inalámbrica, como ya se ha comentado con mayor detalle, ha sido necesario introducir unos delays
de unos 2ms en los códigos con el objetivo de sincronizar las peticiones y solicitudes entre módulos.
En ese corto periodo de tiempo no se están leyendo los valores medidos por el acelerómetro.
Como se observa en los gráficos y es lógico, el comportamiento de los resultados empeora al ir
aumentando la frecuencia de excitación.
60 Capítulo 4. Comparativa del sistema con acelerómetro PCB PIEZOTRONICS 352C33
Con el siguiente código y los respectivos archivos de datos se han generado las gráficas anteriormente
mostradas.
Código 4.1 Elaboración de las gráficas con Matlab en el dominio del tiepo y de la frecuencia +
aplicación del filtro de Chebyshev.
clear all; close all; clc
format long
%MPU6050%
A = importdata('datos1.txt');
[i,~]=find(isnan(A));
if isempty(i)==0 %isempty(A) returns logical 1 (true) if A is empty, and
logical 0 (false) %otherwise.
datos = A(1:(i(1)-1),:);
else
datos = A;
end
[n,~]=size(datos);
figure
hold on
[m,n]=size(Acel);
% acelx=[]; acely=[];
acelz=[];
t=[];
4.5 Código elaboración de gráficas 61
for k=1:3:(m-2)
t1 = linspace(Acel(k,1),Acel(k,104),100);
t = [t t1];
%acelx = [acelx Acel(k,4:103)];
%acely = [acely Acel(k+1,4:103)];
acelz = [acelz Acel(k+2,4:103)];
end
t=t(1385:2400); t=t-t(1); acelz=acelz(1385:2400);
plot(t,detrend(acelz),'b');
% ACEL LABORATORIO %
load('DATOS ADQUIRIDOS CON EL ACELERÓMETRO PRO/
resultados_seno_10Hz_inalambrico')
tiempo_lab = tiempo(998:end)-1.924;
aceleracion_lab = aceleracion(998:end);
plot(tiempo_lab,aceleracion_lab,'r')
legend('MPU6050')
title('Comparativa para excitación tipo seno de 10Hz')
xlabel('t(s)')
ylabel('a_z (m/s^2)')
hold off
%------------DOMINIO DE LA FRECUENCIA------------%
%MPU6050%
deltat=[t(end)-t(1)]/length(t);
fs=1/deltat; %frecuencia de muestreo
%se hace la transformada de Fourier, para pasar al dominio de la
frecuencia
acelz_fft=fft(acelz);
%A partir de la frecuencia de muestreo y el tiempo en el que se han
%registrado datos, se obtiene su equivalente en el dominio de la
frecuencia
L=length(acelz);
P2 = abs(acelz_fft/L); % se normaliza
P1 = P2(1:L/2+1); % únicamente la mitad (simetría)
P1(2:end-1) = 2*P1(2:end-1);% Con la transformada rápida obtenemos la
mitad de la amplitud
% de la señal original
f = fs*(0:(L/2))/L;
% se dibujan los resultados en el dominio de la frecuencia
figure
hold on; plot(f(5:end),P1(5:end),'b')
title('Espectro de frecuencias, seno 10Hz')
xlabel('Frecuencia [Hz]')
ylabel('Aceleración [m/s^2]')
%------------------------------------------------%
%------------------------------------------------%
% FILTRADO DE LA SEAL %
fs_exp = fs; %fijar el valor de la frecuencia de muestreo
62 Capítulo 4. Comparativa del sistema con acelerómetro PCB PIEZOTRONICS 352C33
ChebyOrder2=6;
ChebyRipple2=1;
ChebyFreq2=9.7; %fija el valor por encima de 5Hz
[Bf2,Af2]=cheby1(ChebyOrder2,ChebyRipple2,ChebyFreq2/(fs_exp/2),'high');
%filtro pasa altos
% % % % % % % % % % % %
ft = tf(Bf2,Af2);
[h w] = freqz(Bf2,Af2); %respuesta en frecuencia del filtro
figure
plot(w,abs(h))
title('Respuesta en frecuencia del filtro pasa altos')
ylabel('Magnitud')
xlabel('Frecuencia normalizada')
% % % % % % % % % % % %
%filtro
respt = acelz;
respt = filter(Bf2,Af2,respt);
respt = filter(Bf1,Af1,respt);
%representamos señal sin filtrar en el dominio del tiempo%
figure
plot(t,acelz,'b')
title('Señal en el dominio del tiempo, seno 10Hz')
xlabel('tiempo [s]')
ylabel('Aceleración [m/s^2]')
%representamos señal filtrada en el dominio del tiempo%
figure
plot(t,respt,'b')
title('Señal filtrada en el dominio del tiempo, seno 10Hz')
xlabel('tiempo [s]')
ylabel('Aceleración [m/s^2]')
%hacemos la transformada a la señal filtrada%
acelzfiltrada_fft=fft(respt);
L = length(acelz);
P2_f = abs(acelzfiltrada_fft/L);
4.5 Código elaboración de gráficas 63
P1_f = P2_f(1:L/2+1);
P1_f(2:end-1) = 2*P1_f(2:end-1);
f = fs*(0:(L/2))/L;
figure
plot(f(5:end),P1_f(5:end),'b')
title('Espectro de frecuencias con señal filtrada, seno 10Hz')
xlabel('Frecuencia [Hz]')
ylabel('Aceleración [m/s^2]')
% plot(f_lab,P1_lab,'r')
%------------------------------------------------%
%------------------------------------------------%
%%%ACELERÓMETRO LABORATORIO%%%
deltat_lab=[tiempo_lab(end)-tiempo_lab(1)]/length(tiempo_lab);
fs_lab=1/deltat_lab;
aceleracion_lab_fft=fft(aceleracion_lab);
L=length(aceleracion_lab);
P2_lab = abs(aceleracion_lab_fft/L);
P1_lab = P2_lab(1:L/2+1);
P1_lab(2:end-1) = 2*P1_lab(2:end-1);
f_lab = fs_lab*(0:(L/2))/L;
%%%COMPARATIVA CON MPU6050 SIN FILTRAR%%%
figure
hold on
plot(f(5:end),P1(5:end),'b',f_lab,P1_lab,'r')
title('Comparativa en el dominio de la frecuencia, seno 10Hz')
legend('MPU6050','352C33')
plot([10 10],[0 2],'--')
xlabel('Frecuencia [Hz]')
ylabel('Aceleración [m/s^2]')
hold off
%%%COMPARATIVA CON MPU6050 FILTRADAR%%%
figure
hold on
plot(f(5:end),P1_f(5:end),'b',f_lab,P1_lab,'r')
title('Comparativa en el dominio de la frecuencia (señal filtrada), seno
10Hz')
legend('MPU6050','352C33')
plot([10 10],[0 2],'--')
xlabel('Frecuencia [Hz]')
ylabel('Aceleración [m/s^2]')
hold off
5 Conclusiones y desarrollos futuros
En este último capítulo se resumirá el desarrollo del proyecto y los objetivos logrados. Además, se
expondrá una serie de tareas de interés de cara a la realización de trabajos futuros.
Finalmente, incorporando a los desarrollos alcanzados en este proyecto los trabajos futuros
anteriormente comentados, se dispondría de un sistema de bajo coste capaz de monitorizar una
estructura inalámbricamente.
65
Apéndice A
Puesta en funcionamiento del sistema
A.1 Equipos
Se tendrá que disponer de los siguientes equipos:
• Un ordenador.
• Dos módulos ESP8266.
• Un sensor MPU6050.
• Dos conectores USB 2.0 micro-b 5 pin y cables para el conexionado del sensor al módulo.
Pinchando en los siguientes enlaces se accede a las páginas de compra: [Comprar ESP8266],
[Comprar MPU6050].
67
68 Capítulo A. Puesta en funcionamiento del sistema
A.2 Programas
En el equipo en el que se vaya a conectar el sistema, será necesario contar con los siguientes
programas:
• Matlab.
• El IDE de Arduino.
• La aplicación CoolTerm.
Los dos últimos son de uso gratuito y se pueden descargar pinchando en los siguientes enla-
ces:[Descargar IDE de Arduino] , [Descargar CoolTerm].
• 1. Una vez se está en el IDE de Arduino, se despliega la pestaña de Archivo y se hace clic en
preferencia.
• 2. Se pega el siguiente enlace hhttp:// arduino.esp8266.com/ stable/ package_esp8266com_
index.jso en el campo "Gestor de URLs Adicionales de Tarjetas" y se acepta.
• 3. Se despliega la pestaña de Herramientas y se hace clic en Placa > Gestor de Tarjetas. Se
busca ESP8266 y se pulsa instalar para la" ESP8266 por ESP8266 Comunidad".
• Después de unos segundos debe aparecer como instalado, dándose por terminada la instala-
ción.
Por otro lado, se deberán instalar las siguientes librerías, pinchando en los respectivos enlaces se
podrán descargar directamente:
Una vez estén descargadas, se descomprimirán las librerías y se moverán a la carpeta de bibliotecas
de instalación de Arduino IDE.
A.4 Puesta a punto del Servidor 69
Antes que nada se procederá a conectar el MPU6050 al módulo ESP8266 como se indica en el
siguiente esquema.
AsyncWebServer server(80);
int ITER;
String readAX1_2() {
return String(vecaxprint1_2);
}
String readAY1_2() {
return String(vecayprint1_2);
}
String readAZ1_2() {
return String(vecazprint1_2);
}
void setup(){
Serial.begin(115200);
IPAddress IP = WiFi.softAPIP();
Serial.println(IP);
server.begin();
}
void loop(){
if(WiFi.softAPgetStationNum() == 1){
t1=millis();
for(ITER=0; ITER<100; ITER++){
Wire.beginTransmission(MPU1);
Wire.write(0x3B); //Pedir el registro 0x3B - corresponde al AcX
Wire.endTransmission(false);
A.4 Puesta a punto del Servidor 71
myaxprint1 = String(axprint1);
vecaxprint1_1= memoryax1 + " " + myaxprint1;
memoryax1=vecaxprint1_1;
myayprint1 = String(ayprint1);
vecayprint1_1= memoryay1 + " " + myayprint1;
memoryay1=vecayprint1_1;
myazprint1 = String(azprint1);
vecazprint1_1= memoryaz1 + " " + myazprint1;
memoryaz1=vecazprint1_1;
delay(2.3);
}
memoryax1="";
memoryay1="";
memoryaz1="";
t2=millis();
t1s = t1/1000.0;
t2s = t2/1000.0;
cadt1=String(t1s);
cadt2=String(t2s);
cadcont=String(cont);
vecaxprint1_2 = cadt1 + " " + cadcont + " " + "1" + vecaxprint1_1 +
" " + cadt2;
vecayprint1_2 = cadt1 + " " + cadcont + " " + "2" + vecayprint1_1 +
" " + cadt2;
vecazprint1_2 = cadt1 + " " + cadcont + " " + "3" + vecazprint1_1 +
" " + cadt2;
cont++; //en convertir estas cadenas se invierte en torno a 1ms
}
}
Por último, una vez compilado, se desconecta el módulo del puerto serie y se cierra la ventana
con el código del servidor.
72 Capítulo A. Puesta en funcionamiento del sistema
En este caso, únicamente será necesario conectar el otro módulo ESP8266 a un puerto USB del
ordenador. Una vez conectado, al igual que para el servidor, se desplegará el menú herramientas y
se seleccionará: Placa:"Generic ESP8266 Module" y Puerto:"al que se haya conectado".
Tras esto, se copiará el siguiente código y se le dará a "subir" para cargarlo en la placa.
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti WiFiMulti;
void setup() {
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA);
WiFiMulti.addAP(ssid, password);
while((WiFiMulti.run() == WL_CONNECTED)) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Connected to WiFi");
}
void loop() {
if ((WiFiMulti.run() == WL_CONNECTED)) {
axprint1_2 = httpGETRequest(serverNameax1_2);
ayprint1_2 = httpGETRequest(serverNameay1_2);
azprint1_2 = httpGETRequest(serverNameaz1_2);
Serial.println(axprint1_2);
Serial.println(ayprint1_2);
Serial.println(azprint1_2);
A.6 Adquisición de los datos con CoolTerm 73
delay(2.3);
}
}
http.begin(client, serverName);
http.end();
return payload;
}
Del mismo modo que antes, una vez compilado, se desconecta el módulo del puerto serie y se
cierra la ventana con el código del cliente.
Se define ahora cuál va a ser el archivo .txt donde se capturarán las cadenas de las aceleraciones
arrojadas por el servidor.
Figura A.5 Selección del .txt donde queremos capturar los datos.
A.6 Adquisición de los datos con CoolTerm 75
Una vez se dispone del .txt con los valores almacenados (este deberá estar guardado en la misma
carpeta que el archivo de Matlab), se procede ha realizar una correcta lectura de las cadenas con
Matlab. Para ello, se copiará el siguiente código en un nuevo Script.
A = importdata('datos1.txt');
[i,~]=find(isnan(A));
if isempty(i)==0 %returns logical 1 if A is empty, and logical 0
otherwise.
datos = A(1:(i(1)-1),:);
else
datos = A;
end
[n,~]=size(datos);
Figura A.8 Representación de las aceleraciones en los tres ejes (Izq.). Representación de las ampli-
tudes de las aceleraciones en el eje z (dcha.).
Índice de Figuras
79
80 Índice de Figuras
4.11 Comparativa para excitación tipo burst random de 50Hz [Con cable] 52
4.12 Comparativa para excitación tipo seno de 10Hz [Inalámbrico] 52
4.13 Comparativa para excitación tipo seno de 20Hz [Inalámbrico] 53
4.14 Comparativa para excitación tipo seno de 30Hz [Inalámbrico] 54
4.15 Comparativa para excitación tipo seno de 40Hz [Inalámbrico] 55
4.16 Comparativa para excitación tipo seno de 50Hz [Inalámbrico] 55
4.17 Comparativa para excitación tipo burst random de 50Hz [Inalámbrico] 56
4.18 Respuestas en frecuencia de los filtros pasa bajos y pasa altos 57
4.19 Comparativa para excitación tipo seno de 10Hz con señal filtrada[Inalámbrico] 58
4.20 Comparativa para excitación tipo seno de 20Hz con señal filtrada[Inalámbrico] 58
4.21 Comparativa para excitación tipo seno de 30Hz con señal filtrada[Inalámbrico] 58
4.22 Comparativa para excitación tipo seno de 40Hz con señal filtrada[Inalámbrico] 58
4.23 Comparativa para excitación tipo seno de 50Hz con señal filtrada[Inalámbrico] 59
81
Índice de Códigos
83
Bibliografía
[2] Roger Meier’s Freeware «CoolTerm». [Consulta: año 2021]. [Consultar fuente].
[3] Luis Llamas «Determinar la orientación con Arduino y el IMU MPU-6050». [Consulta: año
2021]. [Consultar fuente].
[4] Luis Llammas «El bus I2C en Arduino». [Consulta: año 2021]. [Consultar fuente].
[7] Random Nerd Tutorials «Installing ESP8266 Board in Arduino IDE». [Consulta: año 2021].
[Consultar fuente].
[8] Espressif Systems «Datasheet ESP8266-DevKitC». [Consulta: año 2021]. [Consultar fuente].
[9] Random Nerd Tutorials «ESP32 DHT11/DHT22 Web Server – Temperature and Humidity
using Arduino IDE». [Consulta: año 2021]. [Consultar fuente].
[10] Excel vba datos «68 excel vba 2019: extraer texto de pagina web con etiqueta html con id,
tag y class (scraping)». [Consulta: año 2021]. [Consultar fuente].
[11] Excel vba datos «09 curso excel vba 2016: scraper o extraer un dato (etiqueta html con ID)
de pagina web». [Consulta: año 2021]. [Consultar fuente].
[12] Automatetheweb «Learn to write Excel VBA code to automate your web browser.». [Consulta:
año 2021]. [Consultar fuente].
[14] Random Nerd Tutorials «ESP8266 Client-Server Wi-Fi Communication Between Two
Boards (NodeMCU)». [Consulta: año 2021]. [Consultar fuente].
[15] PCB PIEZOTRONICS «Model: 352C33». [Consulta: año 2021]. [Consultar fuente].
[16] Brüel Kjaer «Modelo 3160, Módulo generador». [Consulta: año 2021]. [Consultar fuente].
85
86 Bibliografía
[18] Europe PMC. «Extraction of Bridge Fundamental Frequencies Utilizing a Smartphone MEMS
Accelerometer». [Consulta: año 2021]. [Consultar fuente].