Manual
Manual
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 dispocitivos 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.
1
5 6
2
3 4
2
Dispositivos MATLAB
PIC (2)
físicos (1) Inicio (3)
Inicio Inicio
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
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Ω.
#include <16F877A.h>
#device PASS_STRINGS = IN_RAM
#device ADC=16
#use delay(crystal=20MHz)
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);
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.
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);
}
}
}
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
t = tcpclient("192.168.50.113",80);
7
Figura 11: Respuesta del módulo ESP8266 al comando AT+CIFSR
set(handles.pushbutton2, 'UserData', 0);
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 la aceleración en x y en y
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));
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