Experiencia en el uso de un módulo GSM en domótica

Hace frío en la cabaña y desea encender el calentador unas horas antes de su llegada, o le preocupa la posibilidad de un apagado de emergencia del sistema de calefacción de una casa de campo en su ausencia. Todos estos problemas pueden resolverse utilizando el módulo GSM, que puede enviar y recibir mensajes SMS y responder a ellos, activando y desactivando la carga necesaria. En teoría, todo es simple, en la práctica, en el camino a la implementación de dicho dispositivo, hay muchas trampas.

imagen

Mi plan era crear un dispositivo simple y económico equipado con dos sensores de temperatura, un sensor de humedad, un módulo GSM, así como un relé de estado sólido y un enchufe para conectar la carga. Lo que sucedió al final se puede ver en la foto. El sensor climático BME280 fue elegido como sensor de temperatura y humedad; su canal de presión no se utiliza. En la foto, puede verlo debajo de la tapa transparente a la izquierda del módulo principal. Esta disposición reduce el efecto de la generación de calor dentro de la carcasa en las lecturas del sensor. Como tapa, se usa un tubo de ensayo de plástico chino con dos orificios de ventilación. El segundo sensor de temperatura es remoto, hecho en el DS18B20. Se encuentra dentro de una sonda de metal, conectada a la carcasa con un cable a través de un conector de audio normal para auriculares. La sonda está diseñada para medir la temperatura del sistema de calefacción directamente. El volumen del cuerpo principal está ocupado por un relé de estado sólido (elegí uno más potente) y un convertidor de 220V a 5V para alimentar el circuito. El enchufe para conectar la carga está montado en la parte posterior de la caja, en la foto no es visible. Una pantalla OLED basada en el controlador SH1106 muestra las lecturas del sensor y también muestra si la carga está encendida. Para controlar todo el sistema, el módulo Arduino Pro Mini se utiliza en la versión 3.3V 8MHz. No soy un gran admirador de esta plataforma, pero la abundancia de bibliotecas, incluidas las que la autora bebe cuidadosamente, la convierten en la mejor opción cuando necesitas hacer algo simple rápidamente.

El módulo SIM800L GSM está alojado en una carcasa metálica separada para reducir la interferencia que crea en el resto del circuito. Como ha demostrado la práctica, la interferencia de esto no se reduce mucho. Y radicalmente se reducen por una antena externa conectada por un cable blindado al conector coaxial, en la foto de arriba está en primer plano. Pero hablaremos de esto con más detalle más adelante.

imagen

Se han escrito muchos artículos sobre el uso de módulos GSM, incluso en el concentrador, por lo que evitaré repeticiones y hablaré sobre lo que no he visto en publicaciones sobre este tema, a saber, cómo hacer un dispositivo confiable basado en este módulo.

En los garajes, donde visito a menudo, recientemente coloqué una barrera en la entrada, que se abre cuando llamas a un número determinado. Aparentemente, está hecho en un módulo GSM similar. Me sorprendió lo difícil que es pasar este número para abrirlo. Ahora sé muchas razones para esto. Este conocimiento me costó varios meses de experimentos y una impresionante cantidad de dinero gastado en ellos. Espero que ahora este conocimiento sirva a alguien más. Considere a qué es importante prestar atención, pasando de problemas de hardware obvios a problemas de software menos obvios.

Lo primero que es importante hacer correctamente es insertar una tarjeta SIM.


Me pareció obvio que la tarjeta SIM se inserta con una esquina biselada hacia adelante. Durante una semana he estado tratando de entender por qué el módulo no quiere registrarse en la red, dominando simultáneamente los comandos en la terminal. Como resultado, en algún foro en inglés, encontré una mención de que debe insertarlo con una esquina biselada. Es extraño que generalmente se inserte de una manera u otra.

Para trabajar bien, necesitas comer bien.


Los requisitos de energía para el módulo GSM son bastante específicos. Está hecho sobre la base de un microchip diseñado para teléfonos móviles con botón y está diseñado para funcionar directamente con una batería de litio. Por lo tanto, 5V es mucho para él, y 3.3V no es suficiente. Además, en el modo de transmisión a máxima potencia, puede consumir corriente de hasta 2A. Si la fuente de alimentación no puede proporcionar la corriente requerida, el módulo GSM puede reiniciarse al intentar registrarse en la red y continuar reiniciando en un ciclo sin fin. Los períodos de consumo máximo generalmente duran menos de un segundo, por lo que es tentador usar un estabilizador de baja corriente con almacenamiento de energía durante los períodos de carga máxima. Como tal unidad, puede usar una batería de litio. Al mismo tiempo, es importante garantizar la posibilidad de desconectarlo y es importante no olvidar usarlo, de lo contrario, desconectar el dispositivo de la red provocará una descarga profunda de la batería y su daño permanente. Otra opción es reemplazar la batería con un ionistor (supercondensador). No le teme a la descarga profunda. Pero también tiene problemas de fiabilidad. Una celda del ionistor generalmente está clasificada para un voltaje de 2.5 a 3V. Los ionizadores diseñados para un voltaje más alto consisten en varias celdas (generalmente 2). En este caso, sin embargo, el desequilibrio de voltaje en las celdas puede provocar la ruptura de la celda. Tal desequilibrio se obtiene fácilmente debido a la diferencia en la capacitancia de la celda o la diferencia en la corriente de fuga. También se debe considerar el parámetro de resistencia interna del ionistor. Los ionistores con alta resistencia interna a altas corrientes son inútiles, y los ionistores con baja resistencia no son más baratos que la batería. Después de que mi ionistor murió repentinamente debido a un desequilibrio de las células, acabo de aplicar un convertidor de 220V a 5V de potencia suficiente. Para reducir el voltaje al módulo GSM deseado, coloco un diodo de silicio regular entre el convertidor y el módulo. En dicho diodo, 0.7V generalmente cae, por lo que el módulo obtiene los 4.3V necesarios. Después del diodo, es útil colocar un condensador electrolítico de gran capacidad. Suavizará las caídas de voltaje cuando el transmisor se encienda repentinamente.

Mantener alejado de la antena de transmisión.


Incluso después de proporcionarle al módulo GSM la potencia requerida, el síntoma de reinicio aparecía periódicamente, pero esta vez el Arduino se reiniciaba. Observar su potencia usando un osciloscopio mostró que la potencia no es necesaria aquí. Aparentemente, el transmisor creó el módulo, ya que el problema surgió con mayor frecuencia cuanto peores eran las condiciones de recepción de la señal de la estación base. Tal efecto radical de interferencia de la antena transmisora ​​es bastante explicable si recordamos que el transmisor del módulo es capaz de entregar 2 vatios a la antena. Tal poder puede hervir un mililitro de agua en 5 minutos o calentar la oreja unos pocos grados. Para combatir este problema, se han probado varios métodos. Primero, conecté una antena externa, que estaba ubicada fuera del gabinete y conectada al módulo con un cable coaxial corto. Sin embargo, esto no dio el efecto esperado. Luego coloqué el módulo en una caja de metal separada, a la que se conectó la antena desde el exterior. Se puso mejor, pero no mucho. La situación mejoró radicalmente solo la extracción de la antena a una cierta distancia del dispositivo debido a su conexión con un cable coaxial de longitud suficiente.

Por qué sucede esto es fácil de entender por consideraciones físicas. Una antena típica es un pin de cuarto de onda, es decir, la mitad de la antena dipolo. Pero, para crear un campo eléctrico, la mitad del dipolo no es suficiente, necesita la segunda mitad, luego aparecerá un campo eléctrico entre los elementos cargados negativa y positivamente de la antena. Para una antena de látigo normal, la otra mitad es la superficie de la tierra o el cuerpo del instrumento, o "equilibrios" conductivos especiales. Pero para los especialistas en marketing, todo esto es demasiado complicado, por lo que generalmente solo vendemos la mitad de la antena normal. Como trabaja ella? Muy simple: la otra mitad es el cable al que está conectada la antena. El hecho de que esté protegido no cambia nada. La superficie exterior de su trenza desempeña el papel de la segunda mitad de la antena dipolo. En este caso, la interferencia se induce fácilmente a los cables que pasan en el vecindario, a pesar de que el cable parece estar blindado. Bueno, si no hay cable, por ejemplo, ¿ocultamos el módulo en una pantalla de metal, de la que sobresale la antena? Si la pantalla es grande (en comparación con la longitud de onda), entonces funciona como la segunda mitad del emisor, y si es pequeña, los otros cables que están conectados a este módulo emiten, no importa cuáles. La siguiente figura ilustra lo anterior (los pros y los contras se muestran para mayor claridad, en realidad, la carga de los elementos de antena cambia de signo con la frecuencia de la portadora).

imagen

La antena 'derecha' se muestra a la izquierda; su cable de entrada no emite interferencia. La imagen central muestra la antena que compra habitualmente. Aquí, el cable de entrada forma parte del emisor e interfiere con los cables que pasan cerca. La situación a la derecha muestra cuando la fuente de señal está oculta en un recinto blindado compacto. Aquí, cualquier cable llevado a tal alojamiento es parte del emisor.

La moraleja es que la única forma confiable de protegerse de la interferencia causada por la antena transmisora ​​es alejarla del resto de la electrónica conectándola con un cable coaxial de longitud suficiente. ¿Cuánto tiempo es suficiente? Es natural medir la distancia con la longitud de onda, en este caso es un máximo de 30 cm. Esta es la distancia mínima por la cual se debe asignar la antena, pero cuanto más, mejor.

No todos los puertos seriales son igualmente útiles.


En los microcontroladores AVR simples, que todo el mundo usa, solo hay un puerto serie de hardware y se usa para descargar el programa. Por lo tanto, la implementación de software del puerto serie es una solución muy popular. Voy a demostrar una afirmación que muchos encontrarían inesperada: para administrar el módulo GSM, la implementación del software del puerto serie no es adecuada en absoluto.

La esencia del problema es que la implementación del software del puerto serie prohíbe las interrupciones durante todo el tiempo que se transmite o recibe el siguiente carácter. Parece que esto es malo, como muchos lo hacen. Por ejemplo, la implementación del protocolo 1-Wire para leer los termómetros de Dallas Semiconductor también prohíbe las interrupciones durante la transmisión de un bit, es decir, 65 microsegundos. Esto, por supuesto, tampoco es demasiado bueno. Si el sistema tiene otros controladores de interrupciones, no podrán proporcionar un tiempo de respuesta de interrupción inferior a estos 65 microsegundos. Si llega una solicitud de interrupción cuando se deniega, solo se procesará después de que la interrupción se resuelva nuevamente. Por ejemplo, un puerto serie de hardware usa interrupciones para colocar el siguiente carácter recibido en el búfer del receptor. Si llega el siguiente personaje hasta que se procese la interrupción del anterior, se perderá. Esto significa que el puerto serie del hardware no podrá funcionar a una velocidad superior a 115200 bits por segundo. En el caso de la implementación de software del puerto serie, todo es peor. Para su funcionamiento, es necesario que el tiempo de respuesta a una interrupción sea menor que el tiempo de transmisión de un bit. Esto nos limita a una velocidad de 9600 bits por segundo.

Un problema más grave es que el software del puerto serie en sí mismo prohíbe las interrupciones. Además, el tiempo durante el cual los prohíbe (el tiempo de transmisión o recepción de un carácter) siempre es aproximadamente 10 veces mayor que el tiempo máximo de procesamiento de interrupción requerido para el funcionamiento correcto del receptor del mismo puerto serie de software. Es decir, siempre interfiere consigo mismo de tal manera que al mismo tiempo no puede recibir ni enviar datos. Por supuesto, en la mayoría de los casos esto no es obligatorio. En la mayoría, pero no en nuestro caso con el módulo GSM. Él puede, inesperadamente para nosotros, por iniciativa propia, comenzar a transferir datos (por ejemplo, al recibir un mensaje SMS). Y en el caso de usar una implementación de software del puerto serie, esto puede conducir fácilmente a una falla del protocolo de comunicación con el módulo. Por lo tanto, acabo de aplicar el mismo puerto serie de hardware tanto para la programación de Arduino como para comunicarme con el módulo GSM. Inconveniente, por supuesto, pero esta es la única forma de hacer un dispositivo confiable.

Protocolo asincrónico: controlador asincrónico


Un protocolo asincrónico es un protocolo en el que un lado del intercambio puede comenzar a transmitir información inesperadamente al otro lado, es decir, sin ninguna sincronización con sus mensajes. Este es exactamente el protocolo de comunicación con el módulo GSM. Responde regularmente a las solicitudes del Arduino, pero también puede comenzar a transmitir algo propio, por ejemplo, para informar sobre el mensaje SMS recibido. Y esto crea un problema real, ya que ninguna de las bibliotecas que conozco para trabajar con el módulo de Arduino tiene en cuenta la asincronía de protocolo. Imagine que Arduino envió un comando al módulo, y el módulo al mismo tiempo transmitió información sobre el mensaje SMS recibido. Esta información será aceptada en lugar de responder al comando. Como resultado, la biblioteca devolverá un error en respuesta al comando (en el mejor de los casos, todo se 'colgará' en el peor de los casos) y se perderá el mensaje sobre el SMS recibido.

Esto es fácil de solucionar: solo necesita escribir su propio controlador de protocolo asíncrono. Un controlador asíncrono solo hace los requisitos mínimos necesarios para las respuestas del módulo a sus comandos. Como resultado, el módulo responde OK o ERROR a cada comando. Y eso es todo lo que se necesita para arreglar la respuesta. Todas las demás líneas que provienen del módulo se procesan independientemente de si vinieron en respuesta a un comando o por su cuenta. El significado de estas líneas siempre se puede determinar por su comienzo. Si la línea comienza con + CSQ, entonces contiene información sobre la calidad de la señal. Si comienza + CMT, esta es información sobre el SMS recibido y contiene la dirección del remitente. La primera línea se envía como parte de la respuesta al comando AT + CSQ, y el segundo módulo se envía por iniciativa propia, pero para nosotros esta diferencia es absolutamente insignificante. El módulo envía los mensajes SMS recibidos directamente al puerto serie. Esto evita leerlos de la memoria y su posterior eliminación. Para que podamos reconocer los mensajes SMS en el flujo general de mensajes desde el módulo, deben comenzar con el símbolo #, de lo contrario el mensaje se ignora.

Aquí se encuentra una biblioteca creada por el autor que implementa el enfoque anterior.

Para recibir líneas que comienzan con una determinada secuencia de caracteres, el cliente crea un objeto especial: una trampa. Puede crear cualquier cantidad de trampas de este tipo. Las líneas recibidas del módulo, que no sean OK, ERROR, que no cayeron en ninguna de las trampas, simplemente se ignoran. Dado que dicha arquitectura no requiere un análisis completo de las respuestas del módulo a muchos tipos diferentes de comandos, el código de la biblioteca es muchas veces más compacto que cualquiera de las bibliotecas que conozco.

Cual es el resultado?


El resultado es un dispositivo que funciona de manera confiable en un área con poca cobertura, incluso mejor que el teléfono promedio. A continuación se muestra un resumen completo de la misma.

imagen

Para aquellos interesados, hay un enlace al github donde encontrará el código fuente del proyecto y una descripción de los comandos que se pueden enviar al dispositivo en mensajes SMS.

github.com/olegv142/GsmMon

Source: https://habr.com/ru/post/460745/


All Articles