SIM 808 GSM/GPRS/GPS + Arduino UNO

Hola, buenas noches.

Hace un buen tiempo compré una placa de imitación Arduino (falta de recursos), ahora pude comprar una original, mi asunto es que tengo una SIM 808, la cual necesito configurarla para que al activarse un sensor de impacto envíe un SMS a cierto número celular detallando la ubicación GPS. El primer paso que quiero dar es realizar un simple envío mensaje de texto.

Adjunto imágenes de la placa 808:


Como pueden ver en la segunda imagen, la 808 tiene conectada una fuente de poder externa de 12V-2A y la Arduino está conectada via USB al PC. Le he cargado esta configuración, pero no consigo tener comunicación con la placa 808:

void setup() {
   Serial.begin(9600); 
   delay(5000);
}
 
void loop() {
  Serial.println("AT");   
  delay(2000);
  Serial.println("AT+CMGF=1");        
  delay(2000);
  Serial.println("AT+CMGS=\"*569669736XX\"");
  delay(2000);
  Serial.print("Mensaje de prueba"); 
  delay(2000);
  Serial.write(26);           
  while(1);
}

Para probar utilizo el programa SSCOM32, no estoy seguro si hay que declarar los pines 0,1 como RX-TX. Sin más que decir espero que me puedan ayudar en esto, gracias.

Hola maestro lopez , creo que te falta el PIN de la terjeta SIM para poder empezar a trabajar.
creo que era AT+CPIN, r

revisalo en el manual y me cuentas, y asi podremos seguir adelante

Hola....

No, ni siquiera agregando el comando pude hacer funcionar la placa, no hay caso , no he podido realizar mi proyecto, creo que veré otra opción más factible, pero tengo una duda con el código que cree (armando junto a otros códigos, no soy muy diestro en el tema), cargo el código, pero queda en un loop eterno al momento de ejecutarlo (presionando un switch, podrías ayudarme a corregirlo por favor.

Dejo link de ejemplo: - YouTube

int INTERRUPTOR=3;
int val;
int LedV=11;
bool activo=false;

#include <SoftwareSerial.h>
SoftwareSerial GSMSerial(5,6); //TRANSMISOR-RECEPTOR
    
void setup() {
   pinMode (LedV,OUTPUT);
   pinMode (INTERRUPTOR,INPUT);
   GSMSerial.begin(9600);
   Serial.begin(9600);
   delay(3000);
}
 
void loop() {

  val=digitalRead(INTERRUPTOR);
   if (val==HIGH and activo==false)
  {
    activo = true;
   digitalWrite(LedV,HIGH);
    if(Serial.available())                                       //ACTIVACIÓN DE SIM808
      GSMSerial.print((char)Serial.read());
    else
      if(GSMSerial.available())
      Serial.print((char)GSMSerial.read());
    
    Serial.println("AT");                                       //MENSAJE DE TEXTO
  //  delay(2000);
    Serial.println("AT+CMGF=1");       
  //  delay(2000);
    Serial.println("AT+CMGS=\"+5697540525X\"");//
  // delay(2000);
    Serial.print("Mensaje de prueba Smart Life Protector Cristopher López Ingeniería en telecomunicaciones");// Mensaje
  //  delay(2000);
    Serial.println("AT+CSQ");
    Serial.write(26);    
        
          }
  else
  {
    activo=false;
   digitalWrite(LedV,LOW);
  }

Puedes pasar el enlace del datasheet de el módulo de comunicaciones?
.. ¿Has puesto en LOW el pin enable?

Como dice Visionario, veo solo dos conexiones y son 3 mínimas pero además te falta la 4ta que es GND. No veo GND compartido entre placa GPRS y Arduino.

surbyte:
Como dice Visionario, veo solo dos conexiones y son 3 mínimas pero además te falta la 4ta que es GND. No veo GND compartido entre placa GPRS y Arduino.

Visionario:
Puedes pasar el enlace del datasheet de el módulo de comunicaciones?
.. ¿Has puesto en LOW el pin enable?

Hola, disculpa, pero no entiendo tu sugerencia, podrías explicarme por favor.

Visionario:
Puedes pasar el enlace del datasheet de el módulo de comunicaciones?
.. ¿Has puesto en LOW el pin enable?

Aquí tengo dos documentos de la placa (es un poco difícil encontrar documentación sobre esta placa). Además no entiendo cuales son las conexiones necesarias, rx,tx, GND, ¿cual sería la otra?

[]MEGA]](MEGA)

Primero: los enlaces se pegan con tags o etiquetas. Edita Post #6 como bien has hecho antes.

Las 3 conexiones son: TX, RX y POWERON ademas de GND que es obvia.

surbyte:
Primero: los enlaces se pegan con tags o etiquetas. Edita Post #6 como bien has hecho antes.

Las 3 conexiones son: TX, RX y POWERON ademas de GND que es obvia.

Amigo, gracias, con POWERON te refieres al pin D9, que es el encargado de darle la partida a la placa??, que es equivalente al botón lateral?

surbyte:
Primero: los enlaces se pegan con tags o etiquetas. Edita Post #6 como bien has hecho antes.

Las 3 conexiones son: TX, RX y POWERON ademas de GND que es obvia.

Ahora me di cuenta como modificar los posts anteriores, gracias

Poweron es el pin que le da la señal al SIM para inicializarse convenientemente.
Lo dice el datasheet del SIM.

surbyte:
Poweron es el pin que le da la señal al SIM para inicializarse convenientemente.
Lo dice el datasheet del SIM.

Hola, gracias por responder, pero mi pregunta es la siguiente, ya que leí en un manual del mismo modelo de placa, pero de distinto diseño (Sim808) que el POWERON correspondía al botón lateral o también se le puede dar un encendido "lógico" mediante código (aqui está la fuente)

http://www.elecrow.com/wiki/index.php?title=SIM808_GPRS/GSM%2BGPS_Shield_v1.1

también se puede configurar mediante comandos...

int Powerkey = 9;
void setup() {                
  pinMode(Powerkey, OUTPUT);   // initialize the digital pin as an output.  
  power();                     //power on the sim808 or power down the sim808
}
void loop() 
{

}

void power(void)
{
  digitalWrite(Powerkey, LOW); 
  delay(1000);               // wait for 1 second
  digitalWrite(Powerkey, HIGH);
}

esa es mi consulta, a eso se refiere??

P.D Me he conseguido el modelo de Sim808 que aparece en el enlace, llegaré esta noche a probar que sucede y comentaré, gracias.

Eso si quieres llamarlo encendido logico, no hay problema, pero es un pin físico

int Powerkey = 9;

Entonces volvemos a cuantos pines necesitas.
Powekey, TX, RX y GND.

Ahora esta mas claro? Son 3 pines mas GND o sea 4.

Hola MaestroLopez:

Te comento que actualmente estoy trabajando en un proyecto con el SIM808 de Elecrow. Este lo tengo configurado con los jumpers en SWserial, enviando los datos a través de los pines 7 y 8 del Arduino Uno (utilizando la librería SoftwareSerial.h).
Creo que no es correcto que utilices como referencia la placa de desarrollo de Elecrow para tu proyecto, ya que tiene varias diferencias con la tuya.
Por lo que estuve viendo en la información técnica de tu placa, además de conectar los pines de RX y TX, debes conectar el pin VMCU a un voltaje de referencia, el cual adaptará los niveles lógicos de entrada. El texto extraído de la documentación dice:

"5. TTL serial interface: a TTL level interface. Notice that: The pin of VMCU is used to
control the high level of TTL UART, so as to realize to match between 1.25V/3.3V /5V
systems. For example, if you want to use the 51 MCU to control this board, the pin of VMCU
should be connected the DC5V. And if use the STM32 MCU, the pin of VMCU should be
connected the DC3.3V. The pins of RXD is the RXD of SIM808 and the pins of TXD is the
TXD of SIM808. The pin of V_IN can connect the Power, the function of this pin has the
same function of DC044. "

Haciendo la comparación con la placa de Elecrow, dicho voltaje tiene conectado un Zener de 5.1 volts, por lo que te sugiero (a menos que alguien diga lo contrario) lo conectes a 5 volts.

En el siguiente link podrás descargar la información técnica de tu placa

Descargar información técnica aquí

Y en este otro link podrás descargar los archivos .brd y .sch para que hagas tu análisis (debes tener un programa como Eagle instalado):

Descargar aquí

Si logras comunicar la placa de desarrollo del SIM808 con el Arduino a través de los pines 7 y 8, puedes probar el siguiente sketch (a mi me funciona bien):

#include <SoftwareSerial.h>

int Powerkey = 9; 

SoftwareSerial mySerial(7,8); 

void setup()
{
    Serial.begin(115200);
    mySerial.begin(9600); 

  if (! power()) {
    Serial.println(F("SIM808 no puede ser energizado!!"));
    while(1); 
  }   
}

void loop()
{

//Aquí va tu programa

}

/***************************************************************/
/**                  POWER ON                                 **/
/***************************************************************/

boolean power()
{
  digitalWrite(Powerkey, HIGH);
  delay(10); 
  digitalWrite(Powerkey,LOW); 
  delay(10);
  digitalWrite(Powerkey, HIGH);

  Serial.println(F("Intentando encender con comandos AT"));

  int16_t timeout = 7000;

    while (timeout > 0) {   
    while (mySerial.available()) mySerial.read();
  if (sendATcommand("AT","ok",200) == 1)
    break;
    while (mySerial.available()) mySerial.read();
  if (sendATcommand("AT","AT",200) == 1)
    break;
    delay(500);
    timeout-=500;
  }

    if (timeout <= 0) {

    Serial.println(F("Timeout: No responde a los comandos AT."));

  sendATcommand("AT","ok",200);
    delay(100);
    sendATcommand("AT","ok",200);
    delay(100);
    sendATcommand("AT","ok",200);
    delay(100);
  }
  // turn off Echo!
  sendATcommand("ATE0","ok",100);
  delay(100);

  if (sendATcommand("ATE0","OK",100) != 1) {
    return false;
  }

 
  delay(100);
  flushInput(); 

  return true;

}


/***************************************************************/
/**              Send AT Command                              **/
/***************************************************************/


int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){

    uint8_t x=0,  answer=0;
    char response[100];
    unsigned long previous;

    memset(response, '\0', 100);    

    delay(100);

    while( mySerial.available() > 0) mySerial.read(); 
  
    mySerial.println(ATcommand); 
    delay (2000);

    x = 0;
    previous = millis();

    do{
        if(mySerial.available() != 0){    

            response[x] = mySerial.read();
            x++;
            if (strstr(response, expected_answer) != NULL)    
            {              
                answer = 1;
            }
        }
    }
    while((answer == 0) && ((millis() - previous) < timeout));    

        return answer;
}


/***************************************************************/
/**               Flush Input                                 **/
/***************************************************************/

void flushInput() {
    uint16_t timeoutloop = 0;
    while (timeoutloop++ < 40) {
        while(mySerial.available()) {
            mySerial.read();
            timeoutloop = 0; 
        }
        delay(1);
    }
}

Saludos!!!

OHMero:
Hola MaestroLopez:

Te comento que actualmente estoy trabajando en un proyecto con el SIM808 de Elecrow. Este lo tengo configurado con los jumpers en SWserial, enviando los datos a través de los pines 7 y 8 del Arduino Uno (utilizando la librería SoftwareSerial.h).

Hola, gracias por tu comentario...

Lamento decirte que no he podido hacer funcionar el dispositivo....Me compré otro módulo SIM808(A un compañero de universidad que está realizando un proyecto similar)... este va empotrado sobre la Arduino Mega y es mejor así, pero sigo teniendo problemas para conectar (he leído sobre la placa he intentado avanzar en mi proyecto, pero no entiendo que debo hacer para hacer funcionar el módulo)...Por lo que he estado investigando, tiene multiples conexiones, para este caso he elegido la softwareSerial, que utiliza los pines 7 y 8 de la arduino.

Mi consulta es...¿Debo conectarlo desde esta parte del módulo(en circulo rojo) a los pines 7 y 8 de la arduino... esta pregunta se basa en el titulo del siguiente enlace "Serial Port(UART) Communication":

http://www.elecrow.com/wiki/index.php?title=SIM808_GPRS/GSM%2BGPS_Shield_v1.1

o debo simplemente declararlo a nivel de código tal como lo hiciste tu?

#include <SoftwareSerial.h>

SoftwareSerial GSMSerial(7, 8);

Por favor, en verdad que necesito ayuda con esto, gracias...

Hola MaestroLopez:

Lo que está en circulo rojo son sólo Jumpers para indicarle al SIM808 cómo realizarás la comunicación. La posición de los jumpers que enviaste en la fotografía indica que realizarás la comunicación por Software a través de los pines 7 y 8 (de la regleta superior mostrada en la misma fotografía).

Según la información que aparece en la página que enviaste, el uso de cada pin está indicado de la siguiente forma:

Pins usage on Arduino
D0 - Unused if you select hardware serial port to communicate with GPRS+GSM+GPS Shield
D1 - Unused if you select hardware serial port to communicate with GPRS+GSM+GPS Shield
D2 - Unused
D3 - Unused
D4 - Unused
D5 - Unused
D6 - Unused
D7 - Used if you select software serial port to communicate with GPRS+GSM+GPS Shield
D8 - Used if you select software serial port to communicate with GPRS+GSM+GPS Shield
D9 - Used for software control the power up or down of the SIM808
D10 - Unused
D11 - Unused
D12 - Unused
D13 - Unused
D14(A0) - Unused
D15(A1) - Unused
D16(A2) - Unused
D17(A3) - Unused
D18(A4) - Unused
D19(A5) - Unused

Respecto al Arduino que estás utilizando, yo igual tuve problemas porque los pines 7 y 8 del Mega no son compatibles para realizar la comunicación serial por Software. En el siguiente link y texto está la explicación:

https://www.arduino.cc/en/Tutorial/SoftwareSerial

Note:
Not all pins on the Mega and Mega 2560 support change interrupts,
so only the following can be used for RX:
10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

De acuerdo a lo anterior, la mejor opción para el Arduino Mega es realizar la comunicación por los puertos 0 y 1 (Hardware Serial).

En mi caso, opté por continuar trabajando con el Arduino Uno debido a que cumple con las características de mi proyecto. Creo que debes seguir este mismo camino para al menos comprobar la comunicación con los comandos AT. Si lo haces así, puedes utilizar el código que te envié anteriormente sin ningún inconveniente.

Saludos cordiales.

OHMero:
De acuerdo a lo anterior, la mejor opción para el Arduino Mega es realizar la comunicación por los puertos 0 y 1 (Hardware Serial).

Hola, gracias por la ayuda.

Efectivamente tuve que usar el "hardwareserial"

ya he podido realizar llamadas telefónicas y revisar los camndos AT de los documentos del fabricante...ahora estoy intentando crear un código simple que sirva para poder enviar mensajes de texto (sin ofender, pero el código que pusiste anteriormente no lo puedo entender)... Gracias por todo, cualquier cosa escribiré... (yo creo que pronto, porque tengo un montón de preguntas.