DÍA 352 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

El Problema de la Señalización "Single-Ended" (UART/I2C)

Protocolos como UART o I2C transmiten la información comparando un cable de señal contra la Tierra (GND) ($V_{signal} = 3.3V$ es un '1', $0V$ es un '0'). El problema es que si un motor industrial arranca cerca de ese cable, la interferencia de radiofrecuencia (EMI) puede inducir un pulso espurio de $+2.0V$. El receptor leerá un '1' falso, la trama se corrompe y la máquina entra en fallo crítico.

El Milagro Matemático Diferencial (CAN_H y CAN_L)

El Bus CAN utiliza dos cables entrelazados (Twisted Pair): CAN_H (High) y CAN_L (Low). Cuando el microcontrolador quiere enviar un '0' lógico (Dominante), envía $3.5V$ por el cable H y $1.5V$ por el cable L. El receptor NO mide los cables contra la Tierra; mide la diferencia entre ellos. La ecuación fundamental en la capa física es:

$V_{diff} = V_{CAN\_H} - V_{CAN\_L}$

Si la interferencia del motor golpea los cables, el ruido eléctrico entra en ambos cables exactamente al mismo tiempo y con la misma intensidad (Ruido de Modo Común). Supongamos que el ruido suma $+2.0V$ a ambos. El cable H sube a $5.5V$ y el cable L sube a $3.5V$. Cuando el receptor hace la resta matemática: $5.5V - 3.5V = 2.0V$. El ruido se elimina a sí mismo en la resta. Esta es la armadura de la inmunidad electromagnética.

¿Qué es OBD-II?

CAN es la capa física y de enlace de datos (cómo viajan los electrones y cómo se arbitran los choques). OBD-II (On-Board Diagnostics) es un protocolo de Capa de Aplicación. Dicta el significado de los bytes que viajan por el Bus CAN. Define que si envías la trama con ID 0x7DF y el payload 02 01 0C, el motor del camión responderá obligatoriamente informando las Revoluciones por Minuto (RPM).

ANULACIÓN DE RUIDO: SINGLE-ENDED (UART) VS DIFERENCIAL (CAN BUS) UART (REFERENCIA A TIERRA) Tx Rx Original RUIDO EMI CORRUPCIÓN GND (Referencia Común 0V) FALLA LÓGICA: El receptor lee el pico EMI como un '1' falso. CAN BUS (SUSTRACCIÓN DIFERENCIAL) CAN Tx CAN Rx 120Ω 120Ω CAN_H (3.5V) CAN_L (1.5V) RUIDO MODO COMÚN (Entra en ambos) MATH: (CAN_H) - (CAN_L) (3.5 + Ruido) - (1.5 + Ruido) = 2.0V PERFECTO: El ruido se anula matemáticamente al restar.

⚙️ Procedimiento Práctico: Hardware y Software CAN

Paso 1: Controlador vs Transceptor.
El STM32 Cortex-M4 incluye un Controlador CAN (bxCAN). Este periférico maneja los tramas lógicas, el cálculo del CRC y el filtrado por ID. Pero no tiene el poder eléctrico para conducir la línea diferencial a 5V. Necesitas diseñar en tu placa un chip externo llamado Transceptor CAN (CAN Transceiver) (Ej. TJA1050 o MCP2551). Conectarás los pines CAN_TX y CAN_RX de tu STM32 a este chip, y de él saldrán los cables físicos CAN_H y CAN_L.

Paso 2: Terminación de Impedancia y Filtros.
Las ondas electromagnéticas rebotan al final de un cable como el agua contra un muro (Reflexión de Señal). Para absorber la energía, los extremos físicos más lejanos del bus CAN deben llevar una resistencia de 120 Ohms cruzando CAN_H y CAN_L. En software, el bus CAN es un protocolo de difusión (Broadcast). Todos escuchan todo. Si no configuras los Filter Banks en el STM32, tu procesador perderá todo el tiempo leyendo mensajes de los frenos ABS del camión en lugar de solo leer los códigos OBD2 que le importan.

💻 Firmware: Inicialización STM32 bxCAN y Filtrado

A diferencia de UART o SPI, CAN no funciona si no se configura un banco de filtros lógicos en el silicio antes de arrancar la red. El siguiente código muestra cómo inicializar el hardware de red y enviar un marco estándar a la ECU del motor del vehículo.


/**
 * @file obd2_can_bus.c
 * @brief Implementación Bare-Metal del bus CAN para comunicación con la ECU del camión
 */

#include "stm32f4xx_hal.h"

extern CAN_HandleTypeDef hcan1; // Definido y configurado vía STM32Cube (Bitrate, Time Quanta)

// =========================================================================
// INICIALIZACIÓN DEL CONTROLADOR CAN Y BANCO DE FILTROS
// =========================================================================
void CAN_Network_Init(void) {
    CAN_FilterTypeDef canFilterConfig;

    // El bus CAN vehicular es extremadamente ruidoso en datos (miles de msjs/seg).
    // Si no filtramos a nivel hardware, la CPU se saturará.
    // Configuramos el banco de filtros 0 para aceptar mensajes OBD2 estándar de respuesta
    // (Típicamente la ECU responde en el ID 0x7E8).
    
    canFilterConfig.FilterBank = 0;
    canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    
    // Configurar qué IDs queremos escuchar. (Desplazados 5 bits en STM32)
    canFilterConfig.FilterIdHigh = (0x7E8 << 5);
    canFilterConfig.FilterIdLow = 0x0000;
    
    // Máscara: Qué bits del ID deben coincidir exactamente.
    // 0x7FF significa: Exigir coincidencia exacta de los 11 bits del Standard ID.
    canFilterConfig.FilterMaskIdHigh = (0x7FF << 5);
    canFilterConfig.FilterMaskIdLow = 0x0000;
    
    canFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
    canFilterConfig.FilterActivation = ENABLE;
    canFilterConfig.SlaveStartFilterBank = 14; // Relevante si usas doble bus CAN

    // Inyectar la regla en el silicio de red
    if (HAL_CAN_ConfigFilter(&hcan1, &canFilterConfig) != HAL_OK) {
        // Error Management
    }

    // Iniciar el Controlador Físico (Sale del modo de Inicialización al Modo Normal)
    if (HAL_CAN_Start(&hcan1) != HAL_OK) {
        // Error Management
    }

    // Activar Interrupción para captura de mensajes entrantes (Rx)
    HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
}

// =========================================================================
// TRANSMISIÓN DE TRAMA DIAGNÓSTICA (OBD2)
// =========================================================================
/**
 * @brief Solicita los RPM del motor a la computadora del vehículo.
 */
void OBD2_Request_Engine_RPM(void) {
    CAN_TxHeaderTypeDef txHeader;
    uint32_t txMailbox;
    uint8_t obd2_payload[8] = {0}; // Payload máximo de CAN Clásico es 8 bytes

    // Estructura de cabecera CAN
    txHeader.StdId = 0x7DF;          // ID estándar Broadcast OBD2 (Cualquier ECU responde)
    txHeader.ExtId = 0x01;
    txHeader.RTR = CAN_RTR_DATA;     // Es un marco de datos, no un Remote Frame
    txHeader.IDE = CAN_ID_STD;       // Usar ID de 11 bits
    txHeader.DLC = 8;                // Longitud de datos (Data Length Code)
    txHeader.TransmitGlobalTime = DISABLE;

    // Carga útil según estándar SAE J1979 (OBD-II)
    obd2_payload[0] = 0x02; // Número de bytes de datos a continuación
    obd2_payload[1] = 0x01; // Servicio 01 (Mostrar datos actuales del tren motriz)
    obd2_payload[2] = 0x0C; // PID 0C (Engine RPM)
    // El resto de los bytes (3 al 7) se dejan en 0x00 o 0x55 (padding)

    // Entregar trama al hardware buzón de transmisión (Mailbox)
    if (HAL_CAN_AddTxMessage(&hcan1, &txHeader, obd2_payload, &txMailbox) != HAL_OK) {
        // Fallo de inyección en el bus. Probable pérdida de arbitraje o cable cortado.
    }
}
        

🚀 Impacto en el Proyecto: Interbloqueo Autotanque

Objetivo del día: Interoperabilidad de maquinaria pesada mediante protocolos robustos.

El diseño puro y aislado de tu Despachador de Gas LP es formidable, pero en la realidad comercial, los despachadores se montan con frecuencia en las "pipas" o camiones de reparto (Autotanques). Las normativas de seguridad dictan una regla de oro: La bomba de gas jamás debe operar si el camión está en movimiento. Una manguera conectada a un tanque estacionario mientras el camión avanza causaría un derrame catastrófico.

¿Cómo confías tu sistema a la decisión de un chofer? No lo haces. Al integrar un **Transceptor CAN** en tu placa de circuito y programar la petición **OBD2**, tu despachador STM32 ahora "habla" directamente con el cerebro del camión diésel. Antes de abrir la electroválvula de gas, tu código exige conocer la velocidad del vehículo (`PID 0x0D`) y las RPM del motor (`PID 0x0C`). Si el camión responde que se desplaza a más de 0 km/h, tu Despachador ejecuta un bloqueo algorítmico inmediato de las válvulas. Has logrado el Santo Grial de los sistemas embebidos móviles: La **Seguridad Operacional Interconectada (Interlock)**, y lo lograste usando el protocolo más indestructible del mundo electromagnético.

📝 Resumen del Día