¡Buenas tardes!
Posiblemente ya estéis hartos de este tipo de proyectos, pero me propuse hacer un tracker GPS con un módulo GSM/GPS/GPRS y estoy teniendo bastantes problemas...
El módulo en cuestión es este:
Y dispongo de una Arduino Mega para el proyecto.
He aquí un detalle de la fila de pines del centro:
Según se especifica en el datasheet de la placa, si conecto GSM EN y GPS EN a D2 y D3 respectivamente, puedo controlar la salida serial. Si pongo una a tierra y la otra a 5V, permito que esos pines se conecten al puerto serie 0 (p.ej, con GSM EN a GND y GPS EN a 5V lo que hago es que GSM RX esté conectado a Duino TX(TX0) y GSM TX a DuinoRX (RX0)).
Mi idea de proyecto es esta:
1.- Se llama/envía un mensaje con el texto 'GO', que provoca una interrupción externa.
2.- Ésta hace que se habilite el modo GSM (por lo que he dicho antes de GSM EN) y se envíe la orden de iniciar el GPS, algo así...
digitalWrite(2,LOW);//Enable GSM mode
digitalWrite(3,HIGH);//Disable GPS mode
delay(2000);
Serial.begin(9600);
delay(5000);//GPS ready
Serial.println("AT");
delay(2000);
//turn on GPS power supply
Serial.println("AT+CGPSPWR=1");
delay(1000);
//reset GPS in autonomy mode
Serial.println("AT+CGPSRST=1");
delay(1000);
Serial.println("AT+CGPSIPR=115200");
mySerial.begin(115200);
delay(1000);
3.- Una vez iniciado, se pasaría al Modo GPS, y con unas funciones que tengo ya declaraads, se decodificaría la hora, la latitud, longitud, etc y se meterían en variables.
4.- En principio, el proyecto consistiría en que ahora otra interrupción (esta interna, un timer cada 1-2 segundos) subiese la información de estas variables a internet, para leerlas en una página con código PHP por medio de un $GET. Pero antes, para hacer las pruebas, lo primero que quiero hacer es obtener datos fiables, cosa que NO estoy consiguiendo...
Me dan hasta vergüenza hacer dudas así quedándome 1mes - 1 mes y medio para hacer el proyecto, pero bueno, ahí van:
-En 1) digo que quiero que la recepción de la llamada/SMS provoque una interrupción externa. ¿Cómo? Había planteado hacer algo así:
if(Serial.available() >0)
{
delay(10);
orden=Serial.read(); //Leemos el primer caracter del sms
if (orden=='G')
{
orden=Serial.read();//Leer el siguiente caracter
if (orden=='O'){
protocol=true;} //COMENZAMOS EL PROTOCOLO
}
Pero esto no sería con interrupciones, sino simplemente poner a 1 una variable booleana que habilitase el comienzo del GPS. ¿Cómo puedo hacer que al recibir un SMS eso provoque una interrupción que ponga en marcha el GPS? Por si acaso, el módulo que tengo es una SIM908, por si sirve de algo...
Además me viene bien lo de las interrupciones porque también quiero que, al recibir otro SMS (por ejemplo uno con la palabra 'END') se provoque el fin del programa, llevándolo a su estado inicial de esperar el comienzo del protocolo, y este mensaje se recibiría en cualquier momento (por ejemplo, mientra esté el GPS funcionando) y con eso solo se me ocurre que pueda funcionar las interrupciones externas... ¿alguna ayuda?
- He estado probando pero no consigo una señal GPS fiable. Tengo conectada esta antena GPS al pin del que dispone para ello el módulo SIM908:
Para probarla, lo que he hecho es conectar la arduino al PC y la placa GSM/GPS por su puerto UART al PC también, de modo que primero habilitaba el modo GSM con el Puerto Serie 0 de la Arduino, encendía el GPS y ponía el baud-rate en 115200, para luego habilitar el modo GPS, y pasar a ver en el Monitor Serie lo que me llegaba por el puerto de la placa. Es decir, conectaba GSM RX con DuinoTX, GSM TX con Duino RX, y luego GPS RX con USB TX y GPS TX con USB RX. Le costaba mucho hacer el Fix, y cuando lo hacía, obtenía datos erráticos (a 50 metros de mi posición y saltando 4 o 5 metros alrededor a cada Fix). Sin embargo, quitando la placa GSM y probando con un módulo Adafruit Ultimate GPS Breakout 3.0 + la antena que os he mostrado antes, obtengo unos resultados magníficos. ¿Alguna idea?
-Una dudilla de concepto.... si lo que quiero es:
--> Esperar a que llegue un SMS que inicie el protocolo. [MODO GSM]
--> Activar el GPS mediante comandos AT [MODO GSM]
--> Obtener Fix por el GPS y refrescar cada segundo. [MODO GPS]
--> Mandar los datos de las variables por PHP. [MODO GSM]
--> Seguir con estos últimos dos pasos de forma ininterrumpida hasta que el usuario lo decida.
--> Terminar el protocolo volviendo al primer paso enviando un mensaje/llamando. [MODO GSM]
¿Cuántas interrupciones internas/externas necesitaría, y cuántos puertos? Había deducido que una interrupción interna para la alternancia entre modo gps y gsm en la obtención/subida de datos a internet, y otra externa para el inicio/final del protocolo, y 2 puertos serie Hardware para GSM y GPS. ¿Es así?
Perdón por la extensión del mensaje, y también por la ignorancia. ¡Gracias de antemano!
Un saludo!