Electrónica Digital · Tema 30

Proyecto: cerradura digital

Es el primer proyecto completo del curso: cuatro interruptores, un código secreto y dos LED, sin microcontrolador ni reloj. Todo lo que viste se junta en un circuito de dos chips: tablas de verdad para especificar, álgebra para simplificar, compuertas para construir, pull-downs y desacople para que funcione de verdad, y glitches y rebotes para entender por qué mover un interruptor no es un evento limpio.

≈ 75 minutos Se puede armar en un protoboard Incluye simulador con compuertas y Python

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).

Tabla de verdad de la apertura: solo la fila 10 vale 1.
S3 S2 S1 S0N.ºEVerdeRojo
0000 … 10010 a 90apagadoencendido
1010101encendidoapagado
1011 … 111111 a 150apagadoencendido

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.
DIP → NOT en S2 y S0 →AND-4 → E →verde; ~E → rojo

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:

Comparar cuatro bits contra un secreto: variantes.
VariantePuertas (incluye el rojo)ChipsCódigo
AND-4 + inversores (la nuestra)1 AND-4 + 2 NOT + 1 NOT = 474HC21 + 74HC04Fijo: se cambia recableando
4 XNOR + AND-44 + 1 + 1 NOT = 674HC266 (XNOR de colector abierto con pull-up) o XOR + inversores: más chipsConfigurable con un segundo DIP
4 XOR + NOR-4 (74HC86 + 74HC4002)4 XOR + 1 NOR-4 + otro NOR para el rojo = 674HC86 + 74HC4002Configurable; sin inversores
Un comparador de 4 bits (7485)1 chip74HC85Configurable; 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.

Conexiones del 74HC21 (doble AND de 4 entradas; se usa la mitad).
PinNombreSe conecta a
11AS3 (del DIP)
21B~S2 (salida de un NOT del 74HC04)
41CS1 (del DIP)
51D~S0 (salida de otro NOT)
61Y = ELED verde con 1 kΩ; entrada de un NOT (el del rojo); pull-down de 10 kΩ a GND
3 y 11NCSin conexión interna
9, 10, 12, 132A a 2DA GND (la puerta sobrante no se deja al aire)
14 / 7Vcc / GND+5 V / masa, con 100 nF entre ambos pegado al chip
Conexiones del 74HC04 (seis inversores; se usan tres).
PinFunciónSe conecta a
1 → 2NOT de S2Entrada: S2. Salida: ~S2 (hacia el pin 2 del HC21)
3 → 4NOT de S0Entrada: S0. Salida: ~S0 (hacia el pin 5 del HC21)
5 → 6NOT del rojoEntrada: E. Salida: ~E, hacia el LED rojo con 1 kΩ
9, 11, 13Entradas de los NOT sobrantesA GND
14 / 7Vcc / 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

Lista de materiales (BOM). Todo barato y de valores estándar E12.
Cant.ÍtemDetalle
1DIP switch de 4 posicionesUn lado a +5 V, el otro a la entrada
4Resistencia 10 kΩPull-down de cada interruptor
174HC21Doble AND de 4 entradas (se usa una)
174HC04Seis inversores (se usan tres)
1 + 1LED verde y rojoVeredicto visible
2Resistencia 1 kΩUna por LED
1 + 2Resistencia 10 kΩ y 100 kΩPull-down de E; pull-down de ~S2 y ~S0
2Condensador cerámico 100 nFDesacople de cada chip, pegado a los pines 14 y 7
1Alimentación de 5 VFuente 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).

Presupuesto de corriente con 2000 mAh de pilas (un solo LED encendido a la vez).
DiseñoInterruptoresLEDTotalAutonomía
Base: pull-down 10 kΩ, LED 1 kΩ2,0 mA3,0 mA≈ 5 mA≈ 17 días
Pull-down 100 kΩ0,2 mA3,0 mA≈ 3,2 mA≈ 26 días
Pull-down 100 kΩ, LED 4,7 kΩ0,2 mA0,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.
De síntoma a causa en esta placa.
SíntomaSospechoso
Abre con un código que no es 1010Un inversor mal ubicado o una entrada del AND al aire
Nunca abre, ni con 1010Un pin del AND sin conectar, o un NOT con la entrada cruzada
Verde y rojo débiles a la vezEntrada flotante en un NOT o una salida cargada de más
Parpadea al tocar la placaUn pull-down faltante
Un chip se calientaEntrada sobrante sin atar, o salida en cortocircuito
Reinicios al accionar la cerradura realFalta 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.
SIMULADOR 30

Cerradura con compuertas

Fijo · libre · 1010 → ABRE

Circuito de la cerradura digital Los cuatro interruptores de entrada pasan por inversores o compuertas XNOR hacia un AND de cuatro entradas; opcionalmente un AND con ENTER; la salida enciende el LED verde y, a través de un inversor, el LED rojo. Los cables en verde lima valen 1. CABLES EN VERDE LIMA = 1 · GRIS = 0
E (igualdad)1
Veredicto● ABRE
Puertas del montaje4
Intentos / fallos0 / 0

Montaje fijo con disparo libre: 1010 abre.

Recorrido guiado (10 minutos)

  1. 1
    Mirá 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.

  2. 2
    Cambiá 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.

  3. 3
    Recorré 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.

  4. 4
    Pasá 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.

  5. 5
    Poné 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.

  6. 6
    Secreto 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.

  7. 7
    Activá «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.

  8. 8
    Apretá 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.

  9. 9
    Con 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.

  10. 10
    Contá 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

  1. Con el montaje fijo, probá 1000 y 1011. ¿Cuánto vale E en cada caso y qué bit falla?
  2. ¿Cuántos de los 16 códigos abren? ¿Qué implica para la seguridad?
  3. En el montaje configurable con secreto 0110, ¿cuántas puertas hay y qué entrada abre?
  4. Con ENTER, ¿qué diferencia hay entre dejar 1010 puesto y apretar?
Ver respuestas sugeridas
  1. 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.
  2. 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.
  3. Seis (cuatro XNOR, el AND de 4 y el inversor del rojo); abre con 0110, que es igual al secreto.
  4. 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

El mismo concepto, en dos mundos.
En softwareEn la cerradura
Una allowlist con un único valor permitidoEl mintérmino: una sola fila de la tabla vale 1
return a == b sobre cuatro campos, con AND entre todosLa 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ónLa versión con XNOR y un segundo DIP
Deny by default en un firewallRojo 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 corto16 combinaciones: se prueban en segundos
Un rate limit o bloqueo tras N intentosEl 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 confirmarENTER: el código se evalúa solo al apretar
Un debounce del evento de un botónRC más Schmitt en el pulsador
Un test exhaustivo de una función con pocos casosRecorrer los 16 códigos en el banco
  1. 1
    Especificar 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.

  2. 2
    El 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.

  3. 3
    Separar «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.