DÍA 275 DE 365

Fase 5: Diseño Industrial y Proyecto Final

📖 Teoría a Estudiar

La Señal Diferencial (RS-485 vs UART)

Tu STM32 se comunica mediante UART (TX y RX) referenciado a Tierra (GND). Si un motor genera una chispa eléctrica, esa interferencia se suma a tu cable TX. El STM32 no sabrá si ese pico de 3V es un "1" lógico legítimo o ruido, corrompiendo el mensaje.

El Transceptor RS-485 soluciona esto transformando el pin TX en Dos Cables (A y B). Cuando quiere enviar un "1", el cable A sube a 5V y el cable B baja a 0V. Cuando quiere enviar un "0", se invierten. El receptor al otro lado de la gasolinera solo resta los voltajes (A - B). Si un ruido electromagnético golpea el cable largo, afectará a ambos cables por igual. Al restarlos, el ruido se cancela matemáticamente a cero. Esto se llama Rechazo de Modo Común (Common-Mode Rejection).

Anatomía de la Defensa ESD y Sobretensiones

El Rechazo de Modo Común ignora el ruido, pero no evita que un pico de 4,000 voltios por estática (ESD) o inducción de rayos destruya físicamente el transceptor de silicio. Para sobrevivir, necesitamos construir tres anillos de seguridad:

  1. El Diodo Asimétrico (SM712): Diseñado exclusivamente para RS-485. ¿Por qué asimétrico? Porque el estándar RS-485 permite que las señales floten entre -7V y +12V. Si usas un diodo Zener común de 5V, recortarás la señal legítima. El chip SM712 absorbe descargas de hasta 30kV y las envía a Protective Earth (Chasis de tierra) antes de que toquen tu chip.
  2. Resistencias PTC (Fusibles Reseteables): En caso de que un instalador tonto conecte la línea de 24V de alimentación por accidente al cable de datos A o B, el SM712 se pondría en corto para salvar la placa, quemándose de paso. Los PTCs se calientan y abren el circuito, protegiendo al diodo y reseteándose al enfriarse.
  3. Aislamiento Galvánico Total: Un chip como el ISO1410 (Texas Instruments) o ADM2483 (Analog Devices) no solo convierte la señal; tiene una barrera magnética interna. Rompe el hilo conductor para que los Ground Loops sean físicamente imposibles. Obligatorio requiere una fuente de poder aislada (ej. B0505S).
GND1 GND2_ISO PE BARRERA DE AISLAMIENTO GALVÁNICO MCU DOMAIN (STM32) UART TX RX DE/RE B0305S-1W (Aislador DC-DC) +3.3V +5V_ISO ISO1410 (Transceptor Aislado) TXD RXD DE A (+) B (-) RS-485 BUS DOMAIN (Aislado) PTC1 A PTC2 B 120Ω 4.7kΩ +5V_ISO 4.7kΩ SM712 (TVS) CHASSIS

⚙️ Ejercicios Prácticos

El Control del Flujo (Half-Duplex): El protocolo RS-485 utiliza los mismos dos cables (A y B) tanto para enviar como para recibir. Si dos dispositivos "hablan" al mismo tiempo, las señales colisionan y se genera basura digital. Para evitarlo, el transceptor tiene los pines DE (Driver Enable) y RE (Receiver Enable).

Por defecto, mantendremos el pin DE/RE en LOW (Modo Escucha). Justo antes de transmitir, el STM32 debe poner el pin en HIGH (Modo Hablar). El error más común de los novatos es apagar el pin DE/RE inmediatamente después de la función HAL_UART_Transmit. En C, esa función a veces retorna cuando el último byte fue colocado en el buffer, no cuando salió físicamente del cable. Si apagas el pin muy rápido, "amputarás" el último byte de tu mensaje.

Ejercicio 1: El Driver RS-485 Seguro (MISRA-C). Programaremos la gestión del pin de Dirección asegurándonos de esperar la bandera TC (Transmission Complete) del hardware STM32.


/**
 * @file rs485_driver.c
 * @brief Driver de comunicaciones RS-485 con Control de Flujo Half-Duplex
 */

#include "stm32f401xe.h"
#include "cmsis_os2.h"
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

// =========================================================================
// DEFINICIONES DE HARDWARE (Mapeo a KiCad)
// =========================================================================
extern UART_HandleTypeDef huart2;

#define RS485_DIR_PORT          GPIOA
#define RS485_DIR_PIN           GPIO_PIN_4

#define RS485_MODE_TX           GPIO_PIN_SET    // HIGH = Transmitir
#define RS485_MODE_RX           GPIO_PIN_RESET  // LOW  = Escuchar

// =========================================================================
// INICIALIZACIÓN
// =========================================================================
void RS485_Init(void) {
    // Asegurar que el estado inicial por defecto sea siempre ESCUCHAR
    // Esto previene que saturemos el bus y causemos colisiones con otros nodos.
    HAL_GPIO_WritePin(RS485_DIR_PORT, RS485_DIR_PIN, RS485_MODE_RX);
}

// =========================================================================
// TRANSMISIÓN ROBUSTA Y BLOQUEANTE
// =========================================================================
/**
 * @brief Envía un paquete de datos por el bus RS-485 gestionando el pin DE.
 * @param pData Puntero al buffer de datos.
 * @param size  Cantidad de bytes a transmitir.
 * @param timeout Tiempo máximo de espera en ms.
 * @retval bool TRUE si se transmitió completo, FALSE en caso de error.
 */
bool RS485_Transmitir(const uint8_t *pData, uint16_t size, uint32_t timeout) {
    
    // 1. Activar el Driver del Transceptor (Tomar el control del Bus A/B)
    HAL_GPIO_WritePin(RS485_DIR_PORT, RS485_DIR_PIN, RS485_MODE_TX);
    
    // Pequeño retardo para asegurar que el hardware ISO1410 despierte 
    // y estabilice el bus antes de enviar el primer bit.
    // Una instrucción NOP múltiple o un delay microscópico basta.
    __asm("nop"); __asm("nop"); __asm("nop"); __asm("nop");
    
    // 2. Enviar los datos mediante el hardware UART de ST
    HAL_StatusTypeDef status = HAL_UART_Transmit(&huart2, (uint8_t*)pData, size, timeout);
    
    // 3. LA ESPERA CRÍTICA DE TRANSMISIÓN COMPLETA (TC)
    // HAL_UART_Transmit retorna cuando el buffer está vacío, pero el Shift Register
    // de hardware aún podría estar escupiendo el último byte a los cables físicos.
    // Si apagamos el DIR_PIN ahora, el mensaje llegará truncado.
    
    if (status == HAL_OK) {
        // Esperamos proactivamente que el bit TC (Transmission Complete) se levante en el registro.
        // En implementaciones con Interrupciones/DMA, esto se maneja en el Callback.
        while (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC) == RESET) {
            // Espera ocupada (Watchdog debe estar gestionado)
        }
    }
    
    // 4. Liberar el Bus (Regresar a modo Escucha)
    HAL_GPIO_WritePin(RS485_DIR_PORT, RS485_DIR_PIN, RS485_MODE_RX);
    
    return (status == HAL_OK);
}

// =========================================================================
// TAREA RTOS DE RECEPCIÓN (DMA POLLED)
// =========================================================================
// Asumimos que UART_RX usa Circular DMA para no perder bytes asíncronos.
/*
void Task_RS485_Listener(void *argument) {
    RS485_Init();
    
    for(;;) {
        // Procesar buffer DMA entrante...
        // Si detectamos mensaje válido para este Nodo (ej. Modbus RTU Address 0x01)
        // procesamos la petición y usamos RS485_Transmitir() para responder.
        
        osDelay(pdMS_TO_TICKS(10));
    }
}
*/
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Infraestructura de Red de Campo (Fieldbus) Inmune a Descargas.

Imagina que instalan 5 de tus Despachadores de Gas LP en fila en el patio de una gasolinera, y todos se conectan por un mismo cable trenzado hacia la oficina administrativa mediante protocolo Modbus RTU sobre RS-485. Ese cable es un pararrayos horizontal perfecto. Una tormenta eléctrica de verano a 2 kilómetros de distancia inducirá transitorios de alto voltaje en esa línea de cobre.

Si hubieras usado un chip `MAX485` genérico y conectado las tierras, la descarga eléctrica de la tormenta quemaría en cadena la tarjeta madre de los 5 despachadores. Al implementar el esquema de Protección de Triple Anillo en KiCad, le has dado a tu equipo armadura pesada. El **Diodo SM712** captura el voltaje masivo asimétrico y lo drena al chasis metálico (Earth) antes de que toque los componentes sensibles. Si algo de energía logra pasar, las **Resistencias PTC** frenan la corriente. Y finalmente, la barrera magnética del **Aislador Galvánico (ISO1410)** crea una zanja en el castillo que la electricidad no puede saltar, asegurando que tu STM32 Cortex-M4 y sus rutinas de Seguridad SRE (Software Reliability Engineering) permanezcan intactas operando la válvula de gas, sin importar la hostilidad del clima exterior.

📝 Resumen del Día