Problema con GSM800L V2, no recibo respuesta de comandos AT en el Monitor Serie.

Hola chicos,

Soy nuevo en el foro y estoy necesitando de su ayuda para entender porque mi módulo GSM800L V2 no me regresa las respuestas a los comandos AT.

Incluso, si los escribo directamente/a mano en el monitor serial tampoco me regresa respuesta alguna.
He revisado infinidad de ejemplos en Youtube y también otros acá en el foro, sigo los pasos al pie de la letra y me sigo topando con el mismo problema una y otra vez.

Les comento como esta: tengo mi GSM800L conectado a mi Arduino Mega 2560, el módulo GSM lo alimento directamente de Arduino y este a su vez lo alimento desde el puerto usb a mi laptop. Al momento de poner en ejecución el código que muestro más abajo, que simplemente envía comandos AT al módulo GSM; NO logro conseguir respuesta en el monitor serial de Arduino.

Si envío el comando AT, no recibo el OK. En cambio, si envío el comando ATD429XXXXXX el modulo SI hace la llamada, pero de nuevo no recibo respuesta alguna del módulo GSM en el monitor serial. Eso no es todo, incluso si por código le paso los parámetros para enviar mensajes de texto al mismo número, SI lo hace sin dificultad, a mi cel me llegan los mensajes.

Es como si ejecutara los comandos AT pero simplemente existiera una falta de comunicación entre el puerto serial que habilito para el Arduino, y el puerto serial para el módulo GSM. Y como verán en el código, ambos trabajan a la misma frecuencia.

Mi idea principal, es habilitar el módulo GSM para recepción de mensajes de texto, y verificar si el mensaje coincide con la palabra declarada en la variable de tipo String. En base a ello mostrar el mensaje en el monitor serial del Arduino.

De favor chicos, ayúdenme a ver mi error, sé que debo tenerlo en algún lado o que algo no estoy colocando, solo que ya no logro verlo.

#include <SoftwareSerial.h>
//Se declara los pines en arduino para el modulo GSM.
SoftwareSerial MOD_SIM800L(19, 18);
/* Distibución de los pines del sheld GSM con relación a la placa arduino.
   ARDUINO MEGA     SIM800L
      19              TX 
      18              RX
*/

String SMSincoming; // Variable que contendra los sms entrantes.



void setup() {
  //Velocidad de trabajo entre el Arduino MEGA y el Modulo SIM800L (Puerto Serial)
  Serial.begin(115200); // Activamos el monitor serial para el Arduino.
  MOD_SIM800L.begin(115200); //Configura velocidad del puerto serie para el SIM800L.

  MOD_SIM800L.print("AT+CLIP=1\r"); //Activamos la identificación de llamadas.
  MOD_SIM800L.print("AT+CMGF=1\r"); // configura SMS en módulo de texto.
  MOD_SIM800L.print("AT+CNMI=2,2,0,0,0\r”"); /* Transmisión de mensaje directamente al puerto serial del dispositivo. */
  MOD_SIM800L.print("AT+CMGD=1,4"); // Elimina todos los mensajes de la SIM.

}

void loop() {
  if (MOD_SIM800L.available()) { // SI HAY DATOS EN LA INTERFAZ SERIAL POR HARDWARE, ESCRIBIRLOS EN EL UART EMULADO
    Serial.write(MOD_SIM800L.read());
  }
  if (Serial.available()) { // SI HAY DATOS EN LA INTERFAZ SERIAL POR SOFTWARE, ESCRIBIRLOS EN EL UART FISICO
    MOD_SIM800L.write(Serial.read());
  }

  if(MOD_SIM800L.available()>0) {
    SMSincoming = MOD_SIM800L.readString(); //Guardar en la variable el valor del sms que se recibe.
  }

  if(SMSincoming.indexOf ("ON") >= 0 || SMSincoming.indexOf ("on") >= 0) {
    Serial.println("Texto: ");
    Serial.print(SMSincoming);
  }

}

Aca esta tu problema

Les comento como esta: tengo mi GSM800L conectado a mi Arduino Mega 2560, el módulo GSM lo alimento directamente de Arduino y este a su vez lo alimento desde el puerto usb a mi laptop.

El modulo GSM800L requiere una corriente importante al momento de comunicarse, puede que para responder los comandos AT no sea el caso pero si según el comando que le solicites.
Ademas, la alimentación es estricta. No lo alimentas con 5V y si lo hiciste ya lo quemaste.

Intenta por favor proveer información de como tienes cableado el modulo a tu arduino.
Porque nosotros necesitamos entender eso para ayudarte.

Algo mas.
Arduino MEGA tiene 4 puertos serie.
Para que usas SoftwareSerial en los mismos pines que tienes un Serial1 por hardware?

#include <SoftwareSerial.h>
//Se declara los pines en arduino para el modulo GSM.

SoftwareSerial MOD_SIM800L(19, 18);
/* Distibución de los pines del sheld GSM con relación a la placa arduino.
   ARDUINO MEGA     SIM800L
      19              TX
      18              RX

Hola survyte,

Gracias por responder. Te comento que uso el software serial porque así lo vi en el tutorial que seguí para poder hacer que el modulo me enviara mensajes al móvil. En otros tuto he visto que utilizan otros puertos digitales para hacer la conexión.

Por el momento, me recomiendas cambiar los pines del 19 y 18, por otros como el 50 y 51 por ejemplo?

En cuanto al diagrama, lo confeccionare con Fritzin para poderlo subir al post y puedan apreciarlo.

El día de hoy también me llegan unos reguladores de voltaje DC. Quiero hacer la prueba de conectar el modulo directamente al regulador para verificar su funcionamiento. Pense que como había logrado que enviara los mensajes con la alimentación del arduino no ocuparía de ellos, pero.... esperemos que en efecto no se halla quemado el modulo.

En unos minutos subo el diagrama de cableado.

Surbyte, adjunto encontraras el diagrama de como esta conectado el arduino y el modulo GSM. La representación gráfica de este ultimo no es correcta ya que no esta disponible en Fritzing, pero basicamente los pines que utilizo son los correctos.

Saludos.

Actualización de estatus....

Ya me llegaron los stepdown DC, lo alimente el modulo con una fuente externa regulándolo a 4.3 voltios y no dejaba de reiniciarse el modulo. Solo colocandolo a 4.8 dejo de reiniciarse y posterior encontró la red móvil.

Desde el modulo, como les mencione, puedo hacer llamadas y enviar mensajes. Pero continuo sin poder ver respuestas en el serial cuando lanzo un comando AT. También cambie los pines en el arduino, ahora utiliza el 23 y 24.

Al enviar un mensaje desde mi movil al modulo, no ve nada el modulo o no lo muestra en el serial, de igual forma si le habilito la identificación de llamada y le llamo desde mi móvil no identifica nada el modulo.

Es lo que tengo hasta ahora... alguna idea?

Compartes GND entre el módulo yel ardino? Supongo que si, de lo contrario no podrías envias mensajes o hacer llamadas.

Si, es correcto, comparte GND, de hecho actualmente lo alimento y lo tengo conectado justo como indica en su articulo "imtdb" que es un compañero de acá del Foro.

Este es su articulo:

Ahora, lo curioso es que tanto el como el fabricante en el datashet del modulo, indican que trabaja a voltajes de entre 3.3 y 4.4 pero si yo lo pongo a trabajar en 4.3 el modulo no deja de encender y apagar (básicamente prende, el led de la red parpadea al rededor de tres o cuatro veces y el modulo completo se apaga, y así se repite una y otra ves)

Para que el modulo no haga esto ultimo el voltaje mínimo que debo colocarle es de 4.6 ya anoche hice las pruebas y ese fue el mínimo que logre pasarle para que se mantenga prendido, encuentre la red y permita enviar mensajes y hacer llamada.

He encontrado otras referencias que por el contrario indican que este modulo trabaja en voltajes de 4.5 a 5.0 y que por ello se puede conectar a la alimentación del arduino ya que de su terminal entrega 4.9, pero por igual hay discrepancia en el consumo de amperes, el fabricante dice que necesita 2 amperios continuos y otras referencias indican que solo 800 mili amperios.

Ya solo me queda probar subir el voltaje del stepdown a 4.9 y como este entrega de forma continua 2 amperios ver si así funciona. O la otra es que el modulo sea el del problema y que venga con defecto, para ello tendría que adquirir un segundo y poder verificar.

Tu que opinas???

Hi,
En el sketch el setup para el monitor esta 115200 y la pregunta es si tienes el mismo baud rate en monitor del IDE. Si no lo tienes igual no vaz a reciibir mensajes. Normalmente el baud rate en el IDE es de 9600.

Buen día tauro0221,

Si en ambos tengo configurado el mismo valor, tanto en el softwareSerial como en el IDE para poder visualizarlo. :frowning:

Chicos, resulta que acabo de dar con la solución.

En primer instancia mencionar que no pude bajar el voltaje al modulo, el mínimo que me permite para funcionar bien y no andarse apagando de forma constante es de 4.6 voltios.

Ahora bien, en cuanto al código, hice dos pequeños ajustes. Decidí volver a utilizar los pines TX1 y RX1 del Arduino, y tome en cuenta el comentario de surbyte.

Para que usas SoftwareSerial en los mismos pines que tienes un Serial1 por hardware?

Pues definí el Serial1 con otro nombre para utilizarlo como se indica a continuación:

#define MOD_SIM800L Serial1 //Connect SIM_RX to 18, SIM_TX to 19 of MEGA

En el setup, modifique lo baudios, puse a trabajar los serial en distintas frecuencias. A final de cuentas esta el código indicando que lo que se muestre en uno también lo muestre en el otro (efecto espejo).

Serial.begin(9600); // Activamos el monitor serial para visualizar lo pulsado o valores (x).
MOD_SIM800L.begin(115200); //Configura velocidad del puerto serie para el SIM800L

El código completo quedaría así:

#define MOD_SIM800L Serial1 //Connect SIM_RX to 18, SIM_TX to 19 of MEGA

String valor;  //Declaramos la variable de tipo String valor. 

void setup() {    
  pinMode(23, OUTPUT); //Declarar el pin 23 como salida.    
  
  Serial.begin(9600); // Activamos el monitor serial para visualizar lo pulsado o valores (x).
  MOD_SIM800L.begin(115200); //Configura velocidad del puerto serie para el SIM800L
    
  SIM800L.println("AT+CMGF=1"); //Vamos utilizar los SMS.
  updateSerial();    
  SIM800L.println("AT+CNMI=2,2,0,0,0"); //Configurar el SIM800L p/ que muestre msm por com. serie.
  updateSerial(); 
}

void loop() {

  updateSerial();
  
  if(MOD_SIM800L.available()) {
    valor = MOD_SIM800L.readString(); //Guardar en la variable el valor del sms que se recibe.
  }

  if(valor.indexOf("ON")>0){  //Si la var valor tiene la palabra ON hace esto:
    digitalWrite(23, HIGH);    //Se enciende el pin 13.
    Serial.println("El led se encendio");  //Immprime el mensaje
    delay(15000);
  }
  else {
    digitalWrite(23, LOW);    //Se apaga el pin 13.
    Serial.println("El Led se apago");  //Immprime el mensaje
    delay(15000);
  }
}

void updateSerial() {
  delay(500);
  while (Serial.available()) 
  {
    MOD_SIM800L.write(Serial.read());//Envia lo que el Serial receive al Serial1
  }
  while(MOD_SIM800L.available()) 
  {
    Serial.write(MOD_SIM800L.read());//Envia lo que el Serial1 receive al Serial
  }
}

y el resultado fue el esperado, ya puedo visualizar los comandos que lanzo desde el Serial del IDE, me imprime la respuesta del modulo. Podrán verlo en la imagen adjunta.

Saludos.