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):
Hi,
Felitaciones por haber terminado tu projecto. Espero que estos problemas que resolviste te ayuden en un futuro cercano en un nuevo projecto.
Para final una sugerencia y es la que muevas los cables de senal de entrada para los contactos despues de los LEDs. La razon es que dependiendo de los colores de lo LEDs es el voltaje de caida atraves del LED.Solamente una sugerencia.
Corrección del esquema:
La resistencia de LPT al opto no es de 10K sino de 1K (ya modifiqué la imagen).
Moderador:
No entiendo porque abriste este hilo?
Tiene continuidad con el hilo mencionado de modo que tendré que unirlos.
[Editado-Unido desde otro post]
Me surgió una duda mas bien importante: en el proyecto uso un optoacoplador para activar el pin 4 del arduino con el pin 2 del LPT y tengo código escrito que responde al tiempo que ese pin se active (si se activa) encendiendo el led del pin 13, pero al iniciar el computador se mantienen encendidos todos los pines hasta que alguien utilice el programa, luego de lo cual se apagan todos hasta nueva orden. Uso el opto para asegurarme que el voltaje que llega al pin 4 sea constante y suficiente.
Lo que busco es que si activo el pulsador antes de arrancar por primera vez el programa, el arduino use el timer por defecto de 10 segundos, y cada vez que se active desde el programa, se ajuste un timer personalizado; pero el hecho de tener encendidos todos los pines desde el principio desbarata esa intención.
Se que sería posible mandar un cable del pin 3 de LPT al arduino y ponerlo a revisar si está activado para que no ajuste el timer ni encienda el pin 13, pero me preocupa que detecte antes el pin del opto y me quede un timer de 100ms o algo así (algo similar he visto en pruebas con varios pines e intentos de códigos y tiempos); por lo que creo sería más rápido usar el LPT 3 como control o "pulsador", y si se prende a la vez con el LPT 2, no llegue voltaje al opto y no envie la señal al arduino.
La idea sería evitar el uso de componentes más complejos que las resistencias en la medida de lo posible y saber a grandes rasgos cómo podría funcionar un montaje así.
Lamento las molestias por la fusión, tendré cuidado la próxima :-[
Mil gracias por el apoyo 
Se que sería posible mandar un cable del pin 3 de LPT al arduino y ponerlo a revisar si está activado para que no ajuste el timer ni encienda el pin 13, pero me preocupa que detecte antes el pin del opto y me quede un timer de 100ms
Claro que es posible. No hay problema en hacerlo. Los niveles de salida del LPT son TTL 0-5V como los de tu arduino asi queno hay problema Entre GND y el pin 3 del LPT puedes monitorearlo como una señal digital entrante.
Indica las variables que usarías para tal tarea y con gusto te ayudamos.
Hola.
En el código que ya tengo, lo que se afecta con ese pin es la primera sección del loop, aquí es donde tengo que asegurarme que no lea el pin 2 si el 3 está activo; esto es lo que se me ocurre:
int timer = 10000; //Timer predefinido
byte pulsador, opto, pin3;
//****************************************************
void setup()
{
pinMode(6, INPUT);
pinMode(13, OUTPUT);
pinMode(5, INPUT);
pinMode(4, INPUT);
pinMode(3, INPUT); //Para mayor facilidad, el mismo numero
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);
pin3 = digitalRead(3); //Lee el pin 3
Serial.println(String("Pin 3: ") + pin3);
opto = digitalRead(4); //Lee el optoacoplador
Serial.println(String("Computador: ") + opto);
pin3 = digitalRead(3); //Lee (de nuevo) el pin 3
Serial.println(String("Pin 3: ") + pin3);
delay(50);
Serial.flush(); //Vacía el bufer de puerto serie
if (pin3 == 0) //modifica el tiempo solo si el pin3 está desactivado
{
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
}
}
//...
}
Ahora bien, en este momento tengo el pin 2 de LPT conectado por medio del optoacoplador, según lo que me dices, se podría obviar (en especial porque no tiene sentido que un pin lo use y el otro no), pero no veo como lo conectaría directo sin generar problemas por la conexión a tierra (no se si exista esa posibilidad).
Hi,
La resistencia R4 esta muy alta. Bajala por lo menos a 600 ohmios. Eso si el voltaje del pin de la salida del printer es 5 voltios. Tu quires que la base del transitor del opto este en saturacion. La max corriente del opto es de 50ma.
Desde ya que no puedesusar una R de 10K para exitar ese LED. Será de 1k al menos.
En principio si quieres usar optos puedes poner otro opto. Que vea el estado del pin que mencionas 2 y 3. Y los lees como entradas como lo estas haciendo o prescinde del opto y lo lees directo. Hablo de ambos, no de uno solo.
Hola.
Gracias a los 2 por fijarse, olvidé actualizar esta imagen :o , en el post anterior ya lo había hecho... La R4 (y todas las que van solo para proteger un led) las tengo a 1k, las unicas a 10k son pullup o pulldown.
EDIT: Ya corregí la imagen.
Hola.
Para la conexión se me ocurre esto... ¿Está correcto?
Gracias 
No. Eso ahora no sirve y ademas es imposible responderte del modo que has dibujado.
Please adjunta el archivo (creo que debes comprimirlo con .zip para subirlo) para que yo lo modifique y lo hagamos de la manera que corresponde.
Hola.
Este es el archivo que estoy trabajando en Fritzing.
La version 3.8 utiliza todavia el opto, la 3.9 es de la que saqué la captura de arriba.
Gracias 
talanquerasV3.8.zip (24.8 KB)
talanquerasV3.9.zip (24.6 KB)
einsteinyh:
Hola.
Este es el archivo que estoy trabajando en Fritzing.
La version 3.8 utiliza todavia el opto, la 3.9 es de la que saqué la captura de arriba.
Gracias 
Hola.
Estoy modificando todo el dibujo según las indicaciones que me diste. Voy (creo) por la mitad, de todad maneras era necesario ya que tengo que hacer una versión con fuente de 14v y LM317 en vez de 7805. También estoy poniendo los leds de LPT a tierra del mismo LPT.
Hola.
Ya modifiqué el esquema tratando de hacerlo más acorde al estándar, Los pines LPT van a tierra del LPT y eliminé el opto definitivamente. Te agradezco cualquier comentario 
talanquerasV4.0.0.zip (25.3 KB)
Muy bien tu esquema general!!! Felicitaciones. Ves como cambia ahora que las cosas estas ubicadas como te indiqué!
Reviso el que me has pasado.
Archivo revisado.
No me gustan varias cosas.
-
A la izquierda esta la fuente que tu dibujas como AC pones un diodo hacia GND no se para que, tal vez rectificar en media onda. Pero luego el filtrado es pobre con un capacitor de 0.47mF supongo que son miliFaradios? o quisiste poner uF microFaradios?
-
Lo que menos me gusta. Son la forma en que diodos resistencias y pulsadores/switches han sido conectados.
Para mi gusto eso puede traer un problema con la detección del nivel Bajo ya que algunos LED tiene un Vd alto. Pero de por si tienen uno alrededor de 1.5V
Asi que cuando tu presionas el switch hay 1.5V en la entrada digital del Arduino.
El nivel bajo máximo es de 0.8V y tu le estas conectando 1.5V entonces que responde esa entrada depende de como se levante el arduino.
Te invito a que leas esto

TTL Logic Levels
A majority of systems we use rely on 5 V TTL Logic Levels. TTL is an acronym for Transistor-Transistor Logic. It relies on circuits built from bipolar transistors to achieve switching and maintain logic states. Transistors are basically fancy-speak for electrically controlled switches. For any logic family, there are a number of threshold voltage levels to know:
VOH – Minimum OUTPUT Voltage level a TTL device will provide for a HIGH signal.
VIH – Minimum INPUT Voltage level to be considered a HIGH.
VOL – Maximum OUTPUT Voltage level a device will provide for a LOW signal.
VIL – Maximum INPUT Voltage level to still be considered a LOW.
y a continuacion miras o lees esto

Cual es el valor de entrada esperable? Máximo pues 0.8V
Si tu led tiene un Vd de 1.5 estas muy por encima en la zona indefinida.
Entonces esos led y resistencias estan mal tmb.
- Como verás he modificado tu conexión al LPT porque claro sigues con el criterio del punto 2.
He unido GND del LPT con GND del Arduino de lo contrario jamás se entera que hay algo conectado.
talanquerasV4.0.0.zip (25.4 KB)
Hi,
Ahora los LED's estan correctamente conectados con los switches. Vuelvo a preguntar el porque de la resistencia de 10K. Surbyte te aconsejo usar una de 1K. Posiblemente sean de 1k pero tienes que tener un poco de cuidado reportando cuando hagas cambios.
Hola.
En este caso, las resistencias si están correctamente representadas a 10K, las puse con ese valor extrapolando a los pulsadores este comentario tuyo (puedes ver el cambio en los 2 post siguientes) y las mantuve porque funcionaron con el prototipo, si bien las led no encendían mucho. ¿Que valor me recomendarías entonces? he visto que es conveniente un valor entre 6.8k y 10k pero ahora me dejas la duda.
Gracias 
Hi,
Surbyte te sugerio una de 1K eso te va producir una corriente de .005 amp. Yo simpre uso una de 500 ohmios y te va dar un corriente de .010 amperios.