Páginas

jueves, 13 de agosto de 2015

Tutorial Arduino V: Modulo Lonet GSM/GPRS


En este nuevo tutorial de Arduino vamos a ver como manejar un modulo GSM/GPRS con Arduino, ya os imagináis las posibilidades que tiene que una placa Arduino disponga de conectividad GSM: enviar un SMS o un mail con alertas de sensores, enviar instrucciones a la placa desde un movil,...etc.

Vamos a usar una modulo razonablemente económico, teniendo en cuenta que conseguir conectividad por GSM con Arduino no es especialmente bárato, en concreto el Lonet GSM/GPRS Breakout.

MODULO GSM/GPRS LONET PARA ARDUINO


Se trata de una placa con antena GSM externa e incluida con la misma, lo cual es una ventaja interesante, boton de reset, leds de estado (alimentación y conectividad), que admite una tensión de alimentación de entre 3.4V y 4.4V (por lo que podemos alimentarla con una batería Li-Po) y que tiene un ultrabajo consumo en modo "sleep", esto combinado con que dispone de un pin para encender y apagar el modulo por software consituye una ventaja fundamental en multitud de proyectos.

La Lonet, como la mayoría de los módulos GSM actuales, admite control por comandos AT por serial, estos los podemos enviar abriendo una sesión de terminal, usando Putty por ejemplo, y conectando el modulo al PC mediante un Cable de USB a TTL.

Cable USB a TTL


Sin embargo con Arduino podemos enviar comandos AT directamente desde la placa y es esta forma la que vamos a usar para comunicarnos inicialmente con la Lonet. Pero primero vamos a ver las conexiones:



Como vereís son bastante sencillas, solo hay que tener en cuenta dos cosas:

  • La salida de 5V del Arduino se conecta al pin VIO de la Lonet porque vamos a operar con niveles lógicos de 5V, si usamos niveles de 3V el pin VIO se conectaría a la salida de 3V de esa placa.
  • Hay que puentear el pin GND del Arduino con el GND de la bateria y el GND de la Lonet.




El zócalo de la Lonet permite meter tarjetas SIM grandes, según la tarjeta que tengamos puede ser interesante hacernos con un adaptador de SIM.




Una vez hecho esto, vamos a subir este sketch al Arduino.



// this sketch is used for testing LoNet with Arduino

// Connect VIO to +5V
// Connect GND to Ground
// Connect RX (data into SIM800L) to Digital 11
// Connect TX (data out from SIM800L) to Digital 10

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()  
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  mySerial.begin(9600);

}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
    
  if (Serial.available())
  { 
    while(Serial.available())
    {
      mySerial.write(Serial.read());
    }
    mySerial.println();
  }
}




Este sencillo sketch nos permite establecer una conexion serial con la Lonet, una vez cargado  y habiendo insertado una SIM válida en el modulo GSM, encendemos la Lonet presionando el boton de reset durante al menos 2 segundos, se encenderá el led verde de alimentacion de forma fija y el led rojo parpadeará. Una vez hecho esto abriremos el Monitor Serie en el IDE de Arduino y, estableciendo la velocidad en 9600bps, podremos enviar comandos AT a la Lonet y recibir sus respuestas.

Los primeros comandos, para comprobar que todo esta bien y realizar una configuarcion inicial serian estos:




En negro están los comandos que enviamos y en naranja las respuestas que recibimos de la Lonet, si todo funciona correctamente. El primero confirma la comunicación serial entre la placa y el modulo, el segundo fija la velocidad de transmisión en 9600bps (fijaos que es la que hemos elegido en el sketch que hemos subido al Arduino) aunque podemos elegir otra entre 1200 y 115200bps, el tercero graba esa configuración para futuras conexiones (la podremos modificar con el comando anterior). Con el comando "AT+CPOWD=1" apagamos la placa y la reiniciamos presionando de nuevo el botón de reset durante al menos dos segundos. El comando "AT+CBC" nos informa del estado de la batería Li-Po conectada a la Lonet (la segunda cifra es el estado de carga en tanto por ciento y la tercera cifra el voltaje de salida). Finalmente, el comando "AT+CSQ" nos informa del nivel de señal GSM. Todo esto siempre y cuando hayamos introducido una SIM que no este bloqueada con un PIN (una SIM se puede desbloquear por AT con el comando "AT+CPIN=1234" donde 1234 hay que sustituirlo por nuestro PIN y habría que enviarlo antes de utilizar el comando de apagado.)

El resultado en nuestro Monitor Serial seria este:




Si queréis profundizar en el uso de comandos AT, os dejamos un enlace con documentación muy completa (vale la pena tenerla aunque solo sea por el listado de los códigos de error que puede devolver una placa con sus correspondientes explicaciones): Guia Comandos AT.

Una vez hecho esto y comprobado que la placa Lonet funciona correctamente, vamos a mandar un SMS. Para ello tenemos que cargar dos librería en el IDE de Arduino, sino estáis familiarizados con la instalación de librerías tenemos un tutorial muy sencillo: Tutorial Instalacion Librerias Arduino.



Una vez instaladas abrimos un sketch de ejemplo, el GPRS_SendSMS incluido en la Libreria GPRS siguiendo esta ruta y lo subimos al Arduino:



El sketch seria este:



/*GPRS Connect TCPThis sketch is used to test seeeduino GPRS_Shield's send SMS func.to make it work, you should insert SIM card to Seeeduino GPRS and replace the phoneNumber,enjoy it!create on 2013/12/5, version: 0.1by lawliet.zou(lawliet.zou@gmail.com)*/
#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Suli.h>

#define PIN_TX    7
#define PIN_RX    8
#define BAUDRATE  9600
#define PHONE_NUMBER "123456789"
#define MESSAGE  "PRUEBA LONET"

GPRS gprsTest(PIN_TX,PIN_RX,BAUDRATE);//RX,TX,BaudRate

void setup() {
  Serial.begin(9600);
  while(0 != gprsTest.init()) {
      delay(1000);
      Serial.print("init error\r\n");
  }  
  Serial.println("gprs init success");
  Serial.println("start to send message ...");
  gprsTest.sendSMS(PHONE_NUMBER,MESSAGE); //define phone number and text
}

void loop() {
  //nothing to do
}


Donde solo habría que sustituir el numero de teléfono "123456789" por el del destinatario, que recibirá un SMS con el texto " PRUEBA LONET". Si abrimos el Monitor Serial podremos ver el progreso del proceso.

Como veréis en la libreria GPRS que hemos instalado hay varios ejemplos que pueden servir de base para bastantes proyectos y con los que vale la pena trastear.

Si estaís interesados en conocer más datos sobre este modulo podeis hacerlo aqui: GSM/GPRS Lonet para Arduino.

26 comentarios:

  1. Entiendo que con este diseño la operativa queda limitada a la duración de la batería, lo que reduce sus aplicaciones prácticas. En mi modesta opinión sería más interesante alimentar el Lonet desde Arduino, y este de la forma habitual mediante alimentador y batería auxiliar opcional. O sea, emplear el Lonet como si fuera un shield de Arduino, aunque no esté concebido como tal. Puede merecer la pena, porque el precio es bastante más bajo que el de otros shields GSM/GPRS. El fabricante dice que puede hacerse, pero no a través de una conexión directa, sino mediante un adaptador de voltaje y un circuito "suavizador" (supongo que se refiere a condensadores de filtro), sin entrar en más detalles.

    ResponderEliminar
  2. Efectivamente, es como explicas, sin embargo se puede alimentar el Arduino por el jack de alimentacion con un alimentador a 12V y usar ese mismo alimentador para alimentar la Lonet con este circuito para bajar el voltaje a 3.7V, por ejemplo:

    http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=151346010&cPath=899

    De este forma sigue siendo mucho más barato que la shield oficial que si puede alimentarse directamente a través del Arduino.

    ResponderEliminar
    Respuestas
    1. Carlos Lopez. Buenos días. he comprado recientemente la Lonet y el alimentador stepdown. el problema que si lo alimento a los 12V de entrada te baja la alimentación a 11,40 aprox. si lo alimento a la salida de 5v de arduino baja a 4,42 y la lonet saca al serial mensaje de warning high voltaje. ¿Cómo puedo conectarlo? ¿Qué me recomendáis? Gracias por vuestra ayuda y enhorabuena por vuestro excelente servicio.

      Eliminar
    2. Carlos dame más detalles, por los valores que das (12V - 11.4V y 5V - 4.42V), da la sensacion que no ajustas la salida de la fuente step down. Yo pondría 12V en la entrada y con el potenciometro de la fuente y un multimetro ajustaria la salida a 3.7-3.9V.

      Eliminar
    3. Carlos López. Gracias por la rápida respuesta. Quizás sea problema del ajuste, entiendo que el potenciómetro W103 es multivuelta, a la 5º vuelta no ha cambiado el valor de salida. Alimentando con 12V la salida siempre me da 11,4 (habiendo girado 5 vueltas). Esta tarde pruebo a intentar ajustarlo, si no mediré el potenciómetro por si estuviese defectuoso.

      Eliminar
    4. Entendido, ojala valiera con 5 vueltas :), tienes que girar bastante más veces, pon un multimetro en la salida para verficar cuando entres de verdad en el rango de ajuste efectivo del potenciometro.

      Eliminar
    5. Hola. He ajustado el potenciometro correctamente a 3.9V. importante girar sentido contrario de las agujas del reloj (en ningun sitio especificado, al menos no lo he encontrado), respecto el código del sketch para enviar sms, no funciona. Si alguien se anima a comprarlo le recomiendo que use el siguiente que funciona:

      #include

      SoftwareSerial mySerial(10, 11); // RX, TX

      void setup()
      {

      mySerial.begin(9600);
      mySerial.println("AT+CMGF=1");
      delay(1000);
      mySerial.print("AT+CMGS=");
      mySerial.print((char)34);
      mySerial.print("numero de telefono");
      mySerial.println((char)34);
      delay(500);
      mySerial.print("texto a enviar");
      mySerial.print((char)26);

      }

      void loop() // run over and over
      {

      }

      Envia un unico sms al inicio. luego ese ejemplo se puede usar para mas funciones. Estaria bien que se publicase los comandos de la libreria GPRS suli. creo que obvia el uso de comandos AT y ahorraria un monton de lineas de código.

      Un saludo y gracias por vuestra ayuda.

      Eliminar
  3. Sí, la verdad es que el precio sigue siendo interesante. Solo le veo un inconveniente a lo que sugieres: al estar conectado directamente al alimentador de 12V, el Lonet estaría "vendido" en caso de caída de tensión por tormenta, etc., mientras que Arduino podría seguir funcionando durante un tiempo con un energy shield que tire de una LiPo, por ejemplo. ¿Por qué no conectar el circuito "step down" entre Arduino y el Lonet? En teoría al Lonet le valen 3,4 V de entrada, lo que daría un salto de 5-3,4 = 1,6 V, una décima superior al salto mínimo que recomendáis para este circuito. Así el Lonet podría beneficiarse también del energy shield de Arduino.

    ResponderEliminar
  4. Efectivamente es una opción interesante, pero antes haría pruebas con el multimetro, mi experiencia es que ese circuito (el step down), cuando la diferencia entre la entrada y la salida es muy pequeña tiende a dar en la salida la tensión de entrada, 1.6V debiera ser suficiente pero mejor comfirmarlo antes de "freir" la Lonet.

    ResponderEliminar
  5. Haría la prueba si tuviera los componentes. Por otra parte, solo compraría estos componentes si supiera seguro que va a funcionar el "invento". O sea, la pescadilla que se muerde la cola :-) Os animo a que hagáis la prueba y la publiquéis aquí, dada la diferencia de precio puede ser interesante para todos los que queremos usar GSM/GPRS con Arduino. En cualquier caso, muchas gracias por los consejos y la rapidez con que los das.

    ResponderEliminar
  6. Esta placa veo que envía sms, pero ¿puede recibirlos y controlar algo con arduino?

    ResponderEliminar
  7. Efectivamente, ese es el uso principal

    ResponderEliminar
  8. Buenas! Estaria interesado en adquirir este modulo, pero tengo dudas respecto a la alimentacion, me gustaria que fuera un sistema autonomo conectado desde una bateria que alimentara a arduino uno por un lado y despues por otro lado a el modulo gsm. Me gustaria saber si es esto posible, y otra dudo que tengo es si tendre problema de alimentar desde el pin de 5v de arduino un dispositivo GPS de consumo moderado y en paralelo conectar ese mismo pin de 5v al vio del dispositivo gsm. Espero haberme expresado bien, un saludo

    ResponderEliminar
    Respuestas
    1. Vamos por partes. Lo más importante no alimentes este modulo GSM a 5V, si lo haces lo fries. Solo admite tensiones hasta 4.4V, por eso se suele usar con una bateria Lipo. Hay una forma interesante de usar un sistema autonomo de alimentacion para el Arduino y el modulo GSM, se trata de usar esta shield que permite alimentar el Arduino con una bateria Lipo:

      http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=151346002&cPath=1342

      Luego con un robacorrientes la misma Lipo que conestas a la Solar Shield puede alimentar al modulo GSM (3.7V sin problemas):

      http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/ResultadoBusquedaProductos.jsp?idIdioma=&idTienda=93&palabrasClave=robacorrientes

      De todas formas, si quieres usar GPS con GSM echa un vistazo a este modulo:

      http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=151346022&cPath=1342

      Eliminar
    2. Buenas!
      Antes de nada agradeterte tu rapidez a la hora de contestar, tiene muy buena pinta el modulo de carga autonoma que me has comentado, pero tengo dudas con respecto a si tendra caidas de potencia, estoy usando conectado a arduino el modulo GPS de adafruit, y un IMU 9150 de invesense, y con los 3W(600mA@5V) deberia ser suficiente para arduino,GPS,GSM e IMU no?
      Y otra cuestion es si no habria una bateria lipo de mayor voltaje y con ese voltaje alimentar arduino y con un conversor de tension alimentar tambien el modulo GSM,
      Saludos ,
      Rodrigo

      Eliminar
    3. Con respecto a las caidas de tension habria que hacer pruebas, dependerá del consumo total. Hay baterias Lipo de 7.4V, 11.1V, ...etc, no las tenemos.

      Eliminar
    4. Buenas me he decidido por la opcion que muestras en este tutorial , pero me gustaria saber de que carga sería, supuestamente con la de 200mAh valdria?? o compro la de 500mAh o incluso la de 1100mAh? Gracias!

      Eliminar
    5. Nosotros en el tutorial usamos la de 1100ma: http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=111051052&cPath=1338

      Eliminar
    6. Buenas, ya he adquirido los modulos y me gustaria saber como se carga la bateria? con una fuente de tension a 3.7V conectando rojo a postivo y negro a negativo? vienen descargadas estas baterias? gracoas

      Eliminar
    7. Tienes dos opciones, un cargador convencional:

      http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=119162011&cPath=1334

      O un este cargador:

      http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=999334084&cPath=1342

      Que lo usas con un alimentador USB a 5V normal y usando esto puedes ajustar la salida a 3.7V para conectarlo a la Lonet:

      http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=151346010&cPath=899

      Eliminar
    8. Buenas, gracias.
      Ahora no me envia sms ni envia llamadas, el codigo anterior de suli tiene en las patas 7 y 8 , las cambio a 10 y 11 no? y el numero que meto los 9 digitos del numero español? o hay que meterlo con algun formato? Gracias

      Eliminar
    9. Los pines que uses, mientras sean digitales es indiferente, solo que han de ser los mismos en el sketch que en el conexionado que hagas, logicamente. Con respecto al formato de numero de telefono estando en España usa directamente el numero de telefono sin el código país.

      Eliminar
    10. Buenas , tenia una pregunta respecto a lo q dice en las especificaciones Soporta tambien A-GPS, que es un sistema de posicionamiento basado en la red movil.
      Seria posible que pusiera algun tutorial o codigo de como se obtiene la posicion mediante este sistema??
      GRacias
      Saludos

      Eliminar
    11. En este momento no hay ningún tutorial de esa funcionalidad, esperamos tenerlo en breve.

      Eliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. A parte de enviar también puede recibir?
    Gracias

    ResponderEliminar