Arduino + SIM900
En el mundo de Arduino en ocasiones es importante mantener la comunicación con nuestra placa y nuestro proyecto, existen distintas maneras de maneras para mantener esa comunicación, puede ser con un modulo WiFi, Bluetooth, Ethernet, o como en este caso vía GSM.
En el siguiente proyecto, vamos a utilizar el módulo SIM900, que es fabricado por SIMCom empresa que nos presenta un ultra compacto y estable modulo inalambrico. Es un modulo completo de Cuatro bandas GSM/GPRS tipo SMT diseñado con un poderoso procesador integrado, AMR926EJ-S, excelente para pequeños proyectos y a un muy bajo costo.
Con una interfaz estándar, el SIM900 ofrece un rendimiento GSM / GPRS en las bandas 850/900/1800/1900MHz para voz, SMS, datos y fax con un muy bajo consumo de energía. Con una tamaño de 24 mm x 24 mm x 3 mm, SIM900 puede adaptarse a casi todos los requisitos de espacio en sus aplicaciones M2M, especialmente para demandas de diseño delgadas y compactas.
El fabricante nos brinda las siguientes características:
- Quad-Band 850/900/1800/1900 MHz
- GPRS multi-slot class 10/8
- GPRS mobile station class B
- Compliant to GSM phase 2/2+
- Class 4 (2 W @850/ 900 MHz)
- Class 1 (1 W @ 1800/1900MHz)
- SAIC (Single Antenna Interference Cancellation) support
- Dimensions: 24 x 24 x 3 mm
- Weight: 3.4g
- Control via AT commands (GSM 07.07 ,07.05 and SIMCOM enhanced AT Commands)
- SIM application toolkit
- Supply voltage range : 3.2 … 4.8V
- Low power consumption: 1.0mA (sleep mode&BS-PA-MFRMS=9)
- Operation temperature: -40°C to +85 °C
Para mayor información podemos visitar la página de fabricante aquí
En este caso vamos a utilizar una placa compatible con Arduino, la cual se comunica mediante comandos AT, la placa cuenta con entrada de alimentación externa, switch de encendido primario y un botón secundario de encendido, también cuenta con jacks de entrada y salida de audio, para conectar micrófono y audífonos. Los headers facilitan la conexión entre la placa y nuestro Arduino, también cuenta con pines de configuración para mantener una comunicación serial por hardware o software, el cual analizaremos mas adelante.
Esta placa la podemos encontrar en el mercado por alrededor de $20 USD
Indicadores LED:
De encendido: El LED va conectado a la linea de alimentación de energía, indica cuando la placa está recibiendo energía.
De estado: Cuando la placa está realizando alguna función o tarea, el LED se mantiene encendido.
De Red: Indica el estado de la Red Celular, tiene varios estados:
– Apagado: la placa no está funcionando
– Encendido 64ms y apagado 800ms: El chip SIM900 está funcionando pero no se ha registrado en la red celular.
– Encendido 64ms y apagado 3 segundos: El chip SIM900 está registrado en la red celular y puede enviar y recibir llamadas y SMS
– Encendido 64ms y apagado 300ms: La conexión de datos GPRS es activa.
Fuente de alimentación:
La placa SIM900 soporta alimentación externa de 5V a 9V, lo cual es preferible que utilicemos para tener una mayor estabilidad en el funcionamiento.
Comunicación UART:
UART, son las siglas en inglés de Universal Asynchronous Receiver-Transmitter, en español: Transmisor-Receptor Asíncrono Universal.
Nuestra placa SIM900 soporta velocidades que van desde las 1200bps a 115200bps con función de detección de velocidad Auto-Baud.
Con la ayuda de los pines de “Selector de puerto serial” configuramos la placa SIM900 para trabajar por Software o Hardware Serial, en nuestro caso vamos a configurar para operar en SOFTWARE Serial, conectando los pines D8(Rx) con el PIN central y el D7(Tx) con el PIN central, como se muestra en la siguiente imagen:
Conexión con Arduino:
Como habíamos dicho anteriormente la placa SIM900 se comunica por medio del puerto serial, por lo cual vamos a colocar la configuración del Selector de puerto serial el modo “Software Serial” es decir con los pines D8 y D7 y posteriormente conectaremos
- El pin D7(Tx) de la placa SIM900 al pin 7 de Arduino
- El pin D8(Rx) de la placa SIM900 al pin 8 de Arduino
Posteriormente conectaremos la placa SIM900 a la fuente de alimentación directa. En mi caso estoy utilizando una fuente de 9v a 650mA.
Para encender la placa SIM900 debemos dejar presionado por 2 segundos el botón de encendido.
Ahora solo nos queda conectar nuestro Arduino al puerto USB y cargar el siguiente Sketch…
#include <SoftwareSerial.h> SoftwareSerial SIM900(7, 8); //Seleccionamos los pines 7 como Rx y 8 como Tx void setup() { SIM900.begin(9600); // Iniciamos puerto serial virtual Serial.begin(9600); // Iniciamos puerto serial delay(1000); // Retrasamos 1 segundo Serial.println("Iniciado..."); } void loop() { comunicadatos(); } void comunicadatos() { // Envíamos y recibimos datos if (Serial.available() > 0) SIM900.write(Serial.read()); if (SIM900.available() > 0) Serial.write(SIM900.read()); }
Funcionamiento:
Para comprobar que todo funciona bien abrimos la terminal en nuestro IDE de Arduino mediante la combinación de teclas CTRL+SHIFT+M.
En la ventana de Monitor Serial nos aseguramos de seleccionar la velocidad de UART a 9600 baudio y que el tipo de comunicación se encuentre seleccionado Ambos NL & CR.
Ahora enviamos el siguiente comando AT para verificar que todo funcione correctamente: AT
Debemos recibir un simple “OK“
Existe una manera de encender la placa SIM900 mediante software, solo que se debe agregar un cable extra y soldar los pines R3 de la placa SIM900
Posteriormente tendremos que agregar al siguiente función para encender la placa SIM900 mediante software y hacerla llamar al inicio del Sketch.
void encenderSIM900() { pinMode(9, OUTPUT); digitalWrite(9, LOW); delay(1000); digitalWrite(9, HIGH); delay(2000); digitalWrite(9, LOW); delay(3000); }
Y el código completo sería el siguiente:
#include <SoftwareSerial.h> SoftwareSerial SIM900(7, 8); //Seleccionamos los pines 7 como Rx y 8 como Tx void setup() { encenderSIM900(); SIM900.begin(9600); // Iniciamos puerto serial virtual Serial.begin(9600); // Iniciamos puerto serial delay(1000); // Retrasamos 1 segundo Serial.println("Iniciado..."); } void loop() { comunicadatos(); } void comunicadatos() { // Envíamos y recibimos datos if (Serial.available() > 0) SIM900.write(Serial.read()); if (SIM900.available() > 0) Serial.write(SIM900.read()); } void encenderSIM900() { pinMode(9, OUTPUT); digitalWrite(9, LOW); delay(1000); digitalWrite(9, HIGH); delay(2000); digitalWrite(9, LOW); delay(3000); }
Si queremos conocer todos los códigos AT podemos visitar la página del fabricante en el siguiente link
MUCHAS GRACIAS PABLO, contenido muy útil e importante, escasea contenido de este tipo que de verdad funciona. reitero gracias bro.
Gracias a ustedes por visitar mi página. Saludos!
Muy buena información.
Gracias
Pablo ,,buenas noches …te agradezco este sketch …funciona muy bien….
antes estube tratando de usar el que te envio a continuacion… en forma separada lo trate de usar..pero algun bugs tiene
porque no me funciono… este sketch lo integrare a otro sketch el cual seria el parte del proyecto que me ocupa…
te abradezco, si es posible me ayudes a encontrar la razon del porque no funciona… mi email es .. magaza52@gmail,com
gracias de antemano.
#include
#include
SoftwareSerial SIM900(7, 8); // Configura el puerto serial para el SIM GSM
LiquidCrystal_I2C lcd(0x27, 20, 4);
String inputString = “”;
bool stringComplete = false;
//******************************
void setup() {
SIM900.begin(9600); //Configura velocidad serial para el SIM
Serial.begin(9600);
SIM900.println(“AT+CMGF=1\r”);// comando AT para configurar el SIM900 en modo texto
delay(200);
SIM900.print(“AT+CNMI=2,2,0,0,0\r”);//Configuramos el módulo para que muestre los SMS por el puerto serie.
delay(200);
lcd.backlight();
lcd.clear();
lcd.init();//inicia la LCD
Serial.println(“OK”); //saliendo del setup !!!!!!!.
inputString.reserve(200);
}
//*************************************
void loop() {
if (stringComplete) {
Serial.print (inputString); //
inputString = “”; //clear the string
stringComplete = false;
serialEvent();
}
}
void serialEvent() {
while (SIM900.available()) {
char inChar = SIM900.read();
Serial.print (inChar); Serial.println (” SIM900 enviado desde MONITOR”);
inputString += inChar;
if (inChar == ‘\n’) {
stringComplete = true;
}
}
Hola Manuel, disculpa que haya tardado tanto en responder, con la migración de mi servidor y página web, no me di cuenta que tenía desactivadas las notificaciones a mi email cuando tengo nuevos comentarios.
Si aún tienes el fallo y decides que lo revisemos, dime ¿que error te muestra?
¡Saludos!
buenas tardes, mi arduino esta conectado bien al modulo y todo, copie bien el codigo y lo conecte a los mismos 5 voltios del arduino el shield, pero cuando escribo el “AT” no me aparece el ok, ya intente con otros codigos para ver lo de las llamadas y sms pero no me hagarran
¿Que error de muestra?