DÍA 354 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

La Red Iridium y el Protocolo SBD

A diferencia de satélites GPS (MEO) o televisión (GEO), la constelación Iridium está compuesta por 66 satélites en Órbita Terrestre Baja (LEO, a unos 780 km). Esto permite comunicación bidireccional global con antenas diminutas y sin necesidad de apuntarlas direccionalmente.

El ancho de banda satelital es carísimo (cobran por byte) y sufre alta latencia (segundos, no milisegundos). No puedes usar MQTT directo ni TCP/IP estándar aquí. Debemos utilizar Short Burst Data (SBD). Es un servicio de mensajería de Iridium (como un SMS satelital) que permite enviar paquetes de hasta 340 bytes (MO - Mobile Originated) y recibir 270 bytes (MT - Mobile Terminated). Es perfecto para nuestro Heartbeat JSON de 128 bytes que programamos en el Día 344.

El Desafío Eléctrico (Current Bursts)

Los módems satelitales (como el Iridium 9602 o 9603) operan silenciosamente consumiendo unos $45\text{ mA}$. Pero en el microsegundo exacto en que transmiten su ráfaga RF hacia el satélite, exigen un pulso de corriente violento que puede alcanzar hasta 1.5 Amperios a 5V. Si tu regulador lineal (LDO) no puede suministrar esa corriente instantánea, el voltaje caerá en picada ($\Delta V$) y tu microcontrolador sufrirá un \textit{Brown-out Reset} (Se reiniciará). Para calcular la caída de voltaje en un capacitor de reserva (SuperCap) durante el pulso de transmisión, usamos:

$\Delta V = \frac{I \cdot \Delta t}{C}$

ARQUITECTURA DE TELEMETRÍA GLOBAL SBD (IRIDIUM LEO) SISTEMA EMBEBIDO STM32 MCU Genera Payload JSON "AT+SBDWT=..." FUENTE 5V DEDICADA LDO 2.0A (Regulador) 1000 µF Absorbe el "Burst" (I = 1.5A) MODEM 9603 Iridium SBD Transceiver UART (Tx/Rx) VCC_SAT (5V) Network Status Pin (Espera a ver el cielo) Ráfaga RF (L-Band 1616 MHz) SATÉLITE LEO (Iridium Constellation) IRIDIUM GATEWAY Earth Station DirectIP / Webhook AWS IoT (Dashboard) "Heartbeat Recibido"

⚙️ Procedimiento Práctico: Control por Comandos AT

Paso 1: Monitorear el pin de Red (Network Available).
El módem satelital no puede transmitir si tiene un techo de concreto encima. Cuenta con un pin físico de salida (Net_Avail) que se pone en estado ALTO (1) cuando el módem ha detectado el cruce de un satélite en el cielo. El STM32 debe esperar esta interrupción de hardware antes de intentar transmitir, o desperdiciará energía.

Paso 2: La Danza SBD (AT Commands).
A diferencia de los protocolos modernos, estos módems se controlan con comandos de texto puro (Heredados del estándar Hayes). El flujo es:
1. AT -> Despertar módem (Espera un 'OK').
2. AT+SBDWT=Payload_Text -> Carga tu mensaje JSON (ej. el de ventas) en la memoria búfer del módem.
3. AT+SBDIX -> Inicia la sesión satelital. El módem dispara la ráfaga al cielo y espera la confirmación (Acknowledge) de la estación terrestre.

💻 Firmware: Transmisión Satelital Iridium en C

Este código envía el "Latido" comercial (generado en el Día 344) a través del UART físico conectado al módem 9603. Se implementa como una máquina de estados para evitar bloquear el procesador mientras el módem negocia con el espacio (lo cual puede tomar hasta 20 segundos).


/**
 * @file iridium_sbd_driver.c
 * @brief Driver Bare-Metal para Módems Satelitales Iridium 9602/9603 usando Comandos AT
 */

#include "stm32f4xx_hal.h"
#include <string.h>
#include <stdio.h>

extern UART_HandleTypeDef huart3; // UART dedicada al Modem Iridium

// =========================================================================
// TRANSMISIÓN DE HEARTBEAT SATELITAL (SBD)
// =========================================================================
/**
 * @brief Carga el payload en el módem y ejecuta la ráfaga de transmisión LEO.
 * @param json_payload: El texto a transmitir (Max 340 bytes).
 * @return HAL_StatusTypeDef (Error si el cielo no está visible)
 */
HAL_StatusTypeDef Iridium_Send_Heartbeat(const char* json_payload) {
    char at_command[400];
    uint8_t rx_buffer[100];
    
    // 1. VALIDAR VISIBILIDAD DE LA CONSTELACIÓN
    // Leemos el pin físico 'Network_Available' del Módem 9603
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == GPIO_PIN_RESET) {
        printf("[IRIDIUM] Error: Satélite fuera de rango (Sin vista al cielo).\r\n");
        return HAL_ERROR;
    }

    // 2. DESPERTAR MÓDEM (Clear Buffer)
    printf("[IRIDIUM] Inicializando sesión SBD...\r\n");
    HAL_UART_Transmit(&huart3, (uint8_t*)"AT+SBDD0\r\n", 10, 500); // Limpia buffer Módem (MO)
    HAL_Delay(100); // Esperar respuesta 'OK' (Simplificado para el ejemplo)

    // 3. CARGAR PAYLOAD AL MÓDEM (Write Text)
    // Se concatena el comando AT+SBDWT= con nuestro texto plano.
    // NOTA: Para binarios se usaría AT+SBDWB (Write Binary), pero el JSON es texto.
    strcpy(at_command, "AT+SBDWT=");
    strcat(at_command, json_payload);
    strcat(at_command, "\r\n");
    
    HAL_UART_Transmit(&huart3, (uint8_t*)at_command, strlen(at_command), 1000);
    HAL_Delay(200); // Esperar el 'OK' de que el payload fue memorizado

    // 4. EJECUTAR SESIÓN DE RÁFAGA SATELITAL (Initiate Extended Session)
    // Aquí el módem consume 1.5 Amperios. El SuperCapacitor de la fuente debe soportarlo.
    printf("[IRIDIUM] Transmitiendo ráfaga al espacio (AT+SBDIX)...\r\n");
    HAL_UART_Transmit(&huart3, (uint8_t*)"AT+SBDIX\r\n", 10, 1000);
    
    // La respuesta a AT+SBDIX toma entre 5 a 20 segundos dependiendo del clima y posición.
    // Formato de éxito esperado: "+SBDIX: 0, 12, 0, 0, 0, 0" (El primer '0' indica Tx Exitoso)
    
    // [!] En un sistema real, no usamos HAL_Delay. Usamos Interrupciones (Día 343) 
    // o el RTOS (Día 351) para no bloquear la metrología de la turbina mientras esperamos.
    
    if (HAL_UART_Receive(&huart3, rx_buffer, sizeof(rx_buffer), 15000) == HAL_OK) {
        if (strstr((char*)rx_buffer, "+SBDIX: 0") != NULL || 
            strstr((char*)rx_buffer, "+SBDIX: 1") != NULL || 
            strstr((char*)rx_buffer, "+SBDIX: 2") != NULL) {
            
            printf("[IRIDIUM] Transmisión Exitosa. Heartbeat entregado al Gateway terrestre.\r\n");
            return HAL_OK;
        }
    }
    
    printf("[IRIDIUM] Fallo de Transmisión (Código SBDIX de error).\r\n");
    return HAL_ERROR;
}
        

🚀 Impacto en la Tesis: Conectividad Global Inquebrantable

Objetivo del día: Garantizar la telemetría corporativa en zonas geográficas incomunicadas (Redundancia de Nivel 2).

En el Día 344 de nuestro entrenamiento, validaste empíricamente que tu máquina salva dinero enviando un Heartbeat a AWS IoT mediante Wi-Fi o 4G LTE. Pero si presentas esto ante la junta directiva de la gasera, un directivo inevitablemente objetará: *"Mis camiones de reparto operan en la Sierra y en minas a tajo abierto donde no hay señal de celular. Su sistema mágico no me sirve ahí"*. En el contexto de IoT industrial, el silencio es inaceptable.

Al introducir el módem Iridium SBD en el diagrama de arquitectura, destruyes esa objeción. La comunicación Satelital LEO actúa como el "Fallback Redundante" perfecto. Cuando el ESP32 detecta pérdida de enlace TCP/IP, el STM32 enruta el paquete JSON comprimido hacia el módem 9603 mediante el bus UART. Aunque la latencia suba a 15 segundos y el costo por byte sea alto, la venta de 1,000 litros de gas queda registrada de forma auditable en la nube sin importar la ubicación geográfica del vehículo. Esta es la diferencia entre un proyecto escolar y un equipo Enterprise: tu Despachador jamás está solo.

📝 Resumen del Día