Hola!
Angel millán es un profe de tecnología en un Instituto de Sevilla. Me ha preguntado por privado cómo se podría hacer un circuito que abriese una puerta/caja fuerte al introducir una secuencia por los dos pulsadores de la Icezum Alhambra. Me ha parecido interesante comentarlo en el grupo. El planteamiento del problema, en palabras de Angel, sería este
·
El planteamiento sería el siguiente:
- Disponemos de dos
pulsadores (A y B), por ejemplo, y un servomotor (que iría instalado,
por ejemplo, en la cerradura de una puerta o una caja fuerte.
-
Pretendo que el servo se active después de que se introduzca una
"clave" con una secuencia concreta de pulsaciones de A y B. Por ejemplo:
AB, AAB, AABA ó AABAB (la que se fije de antemano).
- El servo debería permanecer girado un tiempo tras la activación y volver a su posición de reposo pasado ese tiempo.
·
La solución que se me ocurre es dividir el problema conceptualmente en dos circuitos:
1) El primero es el que detecta la secuencia que abre la puerta/caja. Por ejemplo AAB. Cuando la detecta, activa una señal de OK
2) Un segundo circuito que mueve el servo y lo deja en una posición durante un tiempo, y luego vuelve a la de reposo
El circuito 2 es sencillo. Basta con conectar un bloque temporizador a un servo. Este temporizador se activa con la señal de clave ok
El circuito 1 es un autónoma finito. Esto siempre es tedioso de implementar con puertas lógicas. En verilog se resuelve muy fácil, pero claro, hay que saber Verilog. La solución que yo he usado es usar una memoria como circuito combinacional para calcular el siguiente estado a partir del estado actual y las entradas
Mi solución en Icestudio es la que adjunto en el .zip, junto a un pantallazo .png
La memoria es de 16 posiciones y en cada una se almacenan 2 bits. Estoy implementando un autómata finitio de 4 estados, para detectar la secuencia AAB (A=pulsador 1, B = pulsador 2). La memoria la tengo dividida conceptualmente en 4 bloques de 4 posiciones. Cada bloque se corresponde a un estado del autómata. Dentro de cada bloque se almacena el número del estado siguiente correspondiente a los 4 casos de los pulsadores. Así, la posición 0 contiene el siguiente estado cuando estamos en el estado 0 y no hay ningún pulsador pulsado. La posición 1 contiene el siguiente estado cuando estamos en el estado 0 y el pulsador B está pulsado, pero el A No lo está.... y así con todos
El contenido de la memoria se lee del fichero autom1.list:
0 // 0
0 // 1
1 // 2
0 // 3
1 // 4 ---------
0 // 5
2 // 6
0 // 7
2 // 8 ---------
3 // 9
0 // 10
0 // 11
0 // 12 ---------
0 // 13
0 // 14
0 // 15
Cambiando los números de la primera columan, modificamos el autómata
Saludos, Obijuan