Un microcontrolador opera a 3.3V y puede entregar como máximo 20mA por pin. Las bobinas de los relés industriales y los contactores requieren mucha más corriente y generan picos de voltaje inverso (Flyback) de cientos de voltios al apagarse. Conectar un pin GPIO directamente a un relé freirá el procesador instantáneamente. La solución industrial es un Optoacoplador (separación por luz) que active un Transistor (MOSFET/BJT), acompañado obligatoriamente de un diodo de rueda libre (Flyback Diode) en paralelo a la bobina del relé.
Incluso si el hardware es invulnerable, el software puede cometer un error humano. Si el código dice "Encender Bomba", el hardware obedecerá ciegamente. En sistemas de alto riesgo, implementamos una Matriz de Seguridad (Safety Matrix) antes del driver del GPIO. Es un bloque de condiciones lógicas que actúa como un guardián: evalúa el estado global del sistema y veta cualquier combinación peligrosa antes de alterar los registros físicos.
Ejercicio 1: Construiremos la función de control de salidas. Utilizaremos enmascaramiento de bits (Bitwise AND/OR) para modificar los registros del hardware, pero solo si la solicitud supera las reglas lógicas de nuestra matriz de seguridad.
#include <stdint.h>
#include <stdbool.h>
// --- 1. MÁSCARAS DE HARDWARE (STM32/NXP) ---
// Apuntador directo a la memoria del Output Data Register del Puerto A
#define GPIOA_ODR (*((volatile uint32_t *)0x40020014))
#define PIN_VALVULA_GAS (1 << 1) // PA1
#define PIN_BOMBA_MOTOR (1 << 2) // PA2
// --- 2. EL GUARDIÁN: MATRIZ DE SEGURIDAD ---
/**
* @brief Evalúa lógicamente si los estados solicitados son seguros físicos.
* @param req_valvula True si se desea abrir la electroválvula.
* @param req_bomba True si se desea encender la bomba.
* @return True si la combinación es segura, False si es un peligro.
*/
bool Seguridad_Validar_Interlock(bool req_valvula, bool req_bomba) {
// REGLA CRÍTICA 1: Interlock Hidráulico
// NUNCA encender la bomba si la válvula está cerrada (Riesgo de sobrepresión).
if (req_bomba == true && req_valvula == false) {
return false; // Peligro inminente
}
// REGLA CRÍTICA 2: Estado Seguro por defecto
// Apagar todo siempre es seguro.
if (req_bomba == false && req_valvula == false) {
return true;
}
// REGLA 3: Despacho normal (Ambas activas) es válido.
if (req_bomba == true && req_valvula == true) {
return true;
}
// Válvula abierta sin bomba (Purga/Gravedad) es válido.
return true;
}
// --- 3. DRIVER DE ACTUADORES ---
void Actuadores_Actualizar(bool req_valvula, bool req_bomba) {
// 1. Filtrar a través de la matriz
if (!Seguridad_Validar_Interlock(req_valvula, req_bomba)) {
// En caso de interlock fallido, forzamos el Estado Seguro (Apagar todo)
req_valvula = false;
req_bomba = false;
// Podríamos disparar un evento de falla en nuestra Matriz FSM (Día 31) aquí.
}
// 2. Ejecutar sobre los registros físicos (Bitwise Operations)
// Válvula
if (req_valvula) {
GPIOA_ODR |= PIN_VALVULA_GAS; // Set bit (Activar 3.3V)
} else {
GPIOA_ODR &= ~PIN_VALVULA_GAS; // Clear bit (0V)
}
// Bomba
if (req_bomba) {
GPIOA_ODR |= PIN_BOMBA_MOTOR;
} else {
GPIOA_ODR &= ~PIN_BOMBA_MOTOR;
}
}
Objetivo del día: Control de Potencia con Interlocking por Software.
Tus microcontroladores no pueden confiar ni siquiera en su propia lógica superior (la Matriz de Estados). Si por algún error cósmico (EMI, corrupción de pila, o un bug en un estado asíncrono) tu Súper Bucle le pide al hardware encender la bomba con la tubería cerrada, tu Matriz de Seguridad interceptará la instrucción en el último nanosegundo. Esta función Seguridad_Validar_Interlock actúa como un "perro guardián" (Watchdog lógico) justo antes de que el voltaje llegue a los pines. Sumado al diseño con Optoacopladores, tu Despachador está blindado contra explosiones de software y cortocircuitos de hardware.