01 · Especificación
Código 1010 o nada
Antes de dibujar una sola compuerta se escribe qué tiene que hacer el sistema, igual que en software se escribe primero el contrato. Nuestra cerradura:
- Entradas: un DIP switch de cuatro posiciones, S3 (el más significativo) a S0.
- Secreto: el código 1010, cableado en el circuito.
- Salidas: un LED verde («abre») que se enciende solo con el código exacto y un LED rojo («cerrado») en todos los demás casos.
- Seguridad ante fallas: si algo se rompe, se afloja o se saca del zócalo, el sistema debe quedar cerrado, nunca abierto por accidente.
- Alimentación: 5 V, dos chips de la serie 74HC (Tema 12).
Una escena típica. Armás el circuito, ponés 1010 y el verde prende. Probás un par de códigos más y todo parece bien. Lo dejás encendido, volvés al rato y el verde parpadea solo cuando tocás la placa: un interruptor sin resistencia que flota, o un cable de masa flojo. Otro día, al cambiar de 1000 a 1011, el verde destella un instante en el camino. Funcionaba «en el caso feliz» y no en los demás.
Por eso este proyecto no es solo una compuerta AND: es un recorrido por todo lo que separa un diagrama de un circuito que se puede confiar.
- ¿Qué ecuación abre la cerradura y por qué es tan chica?
- ¿Conviene comparar con XNOR o con AND más inversores?
- ¿Qué va conectado a cada pin?
- ¿Cuánto consume y cómo se baja?
- ¿Qué significa «a prueba de fallas» y cómo se logra con una resistencia?
- ¿Por qué el verde puede destellar al mover los interruptores y cómo lo evita un pulsador ENTER?
02 · Diseño
De la tabla a la ecuación
Se empieza como siempre (Tema 6): la tabla de verdad. Con cuatro entradas hay 16 filas y la salida E vale 1 en una sola, la del código 1010 (el número 10).
| S3 S2 S1 S0 | N.º | E | Verde | Rojo |
|---|---|---|---|---|
| 0000 … 1001 | 0 a 9 | 0 | apagado | encendido |
| 1010 | 10 | 1 | encendido | apagado |
| 1011 … 1111 | 11 a 15 | 0 | apagado | encendido |
Una función con un solo 1 en la tabla es un mintérmino (Tema 13): un producto en el que aparecen las cuatro variables, directas si el bit del código es 1 y negadas si es 0. No hay nada que simplificar con un mapa de Karnaugh (Tema 16): un solo 1 no se agrupa con ningún vecino.
- Por qué es una igualdad
- E vale 1 exactamente cuando cada bit de la entrada coincide con el bit del secreto. Es el comparador del Tema 25, con la ventaja de que un lado es constante y por eso no hace falta una puerta por bit.
- Qué hace cada negación
- Un bit del secreto en 0 se compara con ~S: ~S vale 1 justamente cuando S vale 0. Un bit del secreto en 1 se compara con S directamente. Así, todos los términos valen 1 solo si todas las posiciones coinciden.
- Qué hace el rojo
- El rojo es el complemento de E: se enciende en todo caso que no sea la clave. Es la lógica de «negar por defecto»: la cerradura está cerrada salvo que algo demuestre lo contrario.
- Cantidad de negaciones
- Hay una por cada cero del secreto. Con 1010 son dos (S2 y S0). Con 1111 no haría falta ninguna; con 0000 harían falta cuatro.
03 · Alternativas
Tres formas de comparar
El mismo circuito se puede armar de varias maneras y la elección depende de qué se necesita. Se comparan por cantidad de puertas y por flexibilidad:
| Variante | Puertas (incluye el rojo) | Chips | Código |
|---|---|---|---|
| AND-4 + inversores (la nuestra) | 1 AND-4 + 2 NOT + 1 NOT = 4 | 74HC21 + 74HC04 | Fijo: se cambia recableando |
| 4 XNOR + AND-4 | 4 + 1 + 1 NOT = 6 | 74HC266 (XNOR de colector abierto con pull-up) o XOR + inversores: más chips | Configurable con un segundo DIP |
| 4 XOR + NOR-4 (74HC86 + 74HC4002) | 4 XOR + 1 NOR-4 + otro NOR para el rojo = 6 | 74HC86 + 74HC4002 | Configurable; sin inversores |
| Un comparador de 4 bits (7485) | 1 chip | 74HC85 | Configurable; también dice mayor/menor |
- XOR como detector de diferencias
- A xor B vale 1 cuando los bits difieren (Tema 10). Si se hace XOR bit a bit entre el intento y el secreto, el resultado es 0000 exactamente cuando coinciden. Entonces basta un NOR de 4 entradas (vale 1 cuando todas valen 0) para obtener «igual».
- Contra una constante, menos es más
- Si el secreto no cambia, un XOR por bit es un desperdicio: con el secreto fijo, el XOR contra 1 es una conexión directa y contra 0 es un inversor. Por eso la versión fija usa solo dos NOT.
- Cuándo conviene la configurable
- Cuando el código lo tiene que poder cambiar el usuario. A cambio de más puertas y un segundo DIP, que además es la parte más débil: cualquiera ve cuál es el código mirando los interruptores.
04 · Esquema
Conexionado pin a pin
Con dos chips de 14 pines, cada conexión se puede escribir en una lista. Es el equivalente de un archivo de configuración: si está claro, el montaje sale a la primera.
| Pin | Nombre | Se conecta a |
|---|---|---|
| 1 | 1A | S3 (del DIP) |
| 2 | 1B | ~S2 (salida de un NOT del 74HC04) |
| 4 | 1C | S1 (del DIP) |
| 5 | 1D | ~S0 (salida de otro NOT) |
| 6 | 1Y = E | LED verde con 1 kΩ; entrada de un NOT (el del rojo); pull-down de 10 kΩ a GND |
| 3 y 11 | NC | Sin conexión interna |
| 9, 10, 12, 13 | 2A a 2D | A GND (la puerta sobrante no se deja al aire) |
| 14 / 7 | Vcc / GND | +5 V / masa, con 100 nF entre ambos pegado al chip |
| Pin | Función | Se conecta a |
|---|---|---|
| 1 → 2 | NOT de S2 | Entrada: S2. Salida: ~S2 (hacia el pin 2 del HC21) |
| 3 → 4 | NOT de S0 | Entrada: S0. Salida: ~S0 (hacia el pin 5 del HC21) |
| 5 → 6 | NOT del rojo | Entrada: E. Salida: ~E, hacia el LED rojo con 1 kΩ |
| 9, 11, 13 | Entradas de los NOT sobrantes | A GND |
| 14 / 7 | Vcc / GND | +5 V / masa, con 100 nF pegado al chip |
- El DIP
- Cada interruptor lleva una de sus patas a +5 V y la otra a la entrada y a una resistencia de 10 kΩ hacia masa (pull-down, Tema 11). Cerrado: la entrada ve 5 V. Abierto: la resistencia la mantiene en 0 V. Sin ella, abierto significa «flotante».
- Los LED
- Cada uno con una resistencia de 1 kΩ en serie: a 5 V y con una caída de unos 2 V, circulan unos 3 mA (Tema 29), que es visible y está dentro de lo que entrega una salida HC.
- Fail-closed de verdad
- El pull-down de 10 kΩ en E obliga a 0 si el 74HC21 se saca o se rompe: el rojo queda encendido. Y una resistencia de 100 kΩ a masa en los cables ~S2 y ~S0 evita que se lean como «1» flotante si se retira el 74HC04.
- Versión con ENTER
- Un pulsador a +5 V con 10 kΩ a masa, filtrado con 1 µF (constante de tiempo de 10 ms) y limpiado por un inversor Schmitt 74HC14 (Tema 11) entra a un AND de 2 entradas junto con E: E_final = E · ENTER. Los LED y el actuador se manejan con E_final.
- Salida hacia una cerradura real
- Un pin HC entrega pocos mA: una cerradura eléctrica o un relé se maneja con un transistor y un diodo de rueda libre en la bobina, nunca directamente desde la compuerta (Tema 29). Con un 100 nF más en la zona de carga para que el pico no reinicie la lógica.
05 · Materiales y consumo
Lista de compras y presupuesto de corriente
| Cant. | Ítem | Detalle |
|---|---|---|
| 1 | DIP switch de 4 posiciones | Un lado a +5 V, el otro a la entrada |
| 4 | Resistencia 10 kΩ | Pull-down de cada interruptor |
| 1 | 74HC21 | Doble AND de 4 entradas (se usa una) |
| 1 | 74HC04 | Seis inversores (se usan tres) |
| 1 + 1 | LED verde y rojo | Veredicto visible |
| 2 | Resistencia 1 kΩ | Una por LED |
| 1 + 2 | Resistencia 10 kΩ y 100 kΩ | Pull-down de E; pull-down de ~S2 y ~S0 |
| 2 | Condensador cerámico 100 nF | Desacople de cada chip, pegado a los pines 14 y 7 |
| 1 | Alimentación de 5 V | Fuente regulada o 4 pilas con regulador |
El consumo se calcula con el método del Tema 29: se suma lo que toma cada cosa en el peor caso. Los chips casi no consumen; mandan los interruptores cerrados (5 V sobre 10 kΩ son 0,5 mA cada uno) y el LED encendido (3 mA).
| Diseño | Interruptores | LED | Total | Autonomía |
|---|---|---|---|---|
| Base: pull-down 10 kΩ, LED 1 kΩ | 2,0 mA | 3,0 mA | ≈ 5 mA | ≈ 17 días |
| Pull-down 100 kΩ | 0,2 mA | 3,0 mA | ≈ 3,2 mA | ≈ 26 días |
| Pull-down 100 kΩ, LED 4,7 kΩ | 0,2 mA | 0,64 mA | ≈ 0,85 mA | ≈ 98 días |
Las cinco reglas del Tema 29 aplicadas aquí: Vcc estable de 5 V; desacople de 100 nF por chip; sin flotantes (pull-downs, entradas sobrantes a GND); sin peleas de salidas (cada salida maneja solo su carga); temperatura sin problema (unos mW).
06 · Puesta en marcha
Orden de pruebas y fallas conocidas
Armar todo y encender es la forma más cara de probar. Se prueba por capas, de la alimentación hacia la lógica, y en cada paso se sabe qué se espera.
- 1. Rieles y reposo
- Medir 5 V entre los pines 14 y 7 de cada chip con todo conectado. Con el DIP en 0000: E = 0, rojo encendido, verde apagado. Si el verde prende, revisar el AND y las conexiones a masa.
- 2. Cada interruptor
- Mover S0 a S3 de a uno y medir en el pin de cada entrada: 0 V o 5 V francos, nunca un valor intermedio. Un valor a mitad de camino indica un pull-down que no tira (flotante).
- 3. Los inversores
- Con S2 = 0, ~S2 debe valer 5 V; con S2 = 1, 0 V. Lo mismo para S0. Si un inversor no responde, mirar su alimentación.
- 4. Los 16 códigos
- Recorrer 0000 a 1111 y anotar: solo 1010 da verde. Es la prueba exhaustiva del Tema 6, posible porque son 16 casos. Anotar: abre 1 de 16.
- 5. Fail-closed
- Con 1010 puesto, sacar el 74HC21 del zócalo: debe quedar el rojo encendido y el verde apagado. Repetir sacando el 74HC04. Si el verde llega a prender, falta un pull-down.
- 6. Mover el DIP con calma y con prisa
- Pasar de 1000 a 1011 mirando el verde. Con un osciloscopio o un LED con memoria se ve que puede destellar al pasar por 1010 (más abajo). Con ENTER, este caso desaparece.
| Síntoma | Sospechoso |
|---|---|
| Abre con un código que no es 1010 | Un inversor mal ubicado o una entrada del AND al aire |
| Nunca abre, ni con 1010 | Un pin del AND sin conectar, o un NOT con la entrada cruzada |
| Verde y rojo débiles a la vez | Entrada flotante en un NOT o una salida cargada de más |
| Parpadea al tocar la placa | Un pull-down faltante |
| Un chip se calienta | Entrada sobrante sin atar, o salida en cortocircuito |
| Reinicios al accionar la cerradura real | Falta de desacople o de bulk en la carga |
El destello del verde: un hazard de función
Cuando se mueven dos interruptores «a la vez», nunca cambian exactamente al mismo tiempo: la entrada pasa por un código intermedio. Es el hazard de función del Tema 28. Si ese código intermedio es 1010, la salida E sube un instante y baja. Por ejemplo, de 1000 a 1011 hay que cambiar S1 y S0: si cambia primero S1, la entrada vale 1010 y el verde destella. No hay ningún término de consenso que lo evite, porque en ese instante la entrada vale la clave.
En una cerradura con un LED es una curiosidad; en una cerradura real que actúa sobre un cerrojo, sería una puerta abierta por accidente. La solución, como en el Tema 28, es no leer la salida mientras las entradas se mueven: el código se evalúa solo cuando se aprieta ENTER.
07 · Simulador
Laboratorio: la cerradura con compuertas
El simulador dibuja el circuito con sus compuertas y colorea cada cable según su valor lógico: verde lima para 1, gris para 0. Podés elegir entre dos montajes —el fijo (AND-4 e inversores, secreto 1010) y el configurable (XNOR bit a bit, con un segundo DIP para el secreto)— y entre disparo libre (la salida sigue a las entradas) o con ENTER (solo se evalúa al apretarlo).
- Interruptores: los botones S3 a S0 cambian el código de entrada; C3 a C0 cambian el secreto (en el montaje configurable).
- Resultados: el valor de E, el veredicto, la cantidad de puertas del montaje elegido y los intentos con sus fallos.
- Intentos: en disparo libre cuenta cada cambio de código; con ENTER, cada vez que se aprieta.
Cerradura con compuertas
Fijo · libre · 1010 → ABRE
Montaje fijo con disparo libre: 1010 abre.
Recorrido guiado (10 minutos)
- 1Mirá el estado inicial: 1010, montaje fijo.
S3 y S1 pasan directo; S2 y S0 pasan por un inversor, así que los cuatro cables que llegan al AND valen 1. E = 1, el verde prende y el rojo no.
- 2Cambiá S0 a 1 (código 1011).
El inversor de S0 entrega 0 y el AND pierde una entrada: E = 0. Un solo bit distinto alcanza para cerrar.
- 3Recorré a mano otros cuatro o cinco códigos.
Solo 1010 pone los cuatro cables en 1. El contador de intentos sube y los fallos también.
- 4Pasá a «Configurable (XNOR)».
Aparece la fila del secreto (C3 a C0). Cada fila tiene un XNOR que vale 1 cuando el bit de entrada coincide con el del secreto. La cantidad de puertas sube de 4 a 6.
- 5Poné el secreto en 0110 y la entrada en 0110.
Los cuatro XNOR valen 1 y el AND abre. Cambiar un bit de cualquiera de los dos lados cierra.
- 6Secreto y entrada iguales sea cual sea el valor.
Probá 0000 contra 0000 o 1111 contra 1111: abre también. El comparador es genérico; la versión fija era la barata.
- 7Activá «Con ENTER» y dejá el código correcto.
El AND de ENTER aparece al final: aunque E valga 1, la salida sigue en 0 hasta que se apriete. El verde no se enciende solo.
- 8Apretá ENTER con el código correcto.
E_final = E · ENTER vale 1 un momento: el verde prende y suma un intento acertado. Con un código incorrecto suma un fallo.
- 9Con ENTER, cambiá los interruptores sin apretar.
El rojo sigue fijo y los intentos no suben: mover el DIP ya no cuenta como probar un código, y lo que se ve en el camino no importa.
- 10Contá los fallos para abrir por fuerza bruta.
Probando códigos distintos, el peor caso son 15 fallos y el intento 16 abre. En un proyecto real habría un bloqueo después de unos pocos.
Preguntas para pensar
- Con el montaje fijo, probá 1000 y 1011. ¿Cuánto vale E en cada caso y qué bit falla?
- ¿Cuántos de los 16 códigos abren? ¿Qué implica para la seguridad?
- En el montaje configurable con secreto 0110, ¿cuántas puertas hay y qué entrada abre?
- Con ENTER, ¿qué diferencia hay entre dejar 1010 puesto y apretar?
Ver respuestas sugeridas
- E vale 0 en ambos. En 1000, S1 debería valer 1 y vale 0 (el AND recibe 0 en esa entrada); en 1011, S0 debería valer 0 y vale 1, así que su inversor entrega 0. Un bit distinto alcanza para cerrar.
- Solo uno de 16 (1010). La probabilidad de adivinar a ciegas es del 6,25 %: es un juguete didáctico, no una cerradura de seguridad. Cualquiera la abre por fuerza bruta en menos de un minuto.
- Seis (cuatro XNOR, el AND de 4 y el inversor del rojo); abre con 0110, que es igual al secreto.
- Sin apretar, E vale 1 pero E_final es 0 y el sistema sigue cerrado. Al apretar, E_final vale 1 mientras dura el pulso. Así, un código que pasa por el valor correcto mientras se está moviendo el DIP no abre nada.
08 · La cerradura en código
Gemelo digital, ataque, destellos, variantes y consumo
Los bloques reproducen el circuito en Python, para probarlo antes de armarlo: la tabla de las 16 combinaciones a nivel de compuertas, qué tan rápido cae una cerradura según los bits que tenga, cuántos movimientos de interruptor pueden destellar el verde, cuántas puertas cuesta cada variante y cuánto dura una batería con cada elección de resistencias.
Python en tu navegador. Los bloques son editables: cambiá el código secreto o los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.
Paso 1: el gemelo digital con compuertas
NOT = lambda a: 1 - a
AND4 = lambda a, b, c, d: a & b & c & d
def cerradura(s3, s2, s1, s0):
e = AND4(s3, NOT(s2), s1, NOT(s0)) # HC04 (2 NOT) + HC21 (1 AND-4)
rojo = NOT(e) # tercer NOT del HC04
return e, rojo
print("S3 S2 S1 S0 | E verde rojo")
abren = []
for n in range(16):
s3, s2, s1, s0 = (n >> 3) & 1, (n >> 2) & 1, (n >> 1) & 1, n & 1
e, rojo = cerradura(s3, s2, s1, s0)
print(f" {s3} {s2} {s1} {s0} | {e} {'ON ' if e else 'off'} {'ON ' if rojo else 'off'}")
if e:
abren.append(f"{s3}{s2}{s1}{s0}")
print()
print("abren:", abren, "->", len(abren), "de 16")
print("mintermino:", "m10 = S3 * ~S2 * S1 * ~S0 (1010 binario = 10)")
La tabla completa confirma la especificación: solo la fila 1010 pone E en 1 (verde encendido, rojo apagado); las otras 15 dejan el rojo encendido. Es la prueba exhaustiva del paso 4 de la puesta en marcha, hecha antes de tocar el protoboard.
Paso 2: fuerza bruta y cuántos bits hacen falta
print("bits combinaciones peor caso a 1 intento/s azar con 3 intentos")
for bits in (4, 8, 12, 16, 32):
comb = 2 ** bits
peor_s = comb
if peor_s < 120:
t = f"{peor_s} s"
elif peor_s < 7200:
t = f"{peor_s/60:.0f} min"
elif peor_s < 172800:
t = f"{peor_s/3600:.1f} h"
else:
t = f"{peor_s/86400:.0f} dias"
print(f"{bits:4d} {comb:13d} {t:>22s} {min(1, 3/comb):17.4%}")
print()
print("con bloqueo de 30 s tras cada 3 fallos, 4 bits (16 codigos):")
fallos = 15
espera = (fallos // 3) * 30
print(f" peor caso: {fallos} fallos + {fallos//3} bloqueos = {fallos + espera} s")
Con 4 bits se prueban todas las combinaciones en 16 segundos y se acierta al azar con 3 intentos el 18,75 % de las veces. Con 16 bits son 18 horas a un intento por segundo; con 32, 49 710 días. Un bloqueo de 30 s cada 3 fallos lleva el peor caso de 4 bits de 16 s a 165 s: ayuda, pero con 16 códigos sigue siendo un juguete.
Paso 3: cuántos movimientos pueden destellar el verde
from itertools import permutations
SECRETO = 0b1010
def intermedias(a, b):
cambian = [i for i in range(4) if ((a ^ b) >> i) & 1]
vistas = set()
for orden in permutations(cambian):
x = a
for i in orden[:-1]:
x ^= 1 << i
vistas.add(x)
return vistas
pares = [(a, b) for a in range(16) for b in range(16) if a != b and b != SECRETO and a != SECRETO]
con_destello = [(a, b) for a, b in pares if SECRETO in intermedias(a, b)]
print(f"transiciones entre codigos distintos de 1010: {len(pares)}")
print(f"las que pueden dar un destello verde en el camino: {len(con_destello)}")
for a, b in ((0b1000, 0b1011), (0b1110, 0b1011), (0b0000, 0b1111), (0b0001, 0b1001)):
print(f" {a:04b} -> {b:04b}: puede pasar por 1010? {SECRETO in intermedias(a, b)}")
print()
print("el pulsador ENTER lo evita: la cerradura solo se evalua al apretar, con el codigo ya asentado")
De 210 transiciones entre códigos distintos de 1010, 50 pueden pasar por 1010 en el camino (casi una de cada cuatro). De 1000 a 1011, de 1110 a 1011 y de 0000 a 1111 es posible; de 0001 a 1001 (un solo bit cambia) no. Mover varios interruptores a la vez es un hazard de función, y se arregla leyendo solo al apretar ENTER.
Paso 4: cuánto cuesta cada variante
def fijo(codigo):
unos = bin(codigo).count("1")
return {"NOT para entradas": 4 - unos, "AND-4": 1, "rojo (NOT)": 1}
def configurable():
return {"XOR (HC86)": 4, "NOR-4 (HC4002)": 1, "rojo (otro NOR del HC4002)": 1}
for nombre, cod in (("1010", 0b1010), ("1111", 0b1111), ("0000", 0b0000)):
d = fijo(cod)
print(f"fijo {nombre}: {d} -> {sum(d.values())} puertas")
d = configurable()
print(f"configurable: {d} -> {sum(d.values())} puertas, 2 DIP")
print()
secret, intento = 0b0110, 0b0110
difiere = secret ^ intento
print("comparador por XOR: bits distintos =", f"{difiere:04b}", "-> abre" if difiere == 0 else "-> cerrado")
for intento in (0b0110, 0b0111, 0b1110):
difiere = secret ^ intento
print(f" secreto {secret:04b} intento {intento:04b}: XOR = {difiere:04b} -> NOR4 = {int(difiere == 0)}")
La versión fija de 1010 tiene 4 puertas (2 NOT de entrada, el AND-4 y el NOT del rojo); la de 1111 solo 2, y la de 0000 llega a 6. La configurable tiene siempre 6 más un segundo DIP. El XOR entre intento y secreto da 0000 solo cuando coinciden, y un NOR de 4 entradas lo convierte en «igual».
Paso 5: presupuesto de corriente y autonomía
VCC = 5.0
def presupuesto(r_pull_k=10.0, r_led_k=1.0, v_led=2.0, interruptores_cerrados=4, chips=2, i_chip_ua=5.0):
i_sw = interruptores_cerrados * VCC / r_pull_k # mA
i_led = (VCC - v_led) / r_led_k # mA, un solo LED a la vez
i_ics = chips * i_chip_ua / 1000 # mA
return i_sw, i_led, i_ics
def autonomia_h(i_ma, mah=2000.0):
return mah / i_ma
print("diseno I switches I LED I chips total autonomia")
for nombre, kw in (("base: pull 10k, LED 1k", {}),
("pull 100k", {"r_pull_k": 100.0}),
("pull 100k, LED 4,7k", {"r_pull_k": 100.0, "r_led_k": 4.7}),
("DIP todo abierto (0000)", {"interruptores_cerrados": 0})):
a, b, c = presupuesto(**kw)
tot = a + b + c
h = autonomia_h(tot)
print(f"{nombre:26s} {a:7.2f} mA {b:6.2f} {c:8.3f} {tot:6.2f} mA {h:7.0f} h ({h/24:.0f} d)")
print()
r_led = (VCC - 2.0) / 0.004
print(f"R minima para 4 mA por pin: {r_led:.0f} ohm -> usamos 1 kohm: {(VCC-2.0)/1.0:.1f} mA (margen bajo el limite del HC)")
El diseño base toma unos 5 mA (con los cuatro interruptores cerrados) y 2000 mAh duran 17 días. Con pull-downs de 100 kΩ pasa a 3,2 mA y con un LED de 4,7 kΩ a 0,85 mA: 98 días. La resistencia mínima para no pasar de 4 mA por pin es de 750 Ω; con 1 kΩ quedan 3 mA, dentro del límite.
09 · Analogía de programador
Allowlist, deny-by-default y commit
| En software | En la cerradura |
|---|---|
| Una allowlist con un único valor permitido | El mintérmino: una sola fila de la tabla vale 1 |
return a == b sobre cuatro campos, con AND entre todos | La igualdad cableada: un bit distinto cierra |
| Un secreto embebido en el código (hard-coded) | El código cableado; cambiarlo exige recablear |
| Un parámetro leído de configuración | La versión con XNOR y un segundo DIP |
| Deny by default en un firewall | Rojo salvo que E = 1; pull-down en E |
| Un manejo de error que cae en el estado seguro (fail-closed) | Si un chip falta, el sistema queda cerrado |
| Un ataque de fuerza bruta contra un PIN corto | 16 combinaciones: se prueban en segundos |
| Un rate limit o bloqueo tras N intentos | El contador de fallos que bloquea un rato |
| Leer una estructura mientras otro hilo la actualiza (torn read) | Leer la salida mientras se mueven varios interruptores: el destello |
| Un commit: nada se aplica hasta confirmar | ENTER: el código se evalúa solo al apretar |
| Un debounce del evento de un botón | RC más Schmitt en el pulsador |
| Un test exhaustivo de una función con pocos casos | Recorrer los 16 códigos en el banco |
- 1Especificar antes de construir.
La tabla de verdad es el contrato: 16 filas, una vale 1. Todo lo demás se verifica contra ella, igual que un test contra una especificación.
- 2El estado seguro por defecto es una decisión de diseño.
No sale solo: hay que agregar los pull-downs que lo garantizan. Es el equivalente de decidir qué hace el sistema cuando se cae un servicio.
- 3Separar «preparar» de «confirmar».
Mover el DIP es editar un borrador; ENTER es el commit. Mientras se edita, el estado intermedio no tiene por qué producir efectos.
Una diferencia con el software: acá no se puede «parchear» una cerradura desplegada. Un error de diseño que se descubre después implica abrir la caja, y por eso se prueba todo antes y se piensan las fallas de antemano.
10 · Comprensión
Confusiones frecuentes
«XNOR para todo»
Contra una constante, AND con inversores usa menos puertas que cuatro XNOR más un AND. El comparador genérico solo vale la pena si el secreto tiene que poder cambiar.
«El DIP no necesita resistencias»
Un interruptor abierto no es un 0: es un cable al aire. Sin pull-down, la entrada capta ruido, la mano cambia el código y el chip puede consumir de más. Una resistencia por interruptor, sin excepción.
«El LED no necesita resistencia»
Un LED sin resistencia pide toda la corriente que la salida pueda dar: se quema el LED, se daña la compuerta o ambos. Con 5 V y 1 kΩ circulan unos 3 mA, visibles y seguros.
«El rojo es ~E y con eso ya es a prueba de fallas»
Si el chip del AND falta, E queda al aire y puede valer cualquier cosa. El fail-closed lo da el pull-down que obliga E a 0. El rojo solo informa; la seguridad es lo que se cablea en la salida.
«Si funciona con cada código, está listo»
Probar los 16 códigos de a uno no prueba el movimiento: pasar de un código a otro cambiando varios interruptores puede cruzar 1010 y destellar. Se evita evaluando solo con ENTER.
«El pulsador se conecta directo»
El contacto rebota (Tema 11): sin RC y Schmitt, un solo apretón se lee como varios. En esta cerradura sería un destello extra; en un contador, intentos de más.
«La compuerta puede mover el cerrojo»
Un pin HC entrega pocos miliamperios. Una cerradura eléctrica o un relé se maneja con un transistor, un diodo de rueda libre y su propio desacople. Si no, el pico reinicia la lógica o daña el chip.
«Es segura»
Cuatro bits son 16 combinaciones, que se prueban en segundos. Es una demostración de la igualdad cableada, no un producto de seguridad; la seguridad real exige más bits, límite de intentos y otras defensas.
11 · Práctica guiada
Ejercicios de cerradura
Ejercicio 1: otro código
Cambiá el secreto a 0110. Escribí la ecuación, indicá cuántos inversores y en qué entradas hacen falta, y qué pines del 74HC21 cambian. Verificalo con el Paso 1.
Ver solución razonada
E = ~S3 · S2 · S1 · ~S0. Los ceros del secreto son S3 y S0, así que se invierten esas dos entradas (en vez de S2 y S0). El 74HC21 no cambia de pines: la entrada 1A recibe ~S3, 1B recibe S2, 1C recibe S1 y 1D recibe ~S0. Cambian los cables que van a los inversores. En el Paso 1, el AND4 debe quedar como AND4(NOT(s3), s2, s1, NOT(s0)).
Ejercicio 2: código configurable
Diseñá la versión con un segundo DIP para el secreto usando 74HC86 y 74HC4002. ¿Cuántos chips y cuántas puertas? ¿Cuál es la ventaja y cuál el problema?
Ver solución razonada
Cuatro XOR entre la entrada y el secreto (un 74HC86 completo) y un NOR de 4 entradas (una mitad del 74HC4002): la salida vale 1 solo si todos los XOR valen 0, o sea si hay igualdad. La otra mitad del 74HC4002, con las cuatro entradas unidas, sirve de inversor para el rojo. Son 2 chips y 6 puertas. Ventaja: el código se cambia sin recablear. Problema: el segundo DIP deja a la vista el código, y hacen falta ocho pull-downs en lugar de cuatro.
Ejercicio 3: el pulsador ENTER
Agregá un pulsador ENTER para que la cerradura solo abra al apretarlo. ¿Qué compuerta hace falta? ¿Por qué RC y Schmitt? Con 10 kΩ y 1 µF, ¿cuánto vale la constante de tiempo y para qué sirve?
Ver solución razonada
Un AND de 2 entradas: E_final = E · ENTER (sobra una mitad del 74HC21 o se usa un 74HC08). El contacto del pulsador rebota unos milisegundos (Tema 11): sin filtro, el AND vería varios apretones. El RC alisa los rebotes: τ = 10 kΩ × 1 µF = 10 ms, del orden de lo que dura el rebote. Como el RC deja un flanco lento, el inversor Schmitt 74HC14 lo convierte en una transición limpia sin oscilar en la zona intermedia (y evita corriente de cortocircuito, Tema 29). Atención: el 74HC14 invierte; hay que contarlo o usar dos.
Ejercicio 4: ¿puede destellar?
¿Puede el verde destellar al pasar de 1000 a 1011? ¿Y de 0001 a 1001? Dá una regla general para saber si una transición puede pasar por el secreto.
Ver solución razonada
De 1000 a 1011 cambian S1 y S0: si cambia primero S1, la entrada vale 1010 un instante: sí puede destellar. De 0001 a 1001 solo cambia S3: no hay código intermedio, no. Regla: el secreto puede ser un intermedio cuando coincide con el origen y el destino en todos los bits que no cambian, y en los que cambian tiene un valor cualquiera de los dos extremos. Con un solo bit cambiando nunca hay intermedios. En el programa del Paso 3 son 50 de 210 transiciones.
Ejercicio 5: un LED para los dos colores
Con un 74HC20 (doble NAND de 4 entradas) en lugar del AND-4, el rojo sale directo de la compuerta. ¿Cómo se conectan los dos LED a la misma salida para ahorrar el tercer inversor?
Ver solución razonada
La salida del NAND es ~E. El LED rojo va de la salida a masa con 1 kΩ: se enciende cuando la salida vale 1 (~E = 1, cerrado). El LED verde va de +5 V a la salida con 1 kΩ: se enciende cuando la salida vale 0 (E = 1), con la compuerta absorbiendo unos 3 mA, dentro de los 4 mA que garantiza el HC. Las puertas bajan a 3 (un NAND-4 y dos inversores) sin cambiar la cantidad de chips. Atención: el fail-closed cambia; con el NAND ausente la salida flota y ambos LED quedan apagados, así que conviene un pull-up en la salida para que, ante falla, quede en 1 (rojo).
Ejercicio 6: presupuesto de pilas
Con las pilas de 2000 mAh, una cerradura con pull-down de 100 kΩ y LED de 4,7 kΩ toma 0,85 mA. ¿Cuánto dura? ¿Qué cambiarías para que dure un año?
Ver solución razonada
2000 / 0,85 ≈ 2350 h, unos 98 días. Para un año, la corriente media tendría que ser de 2000 / 8760 ≈ 0,23 mA. Los LED encendidos casi siempre son lo que más pesa (0,64 mA): se encienden solo durante unos segundos al apretar ENTER, o se pasan a pulsos cortos, o la placa se alimenta solo al apretar un botón. El resto (0,2 mA de interruptores) baja con pull-downs de 1 MΩ si el ruido lo permite, o con interruptores que solo se alimentan al leer.
12 · Síntesis
Ideas para recordar
- Se especifica primero (tabla de verdad y requisitos) y se construye después. La cerradura es un mintérmino: una fila de 16 vale 1.
- E = S3·~S2·S1·~S0: contra una constante, un AND más un inversor por cada cero del secreto. El rojo es ~E.
- XNOR o XOR+NOR sirven para códigos configurables, a cambio de más puertas y de un segundo DIP; la versión fija es la más barata.
- Cada entrada de un interruptor lleva un pull-down; cada LED, su resistencia; cada chip, su 100 nF; las puertas sobrantes, a masa.
- Fail-closed se cablea: un pull-down en E y en las señales invertidas obliga al estado cerrado si falta un chip.
- Mover varios interruptores genera un hazard de función que puede destellar el verde; la solución es evaluar solo al apretar ENTER, con anti-rebote (RC más Schmitt).
- Cuatro bits son 16 combinaciones: una demostración, no un sistema de seguridad. Más bits y límite de intentos son lo que importa.
- Probar por capas: alimentación, interruptores, inversores, los 16 códigos y las fallas.
¿Listo para el Tema 31?
Podés avanzar si sos capaz de hacer esto sin mirar:
- Escribir la ecuación de apertura para cualquier código de 4 bits y decir cuántos inversores hacen falta.
- Elegir entre AND con inversores, XNOR y un comparador integrado según si el código cambia.
- Conectar de memoria los pines relevantes del 74HC21 y del 74HC04 de este montaje.
- Calcular el consumo y la autonomía con la resistencia del LED y del pull-down.
- Explicar por qué el verde puede destellar al mover el DIP y cómo lo soluciona ENTER.
- Nombrar tres puntos donde la cerradura es insegura aun cuando la lógica es correcta.
Con una cerradura completa, el siguiente paso es cambiar de problema: en el próximo tema armamos una calculadora de 4 bits con sumador, display de siete segmentos y las mismas prácticas de este proyecto.