Simulación de Salida de Guardamotor

⚙️ Descripción: Simulación del control de encendido y apagado de un guardamotor mediante dos enfoques: Álgebra de Boole (memorización combinacional/secuencial) y Lógica de Autómatas / Estados en Arduino.

1. Tabla de Verdad

Se consideran las entradas de control A (Pulsador de marcha / Marcha), B (Pulsador de paro / Paro) y el estado anterior de la salida GManterior:

A (Marcha) B (Paro) GManterior GMsiguiente Estado y Comentario
0 0 0 0 Reposo (Motor Apagado - Estado M1)
0 0 1 1 Mantenimiento de Marcha (Realimentación / Memoria - Estado M2)
0 1 0 0 Paro activo (Motor Apagado - Estado M1)
0 1 1 0 Acción de Paro (Transición a M1 / Motor Apagado)
1 0 0 1 Arranque / Marcha (Transición a M2 / Motor Encendido)
1 0 1 1 Mantenimiento de Marcha (Estado M2)
1 1 0 0 Predominio de Paro (Prioridad de Paro B)
1 1 1 0 Predominio de Paro (Prioridad de Paro B)

2. Funciones Lógicas

Función Canónica (Suma de Mintérminos - Sum of Products):
GM = (!A · !B · GM) + (A · !B · !GM) + (A · !B · GM)
Simplificación por Mapa de Karnaugh:
GM = (!B · GM) + (A · !B)
Simplificación por Álgebra de Boole (Factorización):
GM = !B · (GM + A)

3. Lógica de Autómatas (Estados M1 y M2)

En el diseño por autómatas finitos se definen dos estados internos:

Ecuaciones de Estado:
M1 = !M2 + (M2 · B) + (M1 · !M2)
M2 = (M1 · A) + (M2 · !M1)

4. Código Arduino

Implementación en C++ para placas Arduino leyendo las entradas digitales en los pines 28 y 26, proyectando la salida del guardamotor (GM) y el estado de Marcha (M2) en los LEDs de salida:

const int leds[] = {13,12,11,10,9,8,7,6,5};
const int entradas[] = {28,26,24,22};
const int numeroLeds = sizeof(leds) / sizeof(leds[0]);
const int numeroEntradas = sizeof(entradas) / sizeof(entradas[0]);
bool A, B, C, D;
bool GM = 0, M1 = 0, M2 = 0;

void setup()
{
  Serial.begin(115200);
  for(int i = 0; i < numeroLeds; i++){
    pinMode(leds[i], OUTPUT);
  }
  for(int i = 0; i < numeroEntradas; i++){
    pinMode(entradas[i], INPUT);
  }
}

void loop()
{
  A = digitalRead(entradas[0]); // Leo estado Pin 28 (MARCHA)
  B = digitalRead(entradas[1]); // Leo estado Pin 26 (PARADA)

  // FUNCIÓN
  GM = !A*!B*GM + A*!B*!GM + A*!B*GM;
  // Simplificada por Karnaugh: GM = !B*GM + A*!B
  // Simplificada por Álgebra Boole: GM = !B*(GM + A)

  // MEDIANTE LÓGICA DE AUTÓMATAS:
  M1 = !M2 + (M2*B) + M1*!M2; // Estado PARO / APAGADO
  M2 = M1*A + M2*!M1;         // Estado MARCHA / ENCENDIDO
  
  // SALIDA EN LOS LED 13,12
  digitalWrite(leds[0], GM); // LED Pin 13: Salida Guardamotor Booleana
  digitalWrite(leds[1], M2); // LED Pin 12: Salida Estado M2 (MARCHA)
}