DÍA 062 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

Resistencias Pull-up / Pull-down

En el diseño de interfaces físicas, ningún pin de entrada digital debe quedar jamás "al aire" (flotante). Una resistencia Pull-up (anclaje hacia arriba) o Pull-down (anclaje hacia abajo) asegura que el microcontrolador lea un voltaje absoluto (3.3V o 0V) cuando el actuador mecánico está en reposo.

PULL-UP (Active-Low) PULL-DOWN (Active-High) VCC (3.3V) 4.7 kΩ Al Pin STM32 Botón GND VCC (3.3V) Botón Al Pin STM32 10 kΩ GND

Internas vs Externas

Microcontroladores modernos como el STM32 tienen resistencias Pull-up/Pull-down internas (configurables vía software en los registros de GPIO). Sin embargo, estas resistencias internas son muy "débiles" (típicamente entre 40 kΩ y 50 kΩ).

Para un botón soldado en la misma placa PCB, la resistencia interna es suficiente. Pero si tu botón está en el chasis de la gasera, a 2 metros de distancia unido por un largo cable de cobre, ese cable actuará como una antena enorme. El ruido electromagnético de la bomba de gas superará fácilmente a la débil resistencia interna. Por ello, para cables externos, es obligatorio diseñar Resistencias Pull-up Físicas Externas "Fuertes" (ej. 4.7 kΩ o 10 kΩ) soldadas directamente en la entrada de la placa.

Lógica Inversa en C (Active-Low)

Al adoptar el estándar industrial de Pull-up, nuestro hardware funcionará al revés de la intuición humana: el botón no presionado enviará un `1`, y el presionado enviará un `0`. El software (nuestro firmware Bare-Metal) debe encargarse de revertir esta lógica para que el Súper Bucle la entienda de forma natural.

⚙️ Ejercicios Prácticos

Ejercicio 1: Programa una función de lectura de hardware (Capa HAL) que invierta la lógica de un botón físico configurado con Pull-up, entregándole a tu Súper Bucle un estado booleano limpio y natural (true = presionado).


#include <stdint.h>
#include <stdbool.h>

// --- 1. REGISTROS FÍSICOS (Simulación STM32 GPIO) ---
// Registro de Datos de Entrada del Puerto A (IDR - Input Data Register)
volatile uint32_t *GPIOA_IDR = (volatile uint32_t *)0x40020010;

// Definimos el pin físico donde conectaremos el botón de PARO en la PCB
const uint8_t PIN_BOTON_PARO = 3;


// --- 2. CAPA DE ABSTRACCIÓN DE HARDWARE (HAL) ---
// Esta función aísla al Súper Bucle de la extraña lógica electrónica
bool leer_boton_paro_fisico(void) {
    
    // Leemos el estado eléctrico puro del pin usando Máscaras de Bits (Día 5)
    uint32_t estado_pin = (*GPIOA_IDR & (1 << PIN_BOTON_PARO));
    
    // Traducción Active-Low (Lógica de Pull-up):
    // Si el pin tiene voltaje (estado_pin > 0), significa que nadie está tocando 
    // el botón y el Pull-up está inyectando 3.3V. Devuelve FALSE.
    // Si el pin es 0 (conectado a tierra), alguien presionó el botón. Devuelve TRUE.
    
    if (estado_pin == 0) {
        return true;  // ¡Físicamente presionado!
    } else {
        return false; // Reposo
    }
}


// --- 3. IMPLEMENTACIÓN EN EL SISTEMA ---
int main(void) {
    
    // Simulamos la inicialización de hardware (Días anteriores)
    // GPIOA_Init();
    
    while(1) {
        
        // 1. Leemos los sensores físicos
        bool emergencia_activada = leer_boton_paro_fisico();
        
        // 2. Evaluamos en nuestra FSM (Día 60)
        // Observa cómo el código de la lógica de negocios queda 
        // increíblemente limpio y humano. Al Súper Bucle no le interesa
        // saber qué es un Pull-up o un Active-Low.
        
        if (emergencia_activada == true) {
            
            // Falla segura (Fail-Safe) por hardware
            // solicitar_activacion_rele(REL_BOMBA, false);
            // estado_actual = ESTADO_FALLA_CRITICA;
            
        }
    }
    
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Inmunidad Electromagnética de Entradas Físicas.

Los botones del teclado matricial (0 al 9, Iniciar, Paro) que el usuario presiona en la carátula de tu despachador son botones mecánicos expuestos a la intemperie. Si alguien acerca un teléfono móvil transmitiendo a máxima potencia cerca de tu máquina, las ondas de radio chocarán contra los cables de los botones.

Al soldar resistencias Pull-up externas de 4.7 kΩ en la entrada de tu PCB para cada botón, creas un "muro de fuerza" eléctrico. Las ondas de radio del celular intentarán alterar el voltaje del cable, pero la resistencia es tan fuerte y está tan amarrada a los 3.3V de la fuente, que absorberá el ruido sin que el STM32 registre ni un solo cambio. Tu software de lectura leer_boton_paro_fisico() invertirá la lógica de forma transparente, logrando un teclado industrial de respuesta perfecta que jamás despachará gas de forma fantasma.

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

1. Si un operario daña accidentalmente el cable del botón cortándolo por la mitad con una herramienta, ¿cómo reaccionará nuestro sistema basado en Pull-up?
Respuesta: Gracias al diseño Pull-up, si el cable se corta y el botón queda desconectado, el pin del STM32 seguirá anclado a los 3.3V por la resistencia soldada en la placa base. El sistema leerá un estado de reposo (FALSE). El equipo simplemente no hará nada si intentas presionar el botón roto. Si hubiéramos usado Pull-down en la placa y el cable VCC se cortara, pasaría exactamente lo mismo (seguridad pasiva).

2. Sin embargo, ¿qué pasa si el cable pelado choca contra la carcasa metálica de la máquina (tierra)?
Respuesta: ¡Aquí brilla el Pull-up! Si el cable pelado toca el metal, se crea un corto a tierra. El voltaje cae a 0V, y nuestro software lee un TRUE. Si era el botón de PARO, la máquina se detiene sola. Es un "Fallo Seguro" (Fail-Safe). En un sistema Pull-down, un corto a tierra no haría nada, la máquina no se detendría, y si alguien presionara el botón de PARO intentando inyectar VCC, se crearía un corto violento entre VCC y Tierra que apagaría (o quemaría) toda la placa electrónica.