En el tutorial anterior , cubrimos los comandos AT compatibles con un módem GSM-GPRS SIM900. Ya hemos discutido cómo conectar un módem GSM-GPRS SIM900A con Raspberry Pi, Arduino, así como con otros microcontroladores y computadoras de escritorio. Ahora ha llegado el momento de utilizar este módem para realizar y recibir llamadas y enviar y recibir SMS.
En este tutorial, demostraremos llamadas de voz y mensajes SMS usando un SIM900A con Raspberry Pi (RPi) y una computadora de escritorio.
Comunicarse con un módem GSM-GPRS usando Python
Anteriormente aprendimos sobre la comunicación del receptor/transmisor serie asíncrono universal (UART) utilizando el puerto serie TTL del RPi.
Simplemente conecte el módem GSM al puerto serial TTL del RPi y abra un puerto de comunicación serial con el módem usando el método serial.Serial. A continuación, puede enviar comandos AT al módem utilizando el método serial.write y recibir una respuesta de los comandos AT utilizando el método serial.read.
La respuesta del módem se puede almacenar en una variable e imprimir en la consola utilizando el método de impresión. También puede diseñar una aplicación GUI utilizando la biblioteca TTK y un editor de texto para que los datos se envíen y reciban a través de un puerto serie y se muestren en una aplicación Python.
De hecho, Python es independiente de la plataforma y se puede utilizar para configurar la comunicación en serie en cualquier dispositivo y en cualquier otra plataforma (es decir, no sólo la plataforma Linux de RPi, sino también otras como Win32 y macOS).
En un sistema de escritorio, la interfaz del módem se puede realizar mediante una tarjeta serie USB. Para hacer esto, primero averigüe el nombre del puerto donde el módem GSM interactúa con el escritorio, a través de la interfaz USB. Aquí cubrimos cómo encontrar el nombre de un puerto serie en una computadora de escritorio .
Normalmente, el módem se comunica a una velocidad de baudios de 9600 bps y codificación de datos UART 8N1. Los módems están diseñados para detectar automáticamente la velocidad de transmisión. Aunque el esquema de codificación de datos sigue siendo 8N1, se puede utilizar la velocidad máxima en baudios de 115.200 bps para la comunicación con el módem.
Inicializando el módem GSM-GPRS SIM900A
Para empezar, debemos preparar el módem GSM para la comunicación celular. Inserte una tarjeta SIM en el soporte de la tarjeta SIM del módem SIM900A. El módem es similar a un teléfono celular y requiere una tarjeta SIM para conectarse a una red celular.
La mayoría de los módems tienen soportes para tarjetas SIM para Mini SIM (factor de forma 2FF). Sin embargo, también se pueden conectar Micro SIM (factor de forma 3FF) y Nano SIM (factor de forma 4FF), siempre que los contactos de la SIM toquen correctamente las clavijas del soporte de la tarjeta.
Luego encienda el módem GSM conectándolo a un adaptador de corriente (5V-12V, 2A). El LED de estado del módem o el LED de red comenzarán a parpadear. Normalmente parpadea más rápido mientras el módem se conecta a la red móvil. Una vez que el módem esté conectado al proveedor de servicios de comunicación (CSP) suscrito, parpadeará cada tres segundos. El módem puede tardar hasta un minuto en inicializarse (al igual que la inicialización de un teléfono celular) y conectarse a una red móvil suscrita.
Si llama a la SIM conectada, el módem comenzará a sonar a través del timbre y el LED indicador de timbre parpadeará. Esto confirma que el módem está funcionando. De hecho, cuando llama al número SIM, el módem responde automáticamente a la llamada después de algunos timbres. Y si conecta un altavoz y un micrófono al módem, podrá hablar y recibir llamadas en la SIM conectada. Entonces, la entrada de micrófono y altavoz en realidad está en el módem.
Interfaz SIM900A con RPi
El módem SIM900A es un dispositivo de 5 V y la Raspberry Pi es una computadora de placa única de 3,3 V. No podemos conectar directamente el puerto serie TTL del módem SIM900 con el puerto serie TTL del RPi.
Si conecta directamente los puertos serie del módem y el RPi, transmitirá los datos serie al módem porque el módem de 5 V puede tolerar voltajes UART de 3,3 V. Pero cuando intenta recibir datos del módem en el RPi, las señales UART de 5 V del módem pueden dañar o destruir el pin del receptor serie del RPi.
Para estar seguros, utilizaremos un cambiador lógico TTL de 5 V a 3,3 V. Se puede diseñar un cambiador lógico simple de 5 V a 3 V3 utilizando el diodo 1N4148 como se muestra en este diagrama de circuito:
Alternativamente, puede utilizar un módulo de E/S de conmutación de nivel de 2, 4 u 8 canales. Este es un módulo de E/S bidireccional de conmutación de nivel de 8 canales:
Luego conecte los pines Rxd, Txd y tierra del módem a los del RPi a través del circuito de conmutación de nivel o módulo de E/S. Ahora está listo para comunicarse con el módem a través del puerto serie.
Hacer una llamada desde Raspberry Pi
Para habilitar la comunicación serial con el módem en el RPi, debe importar las bibliotecas serial, RPi.GPIO, os y time. Se requiere que el sistema operativo y las bibliotecas de tiempo utilicen la función de suspensión, lo que garantiza que el RPi espere respuestas del módem.
Comience configurando el sistema de numeración de pines para los números de placa y acceda al puerto serie TTL del RPi utilizando el método serial.Serial. El nombre del puerto en Raspberry Pi es /dev/serial0. Alternativamente, el nombre del puerto puede ser /dev/ttyS0 o /dev/ttyAMA0; use el que sea el UART principal en la Raspberry Pi respectiva .
Envíe el comando AT “AT” al módem utilizando el método serial.write para verificar la comunicación con él. Lea la respuesta del módem usando el método serial.read e imprímala en la consola usando el método de impresión o en una interfaz GUI. El módem responderá "OK" si funciona correctamente y está conectado a la Raspberry Pi.
- Para realizar una llamada, envíe un “ATD
"al módem - Para finalizar la llamada, envíe un comando “ATH” al módem
El script de Python que se muestra a continuación realiza con éxito una llamada a un número y finaliza la llamada después de 30 segundos. Los comandos AT se pasan como bytes al módem y la secuencia de escape '\r' se usa para pasar la entrada de la línea de comando. También puede conectar un micrófono y un altavoz al módem. Anteriormente, pirateamos unos auriculares para poder recibir llamadas de voz en el módem GSM-GPRS.
serie de importación
importar sistema operativo, tiempo
importar RPi.GPIO como GPIO
GPIO.setmode(GPIO.BOARD)
puerto = serial.Serial(“/dev/ttyS0”, velocidad en baudios=9600, tiempo de espera=1)
puerto.write(b'AT\r')
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b'ATD9166873301;\r')
imprimir(“Llamando…”)
hora.sueño(30)
puerto.write(b'ATH\r')
imprimir(“Colgar llamada…”)
Recibir una llamada en el RPi
Cuando se llama a la SIM conectada al módem desde un teléfono o cualquier dispositivo móvil, el módem responde automáticamente a la llamada después de algunos timbres. El módem transmite “RING” desde su pin Txd cuando hay una llamada entrante. El número que llama a la SIM se puede extraer mediante el comando “AT+CLIP”.
El módem responde automáticamente a esta llamada a menos que la rechace, lo que se puede hacer usando el comando AT “ATH”. Para responder manualmente la llamada, puede utilizar el comando "ATA".
Configurar el SIM900 para mensajes SMS
Primero es necesario configurar el módem para mensajes SMS desde el SIM900. Comience verificando si el módem está funcionando enviando el comando "AT". A continuación, apague el eco enviando el comando “ATE0”. Configure indicadores para recibir SMS usando el comando “AT+CNMI”.
Este es un comando de tipo set y tiene el siguiente formato:
AT+CNMI =
oh
0: un mensaje recién recibido con códigos de resultado no solicitados se almacena en el módem. Si el buffer del módem está lleno, los códigos de resultados pueden almacenarse en otro lugar o las indicaciones más antiguas pueden reemplazarse por otras nuevas.
1: Los códigos de resultado de los mensajes recibidos se descartan y rechazan cuando el módem está en línea (es decir, hay un enlace serie activo entre el módem y el dispositivo de control). De lo contrario, los códigos de resultado se transferirán directamente al dispositivo de control.
2: Los códigos de resultado de los mensajes recibidos se almacenan en el módem cuando el módem está en línea (es decir, hay un enlace en serie activo entre el módem y el dispositivo de control). De lo contrario, los códigos de resultado se transferirán directamente al dispositivo de control.
3: En este modo, los códigos de resultado de los mensajes recibidos se transfieren directamente al dispositivo de control.
oh
0: las indicaciones de dobSMS-DELIVER no se envían al dispositivo de control.
1: Si se almacena SMS-DELIVER en el módem, se envía una indicación de su ubicación de memoria al dispositivo de control utilizando los códigos de resultado (una respuesta a los comandos AT) para el comando “+CMTI:”.
2: Los códigos de resultado SMS-DELIVER se enrutan directamente al dispositivo de control.
3: Los SMS-DELIVER de clase 3 se enrutan al dispositivo de control mediante códigos de resultado no solicitados.
oh
0: Las indicaciones de CBM no se envían al dispositivo de control.
2: Cualquier CBM nuevo se enruta directamente al dispositivo de control utilizando códigos de resultado no solicitados (una respuesta al comando AT) — “+CMB:
oh
0: Los SMS-STATUS-REPORT no se enrutan al dispositivo de control.
1: Los SMS-STATUS-REPORT se enrutan al dispositivo de control utilizando el código de resultado no solicitado (una respuesta al comando AT) usando “+CDS:
oh
0: El búfer del módem se descarga al dispositivo de control cuando el dispositivo de control ingresa al modo 1 a 3.
1: El búfer del módem se borra para el dispositivo de control cuando el dispositivo de control ingresa al modo 1 a 3.
Recuerda que el dispositivo controlador es la Raspberry Pi, Arduino, microcontrolador o computadora que controla el módem GSM. En la referencia del comando AT SIM900A, el módem se denomina adaptador de terminal (TA) y el dispositivo de control se denomina equipo terminal (TE).
En este caso, configuramos las indicaciones del SMS a “AT+CNMI=1, 1, 0, 0, 0”.
Luego verifique la ubicación de almacenamiento de SMS preferida usando “AT+CPMS=?” dominio. La ubicación de almacenamiento se puede configurar en la tarjeta SIM (
Hay tres recuerdos, donde:
1. Los mensajes se leen y eliminan.
2. La redacción y el envío del mensaje están completos.
3. Los mensajes recibidos se almacenan.
Definimos las tres memorias en la tarjeta SIM usando el comando AT: AT+CPMS=”SM”,”SM”,”SM”. En respuesta, el módem devuelve la memoria total y utilizada para las tres operaciones (lectura, escritura y almacenamiento de SMS entrantes).
Estas configuraciones de SMS se perderán si no se guardan en el módem. Para guardar esta configuración, se pasa el comando “AT+CSAS” al módem.
Eliminamos todos los mensajes SMS actuales almacenados en la tarjeta SIM usando el comando AT+ CMGDA=”DEL ALL”. Por último, volvemos a comprobar el espacio de memoria utilizado para los mensajes SMS con el comando AT+CPMS=”SM”,”SM”,”SM”. Esta vez las ubicaciones de memoria utilizadas son 0.
serie de importación
importar sistema operativo, tiempo
importar RPi.GPIO como GPIO
GPIO.setmode(GPIO.BOARD)
puerto = serial.Serial(“/dev/ttyS0”, velocidad en baudios=9600, tiempo de espera=1)
puerto.write(b'AT\r')
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b”ATE0\r”)
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CNMI=1,1,0,0,0\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CPMS=”SM”,”SM”,”SM”\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CSAS\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(10)
puerto.write(b'AT+CMGDA=”BORRAR TODO”\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CPMS=”SM”,”SM”,”SM”\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(1)
Envío de SMS desde RPi
Para enviar el SMS, primero configure el mensaje en modo texto usando el comando “AT+CMGF=1”. Luego seleccione un número para enviar el SMS usando el comando AT+CMGS=”XXXXXXXXXX”, donde XXXXXXXXXX es un número de teléfono celular.
El mensaje a enviar se almacena en una variable. El búfer de salida se vacía utilizando el método reset_output_buffer o flushoutput, pero solo si la versión serialpy instalada en el RPI es inferior a 2,5.
El mensaje se concatena con CTRL+Z o un carácter sustituto usando el método char(26). El mensaje junto con el carácter de reemplazo se codifica usando el método str.encode y se envía al módem usando el método serial.write.
serie de importación
importar sistema operativo, tiempo
importar RPi.GPIO como GPIO
GPIO.setmode(GPIO.BOARD)
puerto = serial.Serial(“/dev/ttyS0”, velocidad en baudios=9600, tiempo de espera=1)
puerto.write(b'AT\r')
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b”AT+CMGF=1\r”)
print(“Modo texto habilitado…”)
hora de dormir(3)
puerto.write(b'AT+CMGS=”9166873301″\r')
msg = “Mensaje de prueba SIM900A…”
imprimir(“enviando mensaje…”)
hora de dormir(3)
puerto.reset_output_buffer
hora.sueño(1)
puerto.write(str.encode(msg+chr(26)))
hora de dormir(3)
imprimir(“mensaje enviado…”)
Recibir SMS en RPi
Los mensajes recibidos se almacenan en la tarjeta SIM o en el teléfono/módem. El mensaje SMS recibido en un índice específico se puede leer pasando el comando AT+CMGR=
El módem responderá con las instrucciones del SMS y el cuerpo del SMS recibido.
serie de importación
importar sistema operativo, tiempo
importar RPi.GPIO como GPIO
GPIO.setmode(GPIO.BOARD)
puerto = serial.Serial(“/dev/ttyS0”, velocidad en baudios=9600, tiempo de espera=1)
puerto.write(b'AT\r')
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b”ATE0\r”)
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b”AT+CMGF=1\r”)
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
print(“Modo texto habilitado…”)
hora.sueño(1)
puerto.write(b'AT+CPMS=”SM”,”SM”,”SM”\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CMGR=1\r')
rcv = puerto.read(100)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CMGL=”TODOS”\r')
rcv = puerto.read(300)
imprimir (rev)
hora.sueño(1)
Interfaz del SIM900A con una computadora de escritorio
Cuando se utiliza una computadora de escritorio, el módem GSM-GPRS se puede conectar a una tarjeta USB a serie. El módem a través de la tarjeta USB a serie se identifica como esclavo USB en el escritorio.
Después de averiguar el nombre del puerto serie en el sistema de escritorio (macOS, Linux o Windows), solo necesita cambiar el nombre del puerto serie en los scripts anteriores.
El módem interactúa con el escritorio de la siguiente manera:
Aquí conectamos el módem GSM-GPRS a una computadora con Windows. En nuestro escritorio Windows el módem mediante tarjeta serie USB se identifica como COM22.
Hacer una llamada desde una computadora de escritorio
Como se mencionó anteriormente en el script de Python, para realizar una llamada desde Raspberry Pi, primero comente o elimine las siguientes líneas específicas de RPi:
importar RPi.GPIO como GPIO
GPIO.setmode(GPIO.BOARD)
puerto = serial.Serial(“/dev/ttyS0”, velocidad en baudios=9600, tiempo de espera=1)
Abra la comunicación serie con el puerto COM donde está conectado el módem GSM a través de la tarjeta serie USB. Aquí, está usando COM22.
Añade esta línea:
puerto = serial.Serial (“COM22”, velocidad en baudios = 9600, tiempo de espera = 1)
Ahora podemos realizar una llamada desde el escritorio utilizando el módem SIM900.
serie de importación
importar sistema operativo, tiempo
#importar RPi.GPIO como GPIO
#GPIO.setmode(GPIO.BOARD)
#puerto = serial.Serial(“/dev/ttyS0”, velocidad en baudios=9600, tiempo de espera=1)
puerto = serial.Serial (“COM22”, velocidad en baudios = 9600, tiempo de espera = 1)
puerto.write(b'AT\r')
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b'ATD9166873301;\r')
imprimir(“Llamando…”)
hora.sueño(30)
puerto.write(b'ATH\r')
imprimir(“Colgar llamada…”)
El resultado:
Recibir una llamada en una computadora de escritorio
Para recibir una llamada en un ordenador de sobremesa el proceso es prácticamente el mismo que en la Raspberry Pi. Podemos pasar comandos para finalizar una llamada entrante o responderla manualmente usando una aplicación serie (como Termite o Putty) en un escritorio de Windows.
Configuración del SIM900 para mensajería SMS en un escritorio
Aquí, también debemos comentar o eliminar líneas específicas de RPi y agregar el código apropiado para abrir el puerto serie COM de un escritorio de Windows en el script Python, que debe escribirse para configurar los ajustes de SMS en Raspberry Pi.
serie de importación
importar sistema operativo, tiempo
#importar RPi.GPIO como GPIO
#GPIO.setmode(GPIO.BOARD)
#puerto = serial.Serial(“/dev/ttyS0”, velocidad en baudios=9600, tiempo de espera=1)
puerto = serial.Serial (“COM22”, velocidad en baudios = 9600, tiempo de espera = 1)
puerto.write(b'AT\r')
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b”ATE0\r”)
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CNMI=1,1,0,0,0\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CPMS=”SM”,”SM”,”SM”\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CSAS\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(10)
puerto.write(b'AT+CMGDA=”BORRAR TODO”\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CPMS=”SM”,”SM”,”SM”\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(1)
El resultado:
De los códigos de resultado recibidos del módem, se pueden almacenar un máximo de 25 mensajes en la tarjeta SIM. En este caso ya había dos mensajes almacenados en él.
Después de eliminar todos los mensajes actuales durante la configuración, se utiliza 0 en las ubicaciones de la memoria de SMS.
Enviar SMS desde una computadora de escritorio
Nuevamente, comente o elimine las líneas específicas de RPi. Agregue el código adecuado para abrir el puerto COM serie del escritorio de Windows en un script de Python que está escrito para enviar mensajes SMS desde Raspberry Pi.
serie de importación
importar sistema operativo, tiempo
#importar RPi.GPIO como GPIO
#GPIO.setmode(GPIO.BOARD)
#puerto = serial.Serial(“/dev/ttyS0”, velocidad en baudios=9600, tiempo de espera=1)
puerto = serial.Serial (“COM22”, velocidad en baudios = 9600, tiempo de espera = 1)
puerto.write(b'AT\r')
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b”AT+CMGF=1\r”)
print(“Modo texto habilitado…”)
hora de dormir(3)
puerto.write(b'AT+CMGS=”9166873301″\r')
msg = “Mensaje de prueba SIM900A…”
imprimir(“enviando mensaje…”)
hora de dormir(3)
puerto.reset_output_buffer
hora.sueño(1)
puerto.write(str.encode(msg+chr(26)))
hora de dormir(3)
imprimir(“mensaje enviado…”)
El resultado:
Recibir SMS en una computadora de escritorio
También debes comentar o eliminar líneas específicas de RPi aquí. Agregue código para abrir el puerto COM serie del escritorio de Windows en un script de Python, que está escrito para recibir SMS en Raspberry Pi.
serie de importación
importar sistema operativo, tiempo
#importar RPi.GPIO como GPIO
#GPIO.setmode(GPIO.BOARD)
#puerto = serial.Serial(“/dev/ttyS0”, velocidad en baudios=9600, tiempo de espera=1)
puerto = serial.Serial (“COM22”, velocidad en baudios = 9600, tiempo de espera = 1)
puerto.write(b'AT\r')
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b”ATE0\r”)
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
puerto.write(b”AT+CMGF=1\r”)
rcv = puerto.read(10)
imprimir (rev)
hora.sueño(1)
print(“Modo texto habilitado…”)
hora.sueño(1)
puerto.write(b'AT+CPMS=”SM”,”SM”,”SM”\r')
rcv = puerto.read(30)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CMGR=1\r')
rcv = puerto.read(100)
imprimir (rev)
hora.sueño(1)
puerto.write(b'AT+CMGL=”TODOS”\r')
rcv = puerto.read(300)
imprimir (rev)
hora.sueño(1)
El resultado :
Nota: Los mensajes SMS recibidos se almacenan en la tarjeta SIM, por lo que pasamos comandos para leer estos mensajes desde las ubicaciones de memoria de la tarjeta SIM.
Ahora puedes conectar un módem GSM-GPRS SIM900 con Raspberry Pi y cualquier sistema de escritorio. Esto incluye realizar y recibir llamadas y enviar y recibir mensajes SMS.
En el siguiente tutorial, aprenderemos cómo conectar un módem GPS con Raspberry Pi y una computadora de escritorio.