Torniquete con solenoide

Hola.

Ya conseguí que el circuito y el código funcionara como busco para la versión de 12v, y si bien funciona también con 14v, voy a probar con un LM317 (fue lo más parecido a la indicación de Tauro que conseguí) para evitar el recalentamiento que se genera.

Publico el programa y el esquema principalente a modo de referencia (tal vez le sea útil a alguien más), sin embargo, debo explicar que hice que el timer se ajustara por el tiempo de encendido del optoacoplador, pero en otros casos puede ser distinto.

Este es el código:

/* Programa de control de torniquete
 Desarrollado por Yohann Hernández
 Con el apoyo de tauro0221 y Surbyte (forum.arduino.cc)
 Abril de 2018 */
//***************************************************
int timer = 10000; //Timer predefinido
byte pulsador, opto;
//****************************************************
void setup()
{
       pinMode(6, INPUT);
       pinMode(13, OUTPUT);
       pinMode(5, INPUT);
       pinMode(4, INPUT);
       Serial.begin(9600);

}
//****************************************************
void loop()
{
       int x = timer / 1000;                     //Convierte el timer en segundos
       Serial.println(String("El temporizador actual es: ") + x + String(" Segundos"));
       Serial.println("Comprobando computador y pulsador...");
       pulsador = digitalRead(6);              //Lee el pulsador
       Serial.println(String("Pulsador: ") + pulsador);
       opto = digitalRead(4);                     //Lee el optoacoplador
       Serial.println(String("Computador: ") + opto);
       delay(50);
       Serial.flush();                                   //Vacía el bufer de puerto serie

       if (opto == HIGH)                            //El optoacoplador se activa segun tiempo definido en programa
       {
              Serial.println("Computador activado \nModo activación + ajuste temporizador");
              timer = 0;                                   //Pone a 0 el timer para ajustarlo
              Serial.println("Temporizador puesto a 0");
              timer = encender(0);              //Activar torniquete y ajustar timer
       }
       else if (pulsador == HIGH)              //El pulsador no depende de tiempo (1 toque)
       {
              Serial.println("Pulsador Activado \nModo Solo apertura");
              Serial.println(String("Temporizador predefinido:") + timer);
              encender(timer);                     //Activar torniquete segun timer predefinido/ajustado
       }
       digitalWrite(13, LOW);          // Apaga el mosfet
       delay(500);                                    // Espera 1/2 segundo
       Serial.println("Torniquete Desactivado");
       Serial.flush();                                   //Vacía el bufer de puerto serie
}
//*****************************************************
int encender(int tiempo)                       //Activar torniquete
                                                               //tiempo: Timer temporal
{
       byte iman = 0, com = 1;                     //Inicializa variables de concicional
       int x = 0;                                          //Inicializa timer de ciclo

       while (iman == 0 && x <= tiempo){
              digitalWrite(13, HIGH);              //Activa el mosfet
              Serial.println(String("Tiempo abierto: ") + x);
                  if (timer == 0)                            //Ajuste de timer si está en 0 (Activacion por opto)
              {
                     Serial.println("Ajustando tiempo...");
                     com = digitalRead(4);       //Lee el optoacoplador
                     Serial.println(String("Computador: ") + com);
                     tiempo += 100;                     //Modifica el temporizador
                     Serial.println(String("Tiempo: ") + tiempo);
                     if (com == 0)                     //Apaga el mosfet si el opto se apaga
                     {
                            Serial.println("Computador Desactivado");
                            break;
                     }
              }
                  iman = digitalRead(5);              //Lee el sensor de iman
              Serial.println(String("Sensor Iman: ") + iman);

              delay(100);
              x += 100;
        };
        
        if (tiempo != timer)                     //Si se modificó el timer, muestre el nuevo
        {
               float x = tiempo / 1000;       //Convierte en nuevo timer a segundos
               Serial.println(String("El nuevo temporizador es: ") + x + String(" Segundos"));
        }
        return tiempo;                                   //Retorna el timer modificado
}
//*****************************************************

Y la imagen (Ya tengo todos los pines en las posiciones de la imagen, incluyendo LPT):