0% encontró este documento útil (0 votos)
4 vistas28 páginas

Sistema inalámbrico de geolocalización y aceleración

Cargado por

Sofia Martinez
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
4 vistas28 páginas

Sistema inalámbrico de geolocalización y aceleración

Cargado por

Sofia Martinez
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Sistema de adquisición inalámbrica de geolocalización y

medición de aceleraciones.

Introducción
El proyecto busca desarrollar los algoritmos necesarios que permitirán la implementación de un
sistema de adquisición inalámbrico de geolocalización y medición de vibraciones, para realizar el
monitoreo de las actividades deportivas. El sistema de adquisición contará con un microcontrolador
que fungirá como procesador central y el cual realizará las peticiones y almacenamiento de lecturas
provenientes de los módulos con sensores de aceleración y posición. Ası́ mismo, los datos adquiridos
serán enviados a un dispositivo mediante el módulo de comunicación inalámbrica, permitiendo al
sistema la independencia de cables que pudieran causar una movilidad reducida o problemas de
comunicación a grandes distancias. A continuación se enumeran las actividades a realizar:

1. Desarrollar los algoritmos correspondientes a la lectura de posición mediante un módulo de


geolocalización.
2. Desarrollar los algoritmos correspondientes a la lectura de aceleraciones adquiridas mediante
un sensor modular.
3. Desarrollar los algoritmos correspondientes para crear un enlace de comunicación inalámbrica
entre el sistema de adquisición y un equipo de cómputo mediante un módulo.
4. Fusionar los algoritmos desarrollados e implementar el algoritmo final en un microprocesador
junto con los módulos.
5. Comprobar funcionamiento y corregir errores.
6. Crear un manual de conexiones y cambios en los parámetros de lectura y comunicación de
los módulos.

Componentes usados
Módulo GPS SIM808
Este módulo se muestra en la Figura 4 y sus caracterı́sticas son las siguientes:

Voltaje de alimentación PWR JACK: 5-26V DC


Voltaje de alimentación pines LI-ion: 3.5V a 4.2V
Corriente de funcionamiento: 2A Recomendable
Bajo consumo de corriente: 80mA (modo de suspensión)
Control mediante comandos AT
Tipo de receptor GPS: 22 tracking / 66 canal de adquisición GPS L1 Código C/A
Sensibilidad:
• Seguimiento: -157 dBm
• Arranque en frı́o: -144 dBm
Tiempo para obtener ubicación por primera vez:

1
• Arranque en frı́o: 100s (tı́pico)
• Arranque en caliente: 1s (tı́pico).
Comunicación USB
Protocolo de comunicación UART:
• Velocidad: 1200bps a 115200bps

Módulo acelerómetro MPU6050


Este módulo se muestra en la Figura 1 y sus caracterı́sticas son las siguientes:

Figura 1: Módulo acelerómetro MPU6050

Voltaje de funcionamiento: 3.3V a 5V


Grados de libertad (DoF): 6
Convertidor analógico a digital: 16 bit en todos los ejes
Protocolo de comunicación: I2C
Velocidad I2C: 100kHz - 400kHz
Rango:
• Giroscopio: ±250, ±500, ±1000, ±2000◦ /s
• Acelerómetro: ±2, ±4, ±8, ±16g

Módulo WiFi ESP8266


El módulo se muestra en la Figura 2 y sus caracterı́sticas son las siguientes:

Figura 2: Módulo WiFi ESP8266

2
Voltaje de alimentación: 3.3 V
Protocolo de comunicación: UART
Velocidad UART: 115200bps
Soporte 3 modos: AP, STA, AP + STA
Protocolos soportados: 802.11 b/g/n – TCP/IP
Soporte de red: 2,4 GHz
Control mediante comandos AT

Microcontrolador PIC16F877A
El microcontrolador se muestra en la figura 3 y sus caracterı́sticas son las siguientes:

Figura 3: Microcontrolador PIC16f877A

Voltaje de operación: 4V a 5.5V


Comunicación : 1-A/E/USART, 1-MSSP(SPI/I²C)
• Velocidad SPI/I²C: 100kHz, 400kHz, 1MHz
• Velocidad USART: 1200bps - 312500bps con Fosc=20MHz
Número de I/O: 33
Comparadores: 2 ADC 8 ch, 10-bit
EEPROM: 256 Bytes
RAM: 368 Bytes
Máxima frecuencia de trabajo: 20 MHz
Timer: Dos de 8 bit y uno de 16 bit

Resumen de actividades realizadas


Actividades realizadas anteriormente
Revisión bibliográfica.
Desarrollo de algoritmos correspondientes a la lectura de posición mediante un módulo de
geolocalización.
Desarrollo de algoritmos correspondientes a la lectura de aceleraciones adquiridas mediante
un sensor modular.
Desarrollo de algoritmos correspondientes para crear un enlace de comunicación inalámbrica
entre el sistema de adquisición y un equipo de cómputo mediante un módulo.

3
Prueba del nuevo módulo GPS (SIM808)
El módulo GPS que se usará para la geolocalización es el SIM808, como se puede ver en la Figura
4, este módulo necesita una alimentación de entre 5V y 26V, preferentemente con una fuente distinta
a la del resto de los componentes. El módulo incluye una antena que debe conectarse al puerto
ACTIVE GPS ANTE. Para que este módulo comience a enviar los datos de ubicación, es necesario
encender la fuente de alimentación GNSS con el comando AT+CGNSPWR=1 y activar el envio
de datos recibidos desde el GNSS hacia el UART con el comando AT+CGNSTST=1. Después
de cada comando se debe esperar un tiempo para que responda el módulo SIM808. Cuando el
módulo SIM808 comienza a enviar datos hacia el PIC, tarda aproximadamente un minuto para fija
la ubicación.

Figura 4: Módulo GPS SIM808

Fusión de algoritmos y comporobación de funcionamiento


Se realizaron los algoritmos de cada módulo por separado: Un algoritmo de el módulo SIM808
con el ESP8266 y un algoritmo del módulo MPU6050 con el ESP8266.
Empezando con el algoritmo para la lectura de posición mediante el módulo SIM808. Como
el módulo GPS y el módulo WiFi utilizan el protocolo de comunicación UART y el PIC solo
tiene un puerto fı́sico UART. Se optó por generar un puerto por software para el módulo WiFi,
aprovechando que éste módulo puede funcionar tan solo con el envı́o de datos. El puerto fı́sico se
usó para el módulo GPS, puesto que es importante que no se pierdan los datos que manda hacia
el PIC. Ambos puertos se configuraron a 115200bps. Ası́, cada que se recibe un dato del GPS, se
envı́a ese mismo dato hacia el módulo WiFi.
Para la lectura de aceleraciones se dejó el módulo WiFi en el puerto UART por software y se
configuró el puerto I2C para el módulo acelerómetro con velocidad baja (100kHz). Entrando al
ciclo infinito, se hacen las lecturas correspondientes de aceleración y se envian al módulo WiFi.
Posteriormente se fusionaron ambos algoritmos. Para poder recibir datos de ambos módulos,
SIM808 y MPU6050 respectivamente. Como los datos del acelerómetro llegan constantemente hacia
el PIC, no le da espacio para la recepción de los datos del GPS, entonces lo que se hizo fue que,
sólo se leen los datos el acelerómetro cada vez que hay una lectura del GPS. De esta manera se
pudo lograr enviar datos de ambos módulos por WiFi.

4
GUI en MATLAB
Se creó una interfaz de usuario en MATLAB, como se puede ver en la figura 5, para mostrar los
datos de geolocalización y de aceleraciones. La GUI contiene 2 botones. Con el botón de Iniciar se
crea el cliente TCP y se conecta al módulo ESP8266. Cada vez que se recibe un dato, se compara
la segunda letra de ese dato para distinguir entre Latitud, Longitud, aceleracón en x o aceleración
en y y colocarlas en su respectiva caja de texto. Con el botón de Finalizar se ejecuta un break
para salir del ciclo while. También se agregaron unas lı́neas para almacenar los datos obtenidos en
una matriz y poder usarlos después para graficar e interpretar los movimientos leı́dos.

Manual de usuario
El manual de usuario se realizó de manera breve y se anexa al final del documento.

Resultados
Sistema en reposo
En la figura 5 se muestra la GUI de MATLAB mostrando los datos cuando el sistema no
está en movimiento. Para comprobar las coordenadas mostradas en la GUI, se introdujeron en el
buscador de Google Maps, y comparando con la hubicación proporcionada por el celular, se puede
ver que la ubicación es prácticamente la misma, esto se puede ver en la Figura 6. Para la prueba
del acelerómetro, el módulo se colocó de manera horizontal sobre una mesa, lo que significa que
no hay fuerzas que generen una aceleración. En un caso ideal donde el módulo esté perfectamente
horizontal, las aceleraciones deberian de ser cero. En este caso, se colocó de manera aproximada,
lo que ocasiona que el módulo este ligeramente inclinado y por eso aparecen las lecturas mostradas
en la GUI, esas lecturas son de la acción de la gravedad sobre el sensor.

Figura 5: GUI de MATLAB con datos capturados sin movimiento

Sistema en movimiento
Se realizaron diferentes pruebas tanto para el GPS como para el acelerómetro. Para el GPS se
siguieron las trayectorias mostradas en la Figura 7, siendo el Norte en dirección de la flecha 4 y el
Este en dirección de la flecha 2. Para las trayectorias 1 y 2, se colocaron todos los componentes

5
Figura 6: Comparación de ubicación del módulo vs ubicación del celular

sobre una silla, incluyendo la antena. Se desplazó la silla 4.5m hacia el Sur, 2.7m hacia el Este, y
de regreso. Para las trayectorias 3 y 4, se dejó todo el circuito sobre una mesa y se desplazó solo
la antena del GPS, primero hacia el Este y luego en forma de arco hacia el Suroeste, regresando
al final hacia el Norte. En las gráficas se puede observar un movimiento un tanto parecido al de
las trayectorias realizadas, pero no se logra obtener con buena calidad debido a que las pruebas se
realizaron en un espacio reducido. Estas trayectorias se muestran en las Figuras 8 a 15.

Trayectorias 1 y 2 Trayectorias 3 y 4

1 4.5m 2.4m 1
4
2.4m
3
2 2.7m

Figura 7: Trayectorias para pruebas de GPS

En las trayectorias 1 y 2, el primer cambio es una disminución en la latitud, lo que significa que
hay un desplazamiento hacia el sur, que es el primer desplazamieno, se mantine un poco mientras
se hace el desplazamiento hacia el Este y vuleve a regresar a la coordenada de inicio. En el caso
de la trayectoria 2, la latitud no alcanzó a actualizarse hasta llegar al punto de inicio. La longitud
se mantiene mientras el desplazamiento es hacia el Sur, cuando el desplazamiento cambia hacia
el Este, hay un aumento en la longitud y al regresar, la longitud vuelve a disminuir. En el caso
de la longitud 1, hubo mayor retraso en la recepción GPS y no alcanzó a seguir por completo la
trayectoria. Esto se puede ver en las Figuras 8 a 11.
En las trayectorias 3 y 4, el primer movimiento es hacia el Este, por lo que la latitud se mantiene
sin cambio, cuando el movimiento es hacia el Suroeste, hay un cambio gradual negativo ya que
se dirige hacia el Sur y finalmente regresa a la posición con un cambio positivo hacia el Norte.
En el caso de la trayectoria 3 apareció primero un cambio positivo antes de ir al Sur. La longitud
aumenta positivamente con el primer movimiento, ya que es hacia el Este, y disminuye enseguida
con el segundo movimiento manteninedose hasta regresar al punto de partida. Esto se puede ver
en las Figuras 12 a 15.

6
Latitud 1
20.55092

20.550915

20.55091
Desplazamiento

20.550905

20.5509

20.550895

20.55089

20.550885

20.55088
0 10 20 30 40 50 60 70
Muestras

Figura 8: Gráfica para la latitud de la trayectoria 1

Longitud 1
-101.19891

-101.19892

-101.19893
Desplazamiento

-101.19894

-101.19895

-101.19896

-101.19897
0 5 10 15 20 25 30 35
Muestras

Figura 9: Gráfica para la longitud de la trayectoria 1

7
Latitud 2
20.54872

20.5487

20.54868

20.54866
Desplazamiento

20.54864

20.54862

20.5486

20.54858

20.54856

20.54854

20.54852
0 10 20 30 40 50 60 70
Muestras

Figura 10: Gráfica para la latitud de la trayectoria 2

Longitud 2
-101.18312

-101.18314

-101.18316
Desplazamiento

-101.18318

-101.1832

-101.18322

-101.18324

-101.18326

-101.18328
0 5 10 15 20 25 30 35
Muestras

Figura 11: Gráfica para la longitud de la trayectoria 2

8
Latitud 3
20.55096

20.55095

20.55094

20.55093
Desplazamiento

20.55092

20.55091

20.5509

20.55089

20.55088

20.55087
0 50 100 150 200 250
Muestras

Figura 12: Gráfica para la latitud de la trayectoria 3

Longitud 3
-101.19894

-101.19895

-101.19896

-101.19897
Desplazamiento

-101.19898

-101.19899

-101.199

-101.19901

-101.19902

-101.19903

-101.19904
0 20 40 60 80 100 120 140
Muestras

Figura 13: Gráfica para la longitud de la trayectoria 3

9
Latitud 4
20.55102

20.551

20.55098
Desplazamiento

20.55096

20.55094

20.55092

20.5509

20.55088

20.55086
0 50 100 150 200 250
Muestras

Figura 14: Gráfica para la latitud de la trayectoria 4

Longitud 4
-101.19888

-101.19889

-101.1989

-101.19891
Desplazamiento

-101.19892

-101.19893

-101.19894

-101.19895

-101.19896

-101.19897
0 20 40 60 80 100 120 140
Muestras

Figura 15: Gráfica para la longitud de la trayectoria 4

10
Para las pruebas de aceleración, se desplazó el módulo acelerómetro siguiendo las formas mos-
tradas en la figura 16, estas mediciones se hicieron en un área de 20x20 cm. En las Figuras 17 a 22
se muestra el comportamiento de la aceleración de a cuerdo al movimiento realizado. Las gráficas
tienen mucho ruido debido a que los movimientos se hicieron con el módulo en la mano.
Para la aceleración 1, primero hay un movimiento hacia la izquierda, entonces hay un pico en la
aceleración y mientras la aceleración en x permanece constante, cuando el movimiento cambia hacia
atrás, ahora aparece un pico en la aceleración x con un pequeño pico contrario cuando desacelera,
de igual manera cuando el movimiento es hacia la derecha y hacia atrás. El comportamiento se
observa en las Figuras 17 y 18.
Para la aceleración 2, fue un movimiento circular constante, por lo tanto, la aceleración x estuvo
cambiando constantemente tendiendo a una forma senoidal y la aceleración y una forma senoidal
desfasada 180◦ . El comportamiento se observa en las figuras 19 y 20.
Para la aceleración 3, primero hubo un cambio en y con el movimiento horizontal del triángulo,
manteniendose x constante, al acelerar en dirección de la segunda arista, hay cambio de aceleración
en x y y, ya que es un movimiento en diagonal a los dos ejes, hay un alto y luego se acompleta
el triángulo nuevamente con cambio de aceleración en las dos direcciones. El comportamiento se
observa en las figuras 21 y 22.

Aceleración 1 Aceleración 2 Aceleración 3


1 1
1

Figura 16: Desplazamientos para medición de aceleraciones

Aceleración x 1
1

0.8

0.6
Aceleración

0.4

0.2

-0.2
0 10 20 30 40 50 60
Muestras

Figura 17: Gráfica para medición de aceleración x 1

11
Aceleración y 1
0.5

0.4

0.3

0.2
Aceleración

0.1

-0.1

-0.2

-0.3
0 5 10 15 20 25 30 35 40 45
Muestras

Figura 18: Gráfica para medición de aceleración y 1

Aceleración x 2
0.25

0.2

0.15

0.1
Aceleración

0.05

-0.05

-0.1

-0.15
0 2 4 6 8 10 12
Muestras

Figura 19: Gráfica para medición de aceleración x 2

12
Aceleración y 2
0.3

0.2

0.1
Aceleración

-0.1

-0.2

-0.3

-0.4
0 5 10 15 20 25 30
Muestras

Figura 20: Gráfica para medición de aceleración y 2

Aceleración x 3
0.3

0.25

0.2

0.15
Aceleración

0.1

0.05

-0.05

-0.1

-0.15
0 5 10 15 20 25 30 35 40
Muestras

Figura 21: Gráfica para medición de aceleración x 3

13
Aceleración y 3
0.2

0.1

0
Aceleración

-0.1

-0.2

-0.3

-0.4
0 5 10 15 20 25 30 35 40 45 50
Muestras

Figura 22: Gráfica para medición de aceleración y 3

14
Impacto de las actividades en la institución receptora y en la
formación del estudiante
El impacto del proyecto se reflejó en el incremento de las habilidades profesionales del estudian-
te mediante el diseño, análisis y solución de problemas para la creación del sistema de adquisición
inalámbrico de geolocalización y medición de vibraciones. Ası́ mismo, dicho sistema de adquisición
permitirá el desarrollo de aplicaciones y proyectos futuros de investigación en el área de procesa-
miento digital de señales mediante el análisis estadı́stico.

Cronograma original contra cronograma real


Se hicieron algunos cambios en el cronograma debido a problemas con el módulo de geolocali-
zación y se tuvo que usar parte del tiempo destinado al desarrollo de algoritmos para comunicación
inalámbrica. Lo cual provocó un cambio en el tiempo estimado mientras se trabajaban a la par con
los demás móduos. Sin más imprevistos, todas las demás actividades se realizaron en su tiempo.

Actividad Ago Sep Oct Nov Dic


Revisión bibliográfica
Desarrollo de algoritmos para lectura de geolocalización
Desarrollo de algoritmos para la lectura de aceleraciones
Desarrollo de algoritmos para comunicación inalámbrica
mediante módulo
Fusión de algoritmos e implementación en microprocesador
Comprobación de funcionamiento y correcciones
Creación de manual de uso

Figura 23: Cronograma original

Actividad Ago Sep Oct Nov Dic


Revisión bibliográfica
Desarrollo de algoritmos para lectura de geolocalización
Desarrollo de algoritmos para la lectura de aceleraciones
Desarrollo de algoritmos para comunicación inalámbrica
mediante módulo
Fusión de algoritmos e implementación en microprocesador
Comprobación de funcionamiento y correcciones
Creación de manual de uso

Figura 24: Cronograma real

15
Anexo A
En las Figuras 25 y 26 se muestra el código usado en el PIC para la recepción de datos del
módulo SIM808 y el módulo MPU6050. Y el envio de datos hacia el módulo ESP8266.

#include <Integracion4_0.h>

#use RS232(BAUD = 115200, XMIT=PIN_C6, RCV=PIN_C7, parity=N, BITS=8, stream=SIM808, ERRORS) //SIM808
#use RS232(BAUD = 115200, XMIT=PIN_D2, RCV=PIN_D3, parity=N, BITS=8, stream=ESP8266, ERRORS) //ESP8266
#use I2C(MASTER, SDA=PIN_C4, SCL=PIN_C3, SLOW, FORCE_HW) //MPU6050

#include <stdio.h> //enviar y recibir datos getc


#include <MPU6050.c>
#include <GPS_Lib.c>

void main(){

delay_ms(1000);
fprintf(SIM808, "AT\r\n"); //GPS Prueba de inicio
delay_ms(200);
fprintf(SIM808, "AT+CGNSPWR=1 \r\n"); //GPS Encender fuente de alimentación GNSS
delay_ms(800);
fprintf(SIM808, "AT+CGNSTS T=1\r\n"); //GPS Enviar datos recibidos de GNSS a AT UART
delay_ms(200);

for (int n = 6; n!=0; n--){ // Esperar a que el modulo wifi se conecte a la red
delay_ms( 1000 ); // 1 segundo
}
//printf("ATE0\r\n"); //Desactivar eco
delay_ms(200);
fprintf(ESP8266, "AT\r\n"); //Prueba de inicio
delay_ms(200);
/*printf("AT+CWMODE=3\r\n"); //Modo de cliente + servidor
delay_ms(200); //Para primera vez con nueva red, se descomenta de la 30 a la 36
printf("AT+CWJAP=\"JP\",\"2.4casajp\"\r\n"); //Conectarse a la red <ssid>,<pwd>
for (int i = 6; i!=0; i--){ //Esperar a que se conecte
delay_ms( 1000 ); // 1 segundo
}*/
fprintf(ESP8266, "AT+CIPMUX=1 \r\n"); //Habilitar multiples conexiones
delay_ms(200);
fprintf(ESP8266, "AT+CIPSERVER=1,80 \r\n"); //Crear servidor
delay_ms(400);
//Para ver el IP del ESP8266 se usa AT +CIFSR

Figura 25: Código para el PIC parte 1

16
MPU6050_init(); //Iniciar acelerometro
delay_ms(50);

while(TRUE){
if(kbhit() > 0){ //Se recibe un dato por UART
if(GPSRead()){ //Dato recibido de GPS
// Latitude
fprintf(ESP8266, "AT+CIPSEND=0,%d \r\n", 19); //Instruccion para mandar datos mediante wifi,
se especifica la cantidad de bytes a enviar
delay_ms(50);
fprintf(ESP8266, "Latitude: %.6f \r\n", Latitude()); //Manda el dato de la latitud
delay_ms(50);

// Longitude
fprintf(ESP8266, "AT+CIPSEND=0,%d \r\n", 22);
delay_ms(50);
fprintf(ESP8266, "Longitude: %.6f \r\n", Longitude()); //Manda el dato de la longitud
delay_ms(50);

// Aceleracion x
fprintf(ESP8266, "AT+CIPSEND=0,%d \r\n", 14);
delay_ms(50);
fprintf(ESP8266, "Ax = %.6f \r\n", MPU6050_get_Ax()); //Manda el dato de la aceleracion en x
delay_ms(50);

// Aceleracion y
fprintf(ESP8266, "AT+CIPSEND=0,%d \r\n", 14);
delay_ms(50);
fprintf(ESP8266, "Ay = %.6f \r\n", MPU6050_get_Ay()); //Manda el dato de la aceleracion en y
delay_ms(50);
}
}
}
}

Figura 26: Código para el PIC parte 2

17
Anexo B
En la Figura 27 se muestra el código usado en MATLAB para la recepción de datos por WiFi
y mostrarlos en las cajas de texto correspondientes. También se agregan las lı́neas para guardar
los datos de cada variable en una matriz.

t = tcpclient("[Link]",80); %Crear cliente y conectarlo al modulo ESP8266


set(handles.pushbutton2, 'UserData', 0); %0 para no salir de recepcion de datos
%data = int8(1);
%write(t,data) %Mandar dato al ESP8266
contLa = 1;
contLo = 1;
contAx = 1;
contAy = 1;
matLa = zeros(1,1000);
matLo = zeros(1,1000);
matAx = zeros(1,1000);
matAy = zeros(1,1000);
while true
a = char(read(t)) %Datos recibidos
pause(0.1);
b = isempty(a); %Verificar si el dato recibido es un caracter vacio

if b == 0 %Si hay un dato recibido entra al switch

switch a(2) %Ubicar los datos en el cuadro correspondiente


case 'a'
set(handles.edit1, 'String', a(10:end));
matLa(contLa) = str2double(a(10:end)); %llenar matriz con datos obtenidos
contLa = contLa + 1; %Contador para moverse en la matriz
case 'x'
set(handles.edit3, 'String', a(5:end));
matAx(contAx) = str2double(a(5:end));
contAx = contAx + 1;
case 'o'
set(handles.edit2, 'String', a(11:end));
matLo(contLo) = str2double(a(11:end));
contLo = contLo + 1;
case 'y'
set(handles.edit4, 'String', a(5:end));
matAy(contAy) = str2double(a(5:end));
contAy = contAy + 1;
end
end
if get(handles.pushbutton2, 'UserData') == 1
%xlswrite('[Link]', matLa); %guardar matriz en documento excel
%xlswrite('[Link]', matLo);
%xlswrite('[Link]', matAx);
%xlswrite('[Link]', matAy);
break; %Salir de la recepcion de datos al presionar 'finalizar'
end
end

Figura 27: Código para en MATLAB

18
Sistema de adquisición inalámbrica de
geolocalización y medición de aceleraciones.

Manual de uso
Introducción
En este manual de usuario se mostrará cómo hacer funcionar el sistema de ad-
quisición inalámbrica de geolocalización y medición de aceleraciones abarcando las
conexiones en los dispositivos fı́sicos, la programación del PIC para la lectura de los
módulos y el envı́o de datos y la programación de MATLAB para mostrar los datos
recibidos en una interfaz gráfica.

Sección (1): Dispositivos fı́sicos


De acuerdo con el diagrama de flujo de la Figura 3, para iniciar el sistema se
deben alimentar los módulos del GPS (SIM808), Acelerómetro (MPU6050) y WiFi
(ESP8266).
Comenzando con el módulo SIM808 mostrado en la Figura 1:

1. Conecte la antena en la terminal ubicada en el recuadro 6.

2. Conecte la alimentación en el recuadro 1 (Debe ser entre 5V y 26V y 2A).

3. Mueva el switch del recuadro 2 hacia ON.

4. Enciende el led del recuadro 3.

5. Presione el botón del recuadro 4 durante 3 segundos.

6. En los primeros 2 segundos se encenderá el diodo 3 y diodo 4, ubicados en el


recuadro 5, con una intensidad baja.

7. Después del tercer segundo, los diodos 3 y 4, ya estarán encendidos a la inten-


sidad normal.

Ya que el módulo SIM808 está encendido, se procede a encender los módulos


restantes, se puede encender primero el módulo ESP8266 y después el PIC y el
acelerómetro o encender todos al mismo tiempo. El módulo ESP8266 funciona a
3.3V y el PIC necesita una alimentación de 5V. Para poder comunicar correctamente
el ESP8266 con el PIC, se necesita un convertidor de nivel lógico para no quemar el
módulo con 5V. Al contrario, si se necesitan mandar datos del ESP8266 hacia el PIC
con 3.3V, el PIC no reconoce los niveles altos recibidos porque necesita por lo menos

1
5 6
2

3 4

Figura 1: Módulo SIM808

un voltaje de 4V (80 % del voltaje de alimentación del PIC) para reconocerlos. En


la figura 2 se muestra el convertidor de nivel lógico. Este convertidor cuenta con 4
canales individuales de 3.3V a 5V y de 5V a 3.3V.

Figura 2: Convertidor de nivel lógico bidireccional de 4 canales

2
Dispositivos MATLAB
PIC (2)
físicos (1) Inicio (3)
Inicio Inicio

Encender Definir puertos Correr programa


GPS UART e I2C para acceder a
la GUI

Presionar 3s Iniciar SIM808


botón de GPS con comandos Esperar a que el
AT ESP8266
comience con la
Alimentar transmisión
todo el Iniciar ESP8266
circuito con comandos
AT

Fin Botón de
Iniciar MPU6050 inicio

While
While true
(TRUE)

Datos recibidos
Dato
No recibido
de GPS Verificar dato
recibido
Si
Enviar datos
por WiFi Dato No
recibido

Si
Fin

Switch case
-dato

Si Mostrar
Latitud latitud
No

Si Mostrar
Aceleración
Ax
en x

No
Si Mostrar
Longitud
longitud
No

Si Mostrar
Aceleración Ay
en y

No

No Si
Finalizar Fin

Figura 3: Diagrama de flujo del proyecto

3
Conexiones del PIC
El módulo GPS se conectó al puerto UART fı́sico en los pines C6/TX y C7/RX,
tomando en cuenta que se deben conecatar cruzados con los del módulo: TX-RX,
RX-TX.
El módulo WiFi se conectó a un puerto UART por sofware en los pines D2/TX
y D3/RX, de igual manera se deben conectar cruzados.
El módulo acelerómetro se conectó al puerto I2C en los pines C4/SDA y C3/SCL.
Éstos si se conectan directos: SDA-SDA, SCL-SCL. No olvidar las resistencias pull-
up de 10kΩ.

Sección (2): Programación del PIC


Después de inicializar el pic (Integracion3 0.h) con el código de la Figura 4, se
inicializan los puertos UART e I2 C.
El puerto UART para el ESP8266 se define como puerto por software, lo que
implica que consume mucho procesamiento del PIC y no es recomendable para
recibir datos, puesto que muchas de las veces no se recibirán ya que no existe un
registro fı́sico para interrupción por recepción.
Ambos puertos trabajan a 115200 baudios por segundo para no cambiar la razón
de baudios del ESP8266 y aprovechando que el SIM808 detecta automáticamente la
velocidad a la que se trabajará.
Para el I2C se trabaja con una velocidad de 100 Kbit/s. En la Figura 5 se
muestran las lı́neas de código usadas.

#include <16F877A.h>
#device PASS_STRINGS = IN_RAM
#device ADC=16

#FUSES HS //20 MHz


#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming

#use delay(crystal=20MHz)

Figura 4: Código para inicializar el PIC

#use RS232(BAUD = 115200, XMIT=PIN_C6, RCV=PIN_C7, parity=N, BITS=8, stream=SIM808,


ERRORS) //SIM808
#use RS232(BAUD = 115200, XMIT=PIN_D2, RCV=PIN_D3, parity=N, BITS=8, stream=ESP8266,
ERRORS) //ESP8266
#use I2C(MASTER, SDA=PIN_C4, SCL=PIN_C3, SLOW, FORCE_HW) //MPU6050

Figura 5: Código para inicializar los puertos UART e I2C

Inicialización de módulo SIM808


En la Figura 6 se muestran las lı́neas de código con las que se inicializa el SIM808.
Primero se enciende la fuente de alimentación GNSS y después se habilita el envı́o

4
de los datos recibidos hacia el PIC. El SIM808 comenzará a buscar la ubicación y
en cuanto se fije, comenzará a parpadear el diodo 5 ubicado en el recuadro (5) de
la figura 1. Se debe dejar un tiempo de retardo entre cada comando AT para que lo
procese el módulo.

delay_ms(1000);
fprin�(SIM808, "AT\r\n"); //GPS Prueba de inicio
delay_ms(200);
fprin�(SIM808, "AT+CGNSPWR=1 \r\n"); //GPS Encender fuente de alimentación GNSS
delay_ms(800);
fprin�(SIM808, "AT+CGNSTST=1 \r\n"); //GPS Enviar datos recibidos de GNSS a AT UART
delay_ms(200);

Figura 6: Inicialización del SIM808

Inicialización de módulo ESP8266


Para inicializar el ESP8266 se necesitan las lı́neas de la figura 7, después de cada
comando AT se le debe dar un tiempo al módulo para que procese la instrucción.
Al encender, el ESP8266 trata de conectarse a la última red guardada, se le dan 6
segundos para esta operación. Enseguida se le manda una prueba de inicio a la que
el módulo debe responder con un OK, en caso de que sı́ se conecte automáticamente

for (int n = 6; n!=0; n--){ // Esperar a que el modulo wifi se


conecte a la red
delay_ms( 1000 );
}
//printf("ATE0\r\n"); //Desactivar eco
delay_ms(200);
fprintf(ESP8266, "AT\r\n"); //Prueba de inicio
delay_ms(200);
/*printf("AT+CWMODE=3\r\n"); //Modo de cliente + servidor
delay_ms(200); //Primera vez con nueva red, se descomentan estas lineas
printf("AT+CWJAP=\"Nombre\",\"contraseña\"\r\n"); //Conectarse a la red
<ssid>,<pwd>
for (int i = 6; i!=0; i--){ //Esperar a que se conecte
delay_ms( 1000 );
}*/
fprintf(ESP8266, "AT+CIPMUX=1\r\n"); //Habilitar multiples conexiones
delay_ms(200);
fprintf(ESP8266, "AT+CIPSERVER=1,80\r\n"); //Crear servidor
delay_ms(400);
//Para ver el IP del ESP8266 se usa AT+CIFSR

Figura 7: Inicialización del ESP8266

a una red, solo resta habilitar las múltiples conexiones para crear el servidor. En
caso de que se necesite conectar a una red nueva, después de mandar la prueba de
inicio, se le manda el modo de trabajo que es Cliente + Servidor, los datos de la
red y se esperan 6 segundos mientras se hace la conexión. Finalmente se habilitan
las multiples conexiones y se crea el servidor.

5
Inicialización de módulo MPU6050
Para inicializar el acelerómetro MPU6050, se usa MPU6050 init(); que es una
función de la biblioteca MPU6050.c.

Envı́o de datos hacia el ESP826


Una vez que se ha concluido con la inicialización de los tres módulos, se comienza
con el envı́o de datos de aceleración y posición hacia el ESP8266. Los datos se envı́an
cuando se reciba un dato del SIM808. No se pueden enviar los datos del Acelerómetro
independientemente de los datos del módulo GPS, ya que, el Acelerómetro manda
datos más rápido que el módulo GPS y esto provoca que no alcance a detectar la
recepción del módulo GPS. En la Figura 8 se muestra el código.

while(TRUE){
if(kbhit() > 0){ //Se recibe un dato por UART
if(GPSRead()){ //Darto recibido de GPS
// Latitude
fprintf(ESP8266, "AT+CIPSEND=0,%d\r\n", 19);//Instruccion
para mandar datos mediante wifi
delay_ms(50);
fprintf(ESP8266, "Latitude: %.6f\r\n", Latitude());
//Manda el dato de la latitud
delay_ms(50);

// Longitude
fprintf(ESP8266, "AT+CIPSEND=0,%d\r\n", 20);
delay_ms(50);
fprintf(ESP8266, "Longitude: %.6f\r\n", Longitude());
//Manda el dato de la longitud
delay_ms(50);

// Aceleracion x
fprintf(ESP8266, "AT+CIPSEND=0,%d\r\n", 14);
delay_ms(50);
fprintf(ESP8266, "Ax = %.6f\r\n", MPU6050_get_Ax());
//Manda el dato de la aceleracion en x
delay_ms(50);

// Aceleracion y
fprintf(ESP8266, "AT+CIPSEND=0,%d\r\n", 14);
delay_ms(50);
fprintf(ESP8266, "Ay = %.6f\r\n", MPU6050_get_Ay());
//Manda el dato de la aceleracion en y
delay_ms(50);
}
}
}

Figura 8: Código para el envı́o de datos hacia el ESP8266

6
Sección (3): Programación en MATLAB
Al correr el programa de matlab (TCP GUI.m) se abre la GUI, Figura 9.

Figura 9: GUI diseñada en MATLAB para mostrar los datos de posición y aceleración

Antes de presionar el botón de inicio en la GUI se debe esperar a que el ESP8266


halla creado el servidor. Viendo el módulo fı́sico, se sabe que se ha creado el servidor
y ha comenzado a enviar datos cuando el diodo LED azul comienza a parpadear
constantemente, esto es aproximadamente 8 segundos cuando se conecta a una red
conocida y 13 segundos cuando es una red nueva.
Cuando se presiona el botón de Iniciar, el programa entra a la función de ese
botón llamada pushbutton1 ; dentro de esta función, se crea el cliente, como se mues-
tra en la Figura 10. A esta función se le especifica la dirección IP del módulo WiFi
ESP8266 que en este caso es [Link] y el puerto que se le ha asignado (Puer-
to 80). Esa dirección IP se la asigna el modem al módulo pero se puede cambiar con
el comando siguiente, por ejemplo: AT+CIPSTA=”[Link]”.

t = tcpclient("[Link]",80);

Figura 10: Lı́nea de código para crear cliente TCP

Para conocer la dirección IP del módulo ESP8266, es necesario que el módulo


esté conectado ya a una red WiFi, esto se puede hacer usando el código del PIC de
inicializar el módulo ESP8266 para el caso de que sea una red nueva. Si el módulo
ESP8266 ya tiene una red conocida, entonces se necesita un programa de monitor
RS232 configurado a 115200 baudios por segundo (se puede usar el monitor serie de
Arduino). Cuando en el monitor aparezca que se ha conectado a la red WiFi, se le
manda la instrucción siguiente al módulo: AT+CIFSR, el módulo responde como se
muestra en la figura 11 y se debe usar el IP llamado STAIP. Otra forma de conocer
la dirección IP, es asignandole una IP manualmente, como se describió en el parrafo
anterior.
Al botón de finalizar se le asigna un 0 para que el programa se mantenga en el
ciclo while, Figura 12.

7
Figura 11: Respuesta del módulo ESP8266 al comando AT+CIFSR
set(handles.pushbutton2, 'UserData', 0);

Figura 12: Lı́nea de código para asignar un 0 al botón de finalizar

Cuando inicia el ciclo while, a una variable a se le asignan los datos recibidos
y convertidos a char, se hace una pausa de 100ms para que no se amontonen los
datos recibidos y se verifica si el dato recibido es un caracter vacio o no con la
función isempty(a). Si el dato no es un caracter vacio, entonces se puede entrar al
switch case para imprimir los datos en las cajas de texto correspondientes. En la
figura 13 se muestran estas lı́neas de código. Para seleccionar qué dato va en la caja
correspondiente, el switch case compara la segunda letra de cada dato recibido, para
la Latitud se usa la a, para la Longitud se usa la o. Para las aceleraciones se usa x
y y respectivamente.

while true
a = char(read(t))
pause(0.1);
b = isempty(a);
if b == 0
switch a(2)
case 'a'
set(handles.edit1, 'String', a(10:end));
case 'x'
set(handles.edit3, 'String', a(5:end));
case 'o'
set(handles.edit2, 'String', a(11:end));
case 'y'
set(handles.edit4, 'String', a(5:end));

Figura 13: Código para mostrar los datos recibidos en MATLAB

Si se presiona el botón de finalizar, su valor cambia a 1 y con las lı́neas de la


Figura 14 se sale del ciclo while y se dejan de recibir datos.

if get(handles.pushbutton2, 'UserData') == 1
break;

Figura 14: Código para salir del ciclo while y dejar de recibir datos

8
3V3
5V

C1 LEVEL CONVERTER
HV1
1 2
LV1
ESP8266
3 4 1 8
U1 HV2 LV2 GND TX
22pF CRYSTAL HV
5 6
LV IO2
2 7
EN
20MHz 13 33 7 8 3 6
C2 OSC1/CLKIN RB0/INT GND GND IO0 RST
14 34 9 10 4 5
OSC2/CLKOUT RB1 HV3 LV3 RX 3V3
35 11 12
RB2 HV4 LV4
2 36
ICSP RA0/AN0 RB3/PGM
22pF 3 37
RA1/AN1 RB4
5 4 38
PGC RA2/AN2/VREF-/CVREF RB5
4 5 39
PGD RA3/AN3/VREF+ RB6/PGC
3 6 40
GND RA4/T0CKI/C1OUT RB7/PGD 3V3
2 7
VDD RA5/AN4/SS/C2OUT
VPP
1
RC0/T1OSO/T1CKI
15 R3
8 16 100
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
R1 23
RC4/SDI/SDA 5V
1 24
MCLR/Vpp/THV RC5/SDO
100 25
RC6/TX/CK MPU6050
26
RC7/RX/DT
1
VCC
19 2
5V RD0/PSP0 GND
R2 RD1/PSP1
20 3
SCL
10k 21 4
RD2/PSP2 SDA
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877A
SIM808
1
TX0
2
RX0
3
GND

También podría gustarte