DÍA 065 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

El Transistor BJT (NPN) como Interruptor

El BJT es un amplificador de corriente compuesto por tres terminales: Base (B), Colector (C) y Emisor (E). En electrónica digital Bare-Metal, no lo usamos para amplificar audio, lo usamos en "Corte y Saturación", es decir, como un interruptor de encendido/apagado absoluto.

El Efecto Válvula

Imagina que la Base es la llave de paso de una presa. Si inyectas una pequeñísima corriente eléctrica en la Base, la presa se abre y permite que una corriente gigantesca fluya desde el Colector hacia el Emisor.

DRIVER DE ALARMA CON TRANSISTOR NPN (ej. 2N2222A) Pin STM32 (3.3V) Ib (Pequeña) Rb 1 kΩ B C E NPN TORRETA (24V, 500mA) VCC +24V Ic (Gigante) GND COMÚN

Cálculo de la Resistencia de Base (Rb)

Si conectas el pin del STM32 directo a la Base, la corriente infinita destruirá ambos componentes. Debemos poner una resistencia Rb. El transistor tiene una ganancia llamada Beta (β) o hFE (usualmente ~100). Si la torreta consume 500mA (Ic), necesitamos inyectar al menos 5mA en la base (Ib = Ic / β).

Por la Ley de Ohm, considerando que la Base consume ~0.7V internamente:
Rb = (3.3V - 0.7V) / 0.005A = 520 Ohmios.
Para asegurar la saturación profunda (garantizar que se encienda al 100% y no se caliente), multiplicamos la corriente inyectada por un factor de seguridad. Un valor comercial de 1 kΩ o 470 Ω es el estándar absoluto para excitar BJTs desde microcontroladores ARM.

⚙️ Ejercicios Prácticos

Ejercicio 1: Tu hardware ya tiene la circuitería BJT instalada. Programa en C el driver para hacer parpadear la torreta estroboscópica de manera no bloqueante cuando la máquina entre en un estado de emergencia.


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

// --- 1. REGISTROS FÍSICOS (Simulación GPIO Puerto C) ---
volatile uint32_t *GPIOC_MODER  = (volatile uint32_t *)0x40020800;
volatile uint32_t *GPIOC_ODR    = (volatile uint32_t *)0x40020814;

const uint8_t PIN_TORRETA_BJT = 13;

// Variable global de tiempo (Asumimos que un Timer la incrementa cada 1ms)
extern volatile uint32_t milisegundos_globales;


// --- 2. CONFIGURACIÓN DEL DRIVER ---
void alarma_init_hardware(void) {
    // 1. Apagado preventivo seguro
    *GPIOC_ODR &= ~(1 << PIN_TORRETA_BJT);
    
    // 2. Configurar como salida (Push-Pull)
    *GPIOC_MODER &= ~(3 << (PIN_TORRETA_BJT * 2));
    *GPIOC_MODER |= (1 << (PIN_TORRETA_BJT * 2));
}

// Función básica atómica
void alarma_set_estado(bool encendido) {
    if (encendido) {
        // Enviar 3.3V a la Base. El BJT satura y la torreta se enciende.
        *GPIOC_ODR |= (1 << PIN_TORRETA_BJT);
    } else {
        // Enviar 0V. El BJT entra en "Corte" (aislamiento total).
        *GPIOC_ODR &= ~(1 << PIN_TORRETA_BJT);
    }
}


// --- 3. LÓGICA NO BLOQUEANTE (Súper Bucle) ---
// Variables estáticas para el temporizador de parpadeo (Encapsulamiento Día 59)
static uint32_t tiempo_ultimo_parpadeo = 0;
static bool estado_parpadeo_actual = false;

void ejecutar_alarma_visual_emergencia(void) {
    
    // Si han pasado 500 milisegundos (Medio segundo)
    if ((milisegundos_globales - tiempo_ultimo_parpadeo) >= 500) {
        
        // Invertimos el estado (Toggle)
        estado_parpadeo_actual = !estado_parpadeo_actual;
        
        // Actualizamos el hardware (BJT)
        alarma_set_estado(estado_parpadeo_actual);
        
        // Reseteamos el cronómetro
        tiempo_ultimo_parpadeo = milisegundos_globales;
    }
}


int main(void) {
    
    alarma_init_hardware();
    
    while(1) {
        
        // Integración con la FSM (Día 60)
        // Si el Guardián de Flujo (Día 52) detectó una manguera rota:
        
        if (estado_actual == ESTADO_FALLA_CRITICA) {
            
            // Este llamado NO USA DELAY. Entra, revisa el reloj, y sale instantáneamente.
            // Permitiendo que el Watchdog y otros sensores sigan respirando.
            ejecutar_alarma_visual_emergencia();
            
        } else {
            // Asegurarnos de que esté apagada en operación normal
            alarma_set_estado(false);
        }
    }
    
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Interfaz Visual de Seguridad Industrial.

Imagina que ocurre un desastre térmico o una sobrepresión (Día 53) y el STM32 manda a cortar las electroválvulas. La máquina es segura, pero los operarios en la planta embotelladora no saben que esa bomba específica está en alarma. Necesitas una interfaz visual de alto impacto.

Usando el confiable transistor BJT NPN (como el legendario 2N2222 o un TIP120 para mayor amperaje) conectado a una Resistencia de Base de 1kΩ, has creado un puente entre el mundo lógico de los microvatios y el mundo físico de los vatios. El Súper Bucle utiliza lógica de tiempo no bloqueante para hacer parpadear la torreta de 24V de forma agresiva. Tu firmware sigue girando, monitoreando la red, alimentando al Watchdog y salvando los datos, mientras el operador es alertado visualmente a 50 metros de distancia de que esa isla de despacho necesita soporte técnico.

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

1. Observa el diagrama SVG. ¿Por qué la lámpara (Torreta) está conectada "arriba" (entre los 24V y el Colector), y no "abajo" (entre el Emisor y la Tierra)?
Respuesta: Por los voltajes de encendido del transistor. Para que un NPN se active, el voltaje en la Base (3.3V) debe ser mayor (por al menos 0.7V) que el voltaje en el Emisor. Si pones la torreta abajo, el Emisor ya no está en 0V (Tierra directa), sino "flotando" sobre la torreta. El transistor NPN nunca lograría encenderse completamente porque los 3.3V del STM32 no serían suficientes para superar el voltaje de la carga. La carga en un NPN siempre va en el Colector.

2. ¿Qué ventaja tiene usar el BJT en lugar de usar un Relé mecánico (Día 33) para encender esta alarma intermitente?
Respuesta: ¡La vida útil y la velocidad! Un relé es electromecánico; si lo haces parpadear dos veces por segundo durante días, sus platinos metálicos se desgastarán por la fricción y las chispas, muriendo rápidamente. El BJT es Estado Sólido (silicio puro); no tiene piezas móviles. Puede parpadear un millón de veces por segundo durante 20 años sin sufrir ningún tipo de desgaste físico.