Open Electronics publicó la segunda y última entrega de su proyecto para emular los telecontroles de la serie TDG con su shield GSM. La primera parte, del mes pasado, presentó el diseño de un telecontrol de 2 entradas y 2 salidas que reproduce el comportamiento del TDG133 con un hardware revisado. Se basa en el shield GSM descrito en el número 231 de la revista y en una placa Arduino Mega 2560.

Lo que distingue al sistema es su flexibilidad. El TDG133 original tiene dos entradas optoaisladas por nivel de tensión y la misma cantidad de salidas a relé. La versión nueva puede manejar hasta 8 entradas (digitales, aunque sin optoaislamiento) y 8 salidas (asignables a tarjetas de relés modulares). Basta con personalizar el firmware y aprovechar la gran cantidad de pines de E/S que trae el Arduino Mega 2560.

La primera entrega explicó el hardware (en la figura 1 sin el shield que hace las interconexiones y en la figura 2 con ese shield montado) y la arquitectura del firmware y del sketch que lo gobierna. Esta segunda parte retoma desde los parámetros de fábrica.

Figura 2. El shield GSM con el shield del telecontrol montado, todo sobre un Arduino Mega 2560.

Parámetros de fábrica

Cuando la EEPROM se programa con el sketch dedicado, o cuando se restauran los parámetros de fábrica con la cadena de comando correspondiente, los datos salen de dos lugares. Unos vienen de directivas del compilador del tipo #define y otros de la memoria Flash del microcontrolador, donde quedan guardados de forma permanente.

Esos datos están al comienzo del archivo GSM_TDG133.ino, en este orden:

  • Un bloque de directivas #define con las direcciones base de los datos que se guardan en EEPROM, identificado con el comentario EEPROM FACTORY PARAMETERS ADDRESS.
  • Un bloque de directivas #define con los parámetros y sus valores por defecto, identificado con el comentario EEPROM DEFAULT FACTORY PARAMETERS. Ahí están las banderas genéricas, la activación de avisos por SMS y por llamada de voz, el tiempo de inhibición, el tiempo de observación, el número máximo de SMS ante una alarma, el plazo para enviar el SMS con el estado de entradas y salidas, y el plazo de la función de apertura de portón.
  • Un bloque de directivas const char que define en Flash los parámetros de texto, como el SMS que se envía en caso de alarma.

En detalle, aparecen además dos bloques:

  • El bloque de la librería GSM con los códigos PIN, PUK y similares, identificado con el comentario GSM Library PIN, PUK etc. El usuario debe poner el PIN y el PUK de su propia SIM. Los demás códigos no se usan en esta aplicación, pero no hay que borrarlos porque forman parte de la librería de gestión del módulo GSM.
  • El bloque con los textos que usa el telecontrol, identificado con el comentario SYSTEM PASSWORD; SMS TEXT FOR ALARM, START-UP etc. Ahí están la clave del sistema (cinco caracteres numéricos, por defecto 12345), los textos de alarma de la entrada 1 y de la entrada 2, el SMS que se manda al arrancar el sketch, el SMS de corte de red eléctrica y el SMS de red restablecida.

Más adelante en el código están todas las cadenas de comando que usa el sketch, también guardadas en la Flash del microcontrolador. El usuario no debe modificar ninguna, porque de lo contrario los comandos de configuración dejan de funcionar. Si se agregan comandos nuevos, también hay que agregar el código que los procesa.

Configuración de la librería GSM

Prototipo del sistema de control remoto GSM, con la placa que aloja el módulo GSM mostrada por separado

Antes de cargar el sketch hay que configurar algunos parámetros de la librería GSM y de la placa. Lo primero es poner los jumpers de la placa GSM para enrutar bien las líneas TX y RX de la UART que comunica al ATmega2560 con el módulo GSM.

El sketch usa la UART 1 por software, con la opción de espiar la comunicación serie entre el módulo GSM y el Arduino Mega 2560. Por eso los jumpers JP1 a JP7 de la placa GSM deben ir en la posición 1-2, como explican los artículos dedicados a esa placa. En todo caso, el archivo Io_GSM.h trae al comienzo una tabla con la configuración de los jumpers.

Los ajustes para que la librería funcione bien están todos en el archivo Io_GSM.h:

  • Elegir el módulo GSM entre los soportados (para esta aplicación se usó el SIMCom SIM800C) y comentar las directivas de los demás motores GSM.
  • Elegir la placa Arduino con que se va a usar, en este caso el Arduino Mega 2560.
  • Elegir la revisión de hardware de la placa GSM, la R.1.3, que es la que está en producción.
  • Elegir el modo por software para la comunicación serie de la UART 1. Si se prefiere, se puede usar la UART 1 por hardware, pero hay que configurar los jumpers como corresponde.
  • Comentar la directiva EARPHONES_JACK, que habilita la salida de audífonos.
  • Dejar habilitadas las máquinas de estado que necesita el telecontrol, que son las de comandos AT genéricos (ENABLE_ANSWER_GENERIC_AT_CMD_STATE), de seguridad (ENABLE_ANSWER_SECURITY_AT_CMD_STATE), de agenda (ENABLE_ANSWER_PHONEBOOK_AT_CMD_STATE), de envío y recepción de SMS (ENABLE_ANSWER_SMS_AT_CMD_STATE) y de llamadas de voz (ENABLE_ANSWER_PHONIC_CALL_AT_CMD_STATE).
  • El código de depuración va desactivado, así que hay que comentar la directiva DEBUG_MODE.

Cadenas de comando soportadas

El sketch acepta muchísimas cadenas de comando heredadas del TDG133 actual. Casi todas se importaron a este sketch, y se agregaron otras nuevas pensadas para esta aplicación. Se pueden mandar por SMS o desde el monitor serie.

Para las principales, el artículo da una descripción breve y un ejemplo de uso. Por comodidad, todos los ejemplos se mandan al telecontrol desde el monitor serie del IDE de Arduino. Si las cadenas llegan por SMS, el telecontrol puede contestar, también por SMS. En ese caso igual se imprimen textos en el monitor serie que indican si el comando se ejecutó o no.

¿Cómo se cambia la clave del sistema?

El primer comando es el que fija la clave del sistema. Las claves son solo numéricas y tienen cinco cifras, sin caracteres alfanuméricos. El código del comando es PWD, seguido de las cinco cifras de la clave nueva (por ejemplo 33225). Al final va la clave que está en uso, precedida del carácter ;.

Una vez ejecutado, el monitor serie responde así:

Código
# Command received by user -> PWD33225;12345
# Command "PWD" processed successfully

La respuesta indica que el comando llegó y se ejecutó bien. La clave nueva del sistema pasa a ser 33225.

Guardar y borrar números de la agenda

El comando para guardar un número de teléfono en una posición de la agenda tiene esta forma:

Código
NUMx+39nnnnnnnnnnn;text;pwd

El código es NUM. Guarda el número nnnnnnnnnnn en la posición de memoria indicada por x (de 1 a 255). La cadena text asocia un texto al número, con un máximo de catorce caracteres, y es obligatoria. Al final va la clave del sistema. Un uso posible sería este:

Código
NUM2+393474131177;"Rossi";33225

Con eso, en la posición 2 de la agenda de la SIM queda guardado el número 3474131177 con el prefijo internacional +39, asociado al señor Rossi. El sketch responde en el monitor serie:

Código
# Command received by user -> NUM2+393474131177;ROSSI;33225
# Command "NUM" processed successfully

Para borrar un número de la agenda se usa el mismo código NUM, seguido de la posición de memoria que se quiere borrar y, como siempre, la clave del sistema.

¿Cómo se lee la agenda?

Para pedir la lista de los primeros ocho números de la agenda, el código es NUM? seguido de la clave. Al ejecutarlo se obtiene esta respuesta:

Código
# Command received by user -> NUM?;33225
# Command "NUM?" processed successfully
# The phone number read at the location: 1 is -> "+393491544888"
# The text associated to the phone number is: "ADMIN"
# The phone number read at the location: 2 is -> "+393474131177"
# The text associated to the phone number is: "ROSSI"
# The phone number read at the location: 3 is -> "+393474331076"
# The text associated to the phone number is: "BIANCHI"
# The phone number read at the location: 4 is empty
# The phone number read at the location: 5 is empty
# The phone number read at the location: 6 is empty
# The phone number read at the location: 7 is empty
# The phone number read at the location: 8 is empty

La cadena devolvió el estado de las primeras ocho posiciones de la agenda. Las tres primeras están ocupadas y las cinco restantes, libres.

Para leer todas las posiciones de la agenda se usa el comando ANUM?. La respuesta es esta (abreviada):

Código
# Command received by user -> ANUM?;33225
# Command "ANUM?" processed successfully
# The phone number read at the location: 1 is -> "+393491544888"
# The text associated to the phone number is: "ADMIN"
# The phone number read at the location: 2 is -> "+393474131177"
# The text associated to the phone number is: "ROSSI"
# The phone number read at the location: 3 is -> "+393474331076"
# The text associated to the phone number is: "BIANCHI"
# The phone number read at the location: 4 is empty
# The phone number read at the location: 5 is empty
...
# The phone number read at the location: 249 is empty
# The phone number read at the location: 250 is empty

Esa cadena devuelve el estado de todas las posiciones de la agenda.

Buscar un número por su texto

Por último, hay un comando para buscar un número en la agenda cuando se conoce el texto asociado. Sirve, por ejemplo, para comprobar que el número del señor Rossi está en la agenda y dentro de las primeras ocho posiciones. El código es FNUM?, seguido del texto que se busca y de la clave:

Código
# Command received by user -> FNUM?;ROSSI;33225
# Command "FNUM?" processed successfully
# Found the phone number into the phonebook. The location is: 2

El número del señor Rossi está en la agenda y ocupa la segunda posición. Si en cambio se busca al señor Brambilla, que se agregó después, aparece en la posición diez de la agenda. Eso significa que solo está habilitado para las funciones de apertura de portón.

Código
# Command received by user -> FNUM?;BRAMBILLA;33225
# Command "FNUM?" processed successfully
# Found the phone number into the phonebook. The location is: 10

Con eso terminan las cadenas de comando para configurar y revisar los números que se guardan en la agenda.

Borrar SMS de la memoria

El sketch trae dos cadenas de comando para borrar un SMS puntual de la memoria de la SIM o para borrar todos los SMS que tenga guardados. Por lo general, la SIM ofrece hasta 30 posiciones de memoria para los SMS entrantes.