sábado, 21 de septiembre de 2013

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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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:
1
2
3
4
5
6
7
8
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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:
1
2
3
4
5
6
#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 SMSya 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!


No hay comentarios:

Publicar un comentario