NanoPhone: Envia SMS con Arduino

Hoy toca volver a hablar de comunicaciones inalámbricas y Arduino! Concretando un poco, del proyecto que me tocó realizar para el 1º trimestre del curso de 2º de D.P.E.:
Un sistema capaz de leer un sensor de temperatura y enviar dichos datos por SMS.

A este sistema, decidí convertirlo en una especie de teléfono móvil, añadiéndole una pantalla LCD a color, un reloj de tiempo real y bautizarlo como “NanoPhone”.

De este modo además del envío del SMS, añadía la posibilidad de visualizar los datos obtenidos tanto del sensor de temperatura, como del reloj, y poder ver la fecha y hora.
Los materiales que he utilizado para realizarlo son: 

  • Placa Arduino UNO
  • Placa Cellular Shield SparkFun
  • Pantalla μLCD-144 (GFX) 4D Systems
  • Reloj RTC DS1307 SparkFun
  • Sensor de temperatura LM35 DZ

Empezamos por el plato fuerte, el envío del SMS, que es lo más interesante del proyecto a mi parecer, ya que nos brinda una nueva posibilidad de comunicación inalámbrica muy potente.

Para poder enviar SMS con Arduino necesitamos de una placa Cellular Shield de SparkFun (Imagen), que es todo un teléfono móvil en potencia.

Esta placa gobernada por el circuito integrado SM5100B, está específicamente diseñada para su encaje en una placa Arduino y es tan completa que con ella podríamos realizar un teléfono móvil con muchas de las características que puede tener un teléfono móvil de hoy en día.

Vamos a ver las funciones principales que utilizo en el proyecto: ¿Cómo se utiliza? 

Empecemos a montar el NanoPhone…

Sigue leyendo!!

La placa Cellular Shield como podemos ver en la imagen, se encaja sobre un Arduino Duemilanove/UNO y se comunica a través de puerto serie.

Como primer paso, deberemos soldar las tiras de 8 y 6 pines de los lados ya que viene sin estos, por lo que no debemos olvidar comprarlos! Y tener mucho cuidado con los movimientos, puesto que el cable de la antena viene sujeto por una triste soldadura sin más.

Una vez que esté listo y montado sobre el Arduino, debemos insertar la tarjeta SIM, y es muy importante, que no tenga código PIN, así procedemos a la configuración inicial.

Configuraremos la conexión con Arduino, como viene por defecto en el sketch de ejemplo que podemos descargar de la web de SparkFun o de aquí mismo: Cellular Shield Passthrough.zip

Analizamos un poco dicho sketch, y vemos que realiza una conexión serie virtual, con la librería NewSoftSerial, utilizando los pines digitales 2 y 3 para la comunicación, dejando libres los pines digitales 0 y 1 del puerto serie que necesitaremos para poder ver el proceso de configuración en el serial monitor. Una vez terminada la configuración podremos utilizar los pines 0 y 1 para conectar cualquier otro dispositivo.

Vemos el código del sketch de configuración inicial de la placa:

#include <NewSoftSerial.h>; // Librería del puerto serie virtual
#include <string.h>; // Librería para manejo de cadenas

char incoming_char=0; // Almacenamos los caracteres recibidos
NewSoftSerial cell(2,3); // Puerto serie virtual en pin 2(RX) y 3(TX).

void setup() {

Serial.begin(9600); //Inicializamos puertos para la comunicación!
cell.begin(9600);

Serial.println("Starting SM5100B Communication..."); // Empezamos!
}

void loop() {

if(cell.available()>0) // Si el módulo GSM envía un dato...
{
incoming_char=cell.read(); // Almacenamos dicho dato y...
Serial.print(incoming_char); // Lo mostramos por el puerto serie.
}
if(Serial.available() >;0)// Si enviamos un dato por el terminal...
{
incoming_char=Serial.read(); // Almacenamos dicho dato y...
cell.print(incoming_char); // Lo enviamos al módulo GSM.
} }

Vemos que simplemente inicia el proceso de configuración mediante la función “Cell.begin” y se dispone a mostrar cualquier dato que envíe la placa por el puerto serie, para que podamos verlo en el serial monitor y a capturar datos para enviarle a la placa.

Como primer paso, debemos decirle a la placa, qué tipo de red vamos a utilizar, esto depende de cada operador de telefonía por lo que según la tarjeta que vayamos a ponerle al Cellular shield, debemos averiguar que tipo de red utiliza. Yo en mi caso, utilizando Orange, pregunté y utiliza las redes GSM900.

Cargamos el sketch de configuración y abrimos el serial monitor o cualquier otro software de comunicación serie, y procedemos a decirle a la placa el tipo de banda que utilizaremos, mediante el siguiente comando: AT+SBAND=4.

En este caso, 4 significa GSM900, pero dependiendo de la zona y la red que utilicemos varía el número. Esto se ve en la documentación.

Bien, hecho esto la placa empezará a soltar números a diestro y siniestro, y tenemos que conocer los valores de dichos números para saber qué significan. Reiniciamos y veremos esto en el puerto serie:

Starting SM5100B Communication...

+SIND: 1                                            // Inicia la comunicación
+SIND: 10,"SM",1,"FD",1,"LD",1,"MC",1,"RC",1        // SIM detectada.
+SIND: 3                                            // Modulo GSM parcialmente listo.
+SIND: 4                                            // Modulo GSM totalmente listo.
+SIND: 7                                            // Red para llamadas de emergencia
+SIND: 11                                           // Conectado a la red 

Este proceso dura apróximadamente unos 30-40 segundos, y debe terminar en el código +SIND: 11, que nos indica que todo ha ido bien y la placa está correctamente configurada y lista para utilizar. Si algo falla, seguiremos viendo números en el puerto serie, la placa entrará en el bucle de configuración y si hay algo mal configurado no saldrá nunca de ahí, por lo que lo mejor es repetir el proceso desde 0.

Hecho esto, ya podemos llamar o enviar SMS! Yo me voy a centrar en el envío del SMS, pero hacer una llamada es más de lo mismo,  todo se controla mediante comandos a través del puerto serie.

El mismo sketch de configuración nos indica los comandos para envío de SMS y llamada. Preparamos un sketch de Arduino para decirle que envíe un SMS a un número determinado configurado mediante código y lo ejecutamos. Veamos:

 #include <NewSoftSerial.h> // Libreria del Cellular Shield
NewSoftSerial cell(2,3);  // Puerto serie para comunicacion con el modulo GSM

char telefonoMovil[] = "XXXXXXXXX";  //Numero de telefono

void setup(){

 cell.begin(9600);           // Iniciamos el cellular shield
 delay(35000);               // Delay de 35 segundos para inicializacion
 cell.println("AT+CMGF=1");} // Preparamos el modulo GSM para envio de SMS

void loop(){

 cell.print("AT+CMGS=");     // Numero de telefono entre comillas AT+CMGS="Numero"
 cell.print(34,BYTE);        // ASCII equivalente a las "
 cell.print(telefonoMovil);  // Numero de telefono al que enviamos el SMS
 cell.println(34,BYTE);      // ASCII equivalente a las "
 delay(500);                 // Tiempo de espera.
 cell.print("Aqui va el mensaje que enviaremos!");
 cell.println(26,BYTE);      // ASCII equivalente al Ctrl-Z
delay(15000);                // Tiempo de "descanso" del modulo
while(true) delay(1);  }     // Bucle infinito para no enviar infinitos SMS.  

Vemos que configuramos el número de teléfono mediante un array e iniciamos el programa con una espera de 35 segundos para que se inicie y conecte a la red el cellular shield, y lo preparamos para envío de SMS mediante el comando “AT+CMGF=1”.

Procedemos a mandarle el número al que enviaremos el SMS mediante el comando: “AT+CMGS=”NUMERO”” donde el número deberá ir entrecomillado, por lo que enviamos el comando, seguido de el ASCII 34, que corresponde a las comillas, luego el número, y cerramos con unas comillas nuevamente. Luego el mensaje de texto a enviar y por último para terminar, Ctrl-Z, cuyo ASCII es el 26.

Podemos ver toda la documentación, esquemáticos, comandos, etc en la web de SparkFun: Cellular Shield SM5100B

Así, enviamos un SMS con Arduino, con un par de funciones, podemos enviar datos a cualquier parte del mundo.

Sigamos con el montaje del NanoPhone. 

Para hacerlo más interactivo, incluí una pantalla a color µLCD-144 de 4D Systems, utilizandola en modo GFX mediante un interfaz serie TTL, por lo que la conectaremos a los pines del puerto serie del Arduino, digitales 0 y 1.

Este modo es el más sencillo de utilizar y mediante la librería displayshield4d de BricoGeek.com podemos escribir con distintos tipos de fuentes y tamaños, dibujar formas geométricas, elegir el color del fondo, texto y formas, etc.

La forma de conectarla es la siguiente:

Mediante la librería, instanciamos una pantalla LCD y simplemente hacemos llamadas a las funciones que nos permitan escribir, dibujar o cambiar los colores.

Podemos ver una review más completa sobre la librería y la pantalla en el siguiente articulo de BricoGeek: Ejemplo con Arduino y pantalla LCD.

Para poder navegar mediante el menú del teléfono, utilizamos 2 botones tipo switch 12mm con circuito “Pull-down”, de modo que a partir de la pulsación de estos botones, podamos elegir en el menú la opción que queramos, ya sea visualizar la temperatura, la hora, o enviar un SMS pudiendo elegir el número de teléfono al que queramos enviar el SMS.

El sensor de temperatura utilizado, el LM35DZ  es un circuito integrado de precisión capaz de obtener datos de temperatura en grados centígrados en un rango entre -55 °C y + 150 °C.

Su pinout se compone de los pines de alimentación +5Vcc, GND y una salida de datos que provee una tensión lineal de 10 mV por grado centígrado.

Conectaremos la salida a un pin analógico del Arduino y haremos la conversión mediante la siguiente función:

#define lm35 A0   // Pin analógico del sensor de temperatura

void recojeTemperatura()
{
float temperatura = (5.0 * analogRead(lm35) * 100.0 ) / 1023.0 ;
} 

Así obtenemos la temperatura y podemos mostrarla por pantalla o enviarla por SMS ya que es el objeto final de este proyecto.

Como retoque final, también he añadido un Reloj en tiempo real DS1307 de SparkFun, aunque este lo explicaré más adelante en otro post, incluyendo el proceso para diseñarlo, montarlo,  y configurarlo nosotros mismos. 🙂

Una vez montado todo, en mi caso, diseñé una placa de entradas y salidas donde conectar el LM35, la pantalla LCD, el RTC DS1307 y los botones, que encajara en Arduino, de modo que quedase todo montado de la siguiente manera:

Todos los elementos conectados a la placa de entradas y salidas, ésta se encaja en la placa cellular Shield, y por último, encajamos el cellular shield en Arduino. La alimentación de todos los elementos dependerá únicamente de la alimentación del Arduino, por lo que alimentando éste último, alimentamos a todo el conjunto. 

Una especie de caja de acrílico  y una antena de una tarjeta de red Wi-fi completa el sistema.
Esquema del diseño del NanoPhone 🙂
Así como en este caso, el fin del proyecto era enviar los datos de la temperatura mediante SMS para poder tener conocimiento de la temperatura en establecimientos como invernaderos, campos agrícolas, industrias, plantas de producción, etc, la placa cellular shield junto con Arduino nos permiten realizar infinitos tipos de aplicaciones.

Una de las aplicaciones más interesantes es conectar un módulo GPS a Arduino y recibir la posición global mediante SMS al realizar una llamada al cellular shield, de modo que si lo incluimos en nuestro coche podamos conocer la posición exacta cuando queramos.

Aquí dejo los vídeos de las pruebas de funcionamiento de todos los elementos por separados y por último el vídeo final del NanoPhone montado y funcionando! 🙂 

Menú y selección – uLCD-144 + Arduino

Temperatura y hora en uLCD-144 con Arduino

uLCD + Cellular Shield + Arduino: NanoPhone en protoboard

NanoPhone: Enviando SMS con Arduino!

Fuentes y agradecimientos:
BricoGeek.com
TronixStuff.com
SparkFun.com
– I.E.S. Ventura Morón: Departamento de Electrónica.

Anuncios

96 comentarios en “NanoPhone: Envia SMS con Arduino

  1. hola, quizás es tarde para hacer una consultar acerca del Shield. Pero iPadnano dijo (13/01/2012 en 00:46) :

    “Aún así, el Cell. Shield está diseñado para ser manejado con Arduino, por lo que se pueden reaizar llamadas y recibirlas,…”

    Eso significa que sólamente puedo marcar un número y que suene el celular?, o también contestar y hablar por voz a través de este shield?.

    Muchas gracias por la información que han sabido aportar todos los que han participado. Me parece un buenísimo lugar para inciarse en la electrónica digital.
    Slds. Ak

    • Akuthor, también puedes contestar y hablar por voz, aunque deberás añadirle los componentes extra que NO trae de serie la placa para poder hablar, como son el altavoz para poder escuchar y el micrófono para poder hablar.

      Comprueba el datasheet del Cellular Shield y verás los esquemas necesarios para poder añadir estos componentes para utilizar como un teléfono completo.

      Saludos!!

  2. Hala, felicidades por tu trabajo la verdad es qu se ve bastante bien ;D
    yo también estoy trabajando con un modulo igual al tuyo pero te quería preguntar algo, lo que pasa es que mi modulo se queda en el numero 7, en llamadas de emergencia ya probé con mas frecuencias y en algunas no encuentra o desconoce la red me gustaría que me pudieras aconsejar, a ti no te paso lo mismo al intentar conectarlo por primera vez?

    • Carlos Aguilar, es un módulo que suele dar problemas.

      Puedes especificar qué compañía de teléfono estás utilizando?

      Le has quitado el código Pin a la tarjeta? Ya que sino no funcionará.

      Saludos!

  3. Hola, Excelente trabajo!
    una duda espero puedas ayudarme:
    no logro que me de los codigos:

    +SIND: 1 // Inicia la comunicación
    +SIND: 10,”SM”,1,”FD”,1,”LD”,1,”MC”,1,”RC”,1 // SIM detectada.
    +SIND: 3 // Modulo GSM parcialmente listo.
    +SIND: 4 // Modulo GSM totalmente listo.
    +SIND: 7 // Red para llamadas de emergencia
    +SIND: 11

    la mia se queda en:
    OKStarting SM5100B Communication…����+SIND: 1
    +SIND: 10,”SM”,1,”FD”,1,”LD”,1,”MC”,1,”RC”,1,”ME”,1
    +SIND: 8
    +SIND: 3
    +SIND: 4

    ATD7773138862
    +CME ERROR: 30

    • Jman Hur, comprueba en el datasheet del módulo el error +CME ERROR:30 y tendrás la respuesta al porqué te falla.

      Puedes hacer comprobaciones básicas como que la antena esté correctamente soldada, que la tarjeta SIM no tenga código PIN.

      Ya nos cuentas.

      Saludos

  4. Oye una pregunta utilice como referencia la pagina tronixstuff y el codigo me compila correctamente, pero a la hora de ejecutarlo en el monitor serial me sale el siguiente valor:

    +STIN:0

    y termina con un

    +STIN:7

    no se si me puedas orientar por que es que me sale ese valor.

    • Diego, no te sabría decir así de primeras porque te da ese error.

      Siempre comento lo mismo para el Cellular Shield ya que es muy puñetero, comprueba todos estos elementos:

      – Que la antena esté correctamente soldada, y en un lugar abierto para poder tener cobertura.
      – Que la tarjeta SIM no tenga código pin ya que sino no puede iniciar el sistema.
      – Que tengas cobertura, con otro móvil por ejemplo.
      – Revisar conexiones y demás para comprobar que está todo.
      – Que tengas una buena fuente de alimentación, el Shield consume bastante.

      Saludos!

  5. Hola, disculpa eh introducido el primero código, pero no termina de compilarlo por que resulta en error, estoy utilizando la misma shield que utilizas.

    Por cierto sabes si se puede utilizar LEONARDO en vez de UNO?

    • iGab+10AP debería poder utilizarse en Leonardo sin problemas, pero deberás asegurarte que la librería es válida para el Leonardo.

      Prueba con un Arduino UNO y el IDE versión 0022 o 0023.

      Saludos

  6. Hola, Cuando voy a compilar mi sketch me genera el siguiente error:

    ‘NewSoftSerial’ does not a name type.

    ¿Sabes a que se debe?
    ¿Que debo hacer para solucionarlo?

    Agradeceria Pronta ayuda.

    Psdta: Estoy trabajando con una SimCard de red GSM 850

    • Laura, es posible que no dispongas de la librería “NewSoftSerial”.

      Comprueba en Arduino/Libraries que tienes esta librería ya que es necesaria para la comunicación del modulo.

      Saludos

  7. Hola muchas felicidades por tu trabajo! estoy haciendo algo parecido, pero utilizo el shield gsm de arduino para conectarlo a internet y con las coordenadas del shield gps obtener el clima, hasta el momento por separado los dos codigos me funcionan bien pero al momento de juntarlos no compila por un error en las librerias, podrias ayudarme?

  8. Hola, como quito el codigo pin?
    y en donde meto la configuracion de la banda para mexico ?
    Saludos y buen trabajo

Deja un comentario!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s