GSM con módulo A6
El A6 es un módulo GSM capaz de gestionar tanto llamada como mensajes SMS de telefonia. Es mucho más simple que SIM900 y su conexión con Arduino es muy simple para enviar y recibir SMS. También hay un A7 que añade recepcion de GPS y tiene dos antenas y otro puerto serie.
Abajo vemos el conexionado con Arduino que no es mas que una de tipo serie. Además y de forma permanente o con un pulso inicial, es necesario conectar a VCC el terminal PWR_KEY para que sistema funcione.
Ni que decir que necesitamos una SIM válida a la que previamenmte desactivaremos (en un teléfono normal) la clave de entrada.
Un vez todo conectado, con tensión y la SIM en su tarjetero y puesto que el módulo no tiene ningún LED indicador, la forma de saber que todo esta en orden es hacer una llamada a ese número y escuchar el tono de llamada en el teléfono que llama.
//PARA HACER UNA LLAMADA
char telefon[]="6591*****";
void setup()
{
Serial.begin(9600);
delay(200);
Serial.println("AT");
delay(1000);
Serial.print("ATD"); //Marcar
Serial.println(telefon);
delay(10000);
Serial.println("ATH"); //Termina la llamada
}
void loop()
{
}
Con el siguiente código podemos hacer una llamada. Es evidente que para cargar el Arduino es necesario desconectar el serie del A6.
El A6 permite la recepción de comandos AT que nos dan información. Pongo aquí algunos de los mas interesantes y la respuesta del A8
La parte más interesante es el envio y recepción de mensajes SMS. Con ellos podremos trasmitir información desde el módulo a nosotros u ordenarle que a traves de Arduino realize acciones.
//PARA MANDAR UN SMS
char phone_no[]="6591******";
void setup() {
Serial.begin(9600);
delay(300);
Serial.println("AT+CMGF=1");
delay(2000);
Serial.print("AT+CMGS=\"");
Serial.print(phone_no);
Serial.write(0x22);
Serial.write(0x0D); // hex equivalent of Carraige return
Serial.write(0x0A); // hex equivalent of newline
delay(2000);
Serial.print("GSM A6 test message!");
delay(500);
Serial.println (char(26));//the ASCII code of the ctrl+z is 26
}
void loop()
{
}
Por último vemos como enviar una orden desde nuestro teléfono al A6 que será gestionada por su Arduino al que esta conectado.
Decir que los mensajes se mandan en un formato codificado complejo llamado PDU. Su decodificación no nos interesa, solo los dos últimos digitos. En nuestro teléfono enviamos un solo digito (0,1,2 o el que sea), A6 lo recibe y lo pasa al Arduino por el serial. Arduino lee el mensaje y selecciona los dos ultimos digitos del mismo que es el valor Hexadecimal del número que hemos enviado y según sea hará una acción u otra en un simple bucle case.
//RECEPCIÓN DE SMS CON ORDENES
String msg="";
int longi;
int dato;
String hh;
char buffer[100];
char end_c[2];
void setup() {
Serial.begin(115200);
end_c[0] = 0x1a;
end_c[1] = '\0';
}
void loop() {
if (Serial.available()) {
hh = Serial.readStringUntil('\n');
hh.toCharArray(buffer, hh.length() + 1);
if (hh.indexOf("ende") == 0) {
Serial.write(end_c);
Serial.println("ende");
} else{
Serial.write(buffer);
Serial.write('\n');
String msg=buffer;
longi=(msg.length()); //Longitud del mensaje (más el CR)
msg=(msg.substring(longi-3,longi-1)); //Extrae los dos últimos caracteres del SMS
// Serial.println(msg);
dato=msg.toInt();
}
}
switch (dato){
case 31: // 1 ASCII en Hex
Serial.println("Accion uno");
//Hacer algo
dato=0;
break;
case 32: //2 ASCII en Hex
Serial.println("Accion dos");
//Hacer algo
dato=0;
break;
case 33: //3 ASCII en Hex
Serial.println("Accion tres");
//Hacer algo
dato=0;
break;
}
}