DÍA 231 DE 365

Fase 4: FreeRTOS y Conectividad IoT

📖 Teoría a Estudiar

El Regreso a los Comandos AT (Industria Quectel / SIMCom)

En el Día 221 nos enorgullecimos de abandonar los "Comandos AT" del ESP32 para usar C Nativo (ESP-IDF). Pero la industria celular funciona diferente. Los módems LTE de marcas como Quectel (Ej. BG95) o SIMCom (Ej. SIM7000G) son cajas negras certificadas por operadoras globales (AT&T, Telcel, Vodafone).

Cuentan con su propio sistema operativo (generalmente ThreadX) que ya tiene resuelto todo el stack de red celular, seguridad TLS, y el cliente MQTT. Para interactuar con ellos desde el STM32, el estándar absoluto de la industria vuelve a ser el envío de Comandos AT vía UART. No es un paso atrás, es delegar la pesadilla de la certificación de red a un chip externo que hace perfectamente su trabajo.

Las Fases del Enganche Celular (Network Attachment)

Conectarse al WiFi era fácil: Nombre y Contraseña. Conectarse a la red celular requiere paciencia y una robusta Máquina de Estados Finita (FSM) en tu STM32. El proceso es secuencial:

  1. Hard-Boot: El módem tarda hasta 10 segundos en iniciar su RTOS interno.
  2. Verificación de SIM (AT+CPIN?): Revisar que el chip físico esté insertado y desbloqueado.
  3. Registro de Red (AT+CREG?): El módem negocia con la torre celular más cercana (Handshake de radio). Puede tardar de 3 a 60 segundos dependiendo de la señal.
  4. Contexto PDP y APN: Configurar el "Access Point Name" de tu telefónica (Ej. internet.itelcel.com) para que la torre te asigne una IP de salida a Internet.
  5. Apertura MQTT: Negociación TLS con AWS y suscripción.

El Hambre del Módem: Picos de 2 Amperios

A nivel de hardware, esto es crítico: A diferencia del ESP32 que consume ~250mA, un módem celular puede demandar ráfagas microscópicas de hasta 2 Amperios (2000mA) cuando intenta transmitir hacia una torre lejana. Si tu regulador de voltaje LDO o tu fuente conmutada no puede entregar esa corriente instantánea, el voltaje caerá, y el módem se reiniciará en un bucle infinito (Brownout Loop). Necesitarás reguladores Switching dedicados (Ej. LM2596) y capacitores de Tantalio enormes (mínimo 1000uF) pegados a los pines de alimentación del módem.

ARQUITECTURA DE TELEMETRÍA CELULAR (LTE CAT-M1 / NB-IoT) STM32 (Cortex-M4) LTE State Machine 1. Init (AT) 2. SIM Check 3. Net Attach (CREG) 4. APN Config Módem LTE (Ej. BG95) NANO SIM TCP/IP Stack (Interno) Cliente MQTT + TLS UART TX AT+QMTOPEN... UART RX +QMTOPEN: 0,0 Ondas LTE B4/B13 Picos de 2.0 Amperios! Torre AT&T/Telcel AWS IoT

⚙️ Ejercicios Prácticos

Circuito: Además de conectar los pines TX/RX del STM32 al módem, DEBES conectar un pin digital de salida del STM32 al pin PWRKEY del Módem LTE. Los módems celulares no se encienden solo con darles voltaje; requieren que tires el pin PWRKEY a tierra por 500ms para desencadenar el encendido, como si presionaras el botón de prender de tu celular.

Ejercicio 1: Programaremos la FSM de inicialización del Módem (Ejemplo basado en comandos genéricos y sintaxis de Quectel, estándar del mercado).


/**
 * @file lte_modem_driver.c
 * @brief Máquina de Estados para Enganche Celular y Contexto PDP
 */

#include "stm32f401xe.h"
#include "cmsis_os2.h"
#include <string.h>
#include <stdio.h>

// Utilidades del driver UART
extern bool AT_Enviar_Comando(const char* cmd, uint32_t timeout);
extern bool AT_Capturar_Respuesta(const char* cmd, const char* expect, char* buf, uint32_t timeout);

// Pin físico para encender el módem celular
#define MODEM_PWRKEY_PORT  GPIOB
#define MODEM_PWRKEY_PIN   GPIO_PIN_1

// =======================================================
// SECUENCIA DE ENCENDIDO FÍSICO (HARD-BOOT)
// =======================================================
void LTE_Encender_Modem(void) {
    UART_Enviar_String("[LTE] Iniciando Secuencia de Ignición de Hardware...\r\n");
    
    // Simular el pulso de un botón físico de encendido
    HAL_GPIO_WritePin(MODEM_PWRKEY_PORT, MODEM_PWRKEY_PIN, GPIO_PIN_SET);
    osDelay(600); // 600 ms según el Datasheet de Quectel BG95
    HAL_GPIO_WritePin(MODEM_PWRKEY_PORT, MODEM_PWRKEY_PIN, GPIO_PIN_RESET);
    
    UART_Enviar_String("[LTE] Esperando Boot OS del Módem (10 segundos)...\r\n");
    osDelay(10000); // Tiempo obligatorio para que el módem cargue su firmware
}

// =======================================================
// MÁQUINA DE ESTADOS DE ENGANCHE DE RED (ATTACHMENT FSM)
// =======================================================
bool LTE_Inicializar_Red(const char* apn) {
    
    // 1. Sincronización Básica (Autobauding)
    if (!AT_Enviar_Comando("AT\r\n", 1000)) {
        UART_Enviar_String("[LTE-ERR] El módem no responde a los comandos AT.\r\n");
        return false;
    }

    // 2. Apagar el Eco para simplificar el parsing en nuestro STM32
    AT_Enviar_Comando("ATE0\r\n", 1000);

    // 3. Verificar estado de la SIM Card
    char respuesta[64];
    if (AT_Capturar_Respuesta("AT+CPIN?\r\n", "+CPIN: ", respuesta, 2000)) {
        if (strstr(respuesta, "READY") == NULL) {
            UART_Enviar_String("[LTE-ERR] SIM Card ausente, bloqueada o insertada al revés.\r\n");
            return false;
        }
    }

    // 4. Bucle de Búsqueda de Torre (Network Registration)
    // Este proceso puede tardar mucho. Las antenas negocian frecuencias con la torre celular.
    bool red_registrada = false;
    UART_Enviar_String("[LTE] Buscando señal de Torre Celular...\r\n");
    
    for (int i = 0; i < 30; i++) {
        // CREG devuelve el estado de registro: 0,1 (Home) o 0,5 (Roaming)
        if (AT_Capturar_Respuesta("AT+CREG?\r\n", "+CREG: ", respuesta, 2000)) {
            if (strstr(respuesta, ",1") != NULL || strstr(respuesta, ",5") != NULL) {
                red_registrada = true;
                break;
            }
        }
        osDelay(2000); // Esperar 2 segundos antes de volver a preguntar
    }

    if (!red_registrada) {
        UART_Enviar_String("[LTE-ERR] Timeout buscando señal. ¿Antena conectada?\r\n");
        return false;
    }
    UART_Enviar_String("[LTE] ¡Registrado en la red celular exitosamente!\r\n");

    // 5. Configurar el Access Point Name (APN) del proveedor (Ej. Telcel, AT&T, Hologram)
    // Sintaxis Quectel: AT+QICSGP=1,1,"internet.itelcel.com","","",1
    char cmd_apn[128];
    snprintf(cmd_apn, sizeof(cmd_apn), "AT+QICSGP=1,1,\"%s\",\"\",\"\",1\r\n", apn);
    if (!AT_Enviar_Comando(cmd_apn, 2000)) return false;

    // 6. Activar el Contexto PDP (Abre la tubería de datos a internet)
    UART_Enviar_String("[LTE] Solicitando IP Pública a la Operadora...\r\n");
    if (!AT_Enviar_Comando("AT+QIACT=1\r\n", 10000)) { // 10 segundos de timeout, el carrier es lento
        UART_Enviar_String("[LTE-ERR] Falla al activar el Contexto PDP.\r\n");
        return false;
    }

    UART_Enviar_String("[LTE] Módem conectado a Internet. Listo para abrir Sockets MQTT.\r\n");
    return true;
}

// =======================================================
// BUCLE PRINCIPAL DE LA TAREA CELULAR
// =======================================================
/*
void Task_Cellular_Modem(void *argument) {
    LTE_Encender_Modem();
    
    while (!LTE_Inicializar_Red("internet.itelcel.com")) {
        UART_Enviar_String("[LTE] Reintentando conexión desde cero...\r\n");
        // Reiniciar el modem físicamente si es necesario
        LTE_Encender_Modem();
        osDelay(5000);
    }
    
    // Flujo normal: Abrir MQTT usando la pila TCP interna del módem (Ej. AT+QMTOPEN)
    // Sincronizar ventas (Store & Forward)...
}
*/
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Autonomía de Red, Cobertura Nacional y Diseño Hardware M2M.

Implementar WiFi en una estación de Gas LP tiene un defecto logístico enorme: dependes del router de la administración de la gasolinera. Si el cajero cambia la contraseña del WiFi, tu máquina se desconecta. Si se va la luz en la caseta pero tu despachador tiene respaldo de batería UPS, tu máquina seguirá funcionando pero estará aislada de la nube.

Al transicionar a un **Módem LTE (IoT Celular)**, has independizado totalmente tu hardware. Tu Despachador de Gas LP ahora nace con su propio plan de datos M2M (Machine to Machine) global (Ej. Tarjeta SIM 1NCE o Hologram). El equipo sale de fábrica configurado; el técnico solo lo atornilla al piso, lo energiza, y la máquina negocia su propia conexión con la torre de AT&T o Telcel más cercana. Al programar la **Máquina de Estados de Enganche Celular** en tu STM32, aseguras que el equipo tolere las caídas de señal de la torre (Cellular Handoffs y Roaming), reconfigurando su APN y su sesión MQTT de forma completamente silenciosa y autónoma. Has creado un producto verdaderamente *Plug and Play* de grado industrial-nacional.

📝 Resumen del Día