Cerradura electrónica

Integrantes

-Jorge Armando Miranda.
-Fernando Ramos.
-Juan Gonzalez Montoya.

Descripción

En este proyecto se busca implementar un teclado matricial 4x4 a una tarjeta FPGA Nexys 2 con el fin de elaborar una cerradura electrónica.
Dicha cerradura contara con un límite de intentos erróneos (3) para abrirse. Si en estos intentos la cerradura no se abre esta emitirá un sonido con un buzzer y se bloqueara alrededor de 3 a 5 minutos, tiempo en el cual no se podrá volver a introducir el patrón numérico de desbloqueo.
Este patrón o contraseña, tendrá la posibilidad de ser modificada cuantas veces el usuario quiera.

Objetivos

  • Implementar un sistema de seguridad para cerraduras controlado por medio de combinaciones numéricas.
  • Diseñar un algoritmo implementando máquinas de estado sobre una tarjeta FPGA.
  • Bloquear la cerradura cuando se introduzca un patrón fallido 3 veces seguidas. Activando un buzzer para que alerte a las personas alrededor.

Alcances

Ser un sistema flexible de seguridad, es decir, que pueda ser implementado a diferentes escalas, las cuales van desde la puerta de entrada de una casa o de un local hasta el sistema de seguridad de una empresa o entidad de gran flujo de dinero.

Limitaciones

  • El sistema dependerá de una fuente de energía constante, si por algún motivo se corta la alimentación el sistema se bloqueara, impidiendo la apertura o cerrado de la cerradura.
  • Se necesitara un sistema dependiente de la tarjeta, el cual estará encargado del control del motor que moverá el cerrojo.
  • Las combinaciones pueden ir desde el 0000 hasta el 9999, cualquier combinación es aceptada, siempre y cuando esta sea de 4 dígitos

Diseño

La cerradura va a constar de 4 partes fundamentales:

  1. Teclado matricial
  2. Nexys 2
  3. Buzzer o alarma
  4. Cerradura
thump_9487162diseoproyecto.jpg.

Teclado matricial

Para la ejecución de este proyecto, se debe hacer uso de un teclado para la introducción de los datos, el equipo de trabajo
opto por usar un teclado matricial 4x4, para poder usar este periférico de forma eficiente también se tomó la decisión de
usar un integrado MM74c922 (Circuito integrado decodificador de teclados 4x4) este hace menos complejo el proceso la
recolección de datos ya que con la ausencia de este se habría necesitado un módulo más en verilog para la decodificación
de los datos registrados por el teclado, el integrado nos da la facilidad de obtener directamente el numero presionado en binarios.

Integrado MM74c922:

224.jpg

Conexión Matriz — 74c922

FJFPUTYFXK6BGEK.MEDIUM.gif

Conexión Teclado — Nexys 2

Para la conexión entre la el teclado, el integrado y el controlador (Nexys 2) se conectaron Jumpers desde la salida de los datos en
el integrado(DATA OUT A, B, C, D) a un puerto Pmod en la Nexys 2 estos sirven tanto como para entrada de datos como para la
salida de los mismos.

PMOD%20Connectors.jpg

Nexys 2

Para este proyecto, tal y como se han venido desarrollando en los laboratorios de clase se implementarán los códigos en una Nexys—2, pero en este caso se usarán, sus puertos de Pmod, los cuales se adecuarán para el control, de un puente H, un buzzer y la entrada de cuadro bits desde un teclado matricial

Buzzer o alarma

La alarma se activará cuando el patrón sea erróneo con un tono por corto tiempo, al pasar las 3 equivocaciones el todo será extenso. todo esto con el fin de dar una alerta a las personas que estén al rededor.

Cerradura

La cerradura se abrirá cuando la contraseña sea introducida con éxito, así mismo se cerrara anotando nuevamente en código.

Máquinas de estado y funcionamiento

RTL

14lou95.jpg

Control

Este módulo se encarga de comparar las entradas con la contraseña de los sistemas, en el caso de que sean correctas, el sistema espera por una de dos entradas, una para configurar la nueva contraseña o para abrir la puerta. Por otro lado, si la entrada es incorrecta envía un pulso de error.

MAQUINAS DE ESTADOS

L.png

CODIGO

module Control(clk,Bloq,Cl1,Cl2,Cl3,Cl4,Cont1,Cont2,Cont3,Cont4, Entrada,Set,Abrir, Error, Paso, setCont
    );

input [0:3] Cl1;
input [0:3] Cl2;
input [0:3] Cl3;
input [0:3] Cl4;

input [0:3] Cont1;
input [0:3] Cont2;
input [0:3] Cont3;
input [0:3] Cont4;

input Abrir;
input Entrada;
input Set;
input clk;
input Bloq;

output reg Error=0;
output reg Paso=0;
output reg setCont=0;

reg [3:0] actual;
reg [3:0] next;

parameter start = 0,Paso1=1,Paso2=2,Paso3=3,Paso4=4,Err=5, Conf=6;

always @(Entrada,actual,clk,Set, Cl1, Cont1, Cl2, Cont2, Cl3, Cont3, Cl4, Cont4, Abrir, Bloq) begin

    case (actual)

        start : begin
        if(Entrada==1  & Set==0 & Bloq==0 )next = Paso1;
        else if (Bloq==1) next = start;
      else if(Entrada==0)begin 
        Error=0;
            if (Abrir==1) begin
            Paso=Paso;
            end
            else Paso=0;
            if(Set==1)begin
            setCont=setCont;
            end
            else setCont=0;
        next=start;
        end
        else next = start;
        end

        Paso1: begin

        if (Cl1==Cont1) next = Paso2;
        else if(Cl1 != Cont1) next = Err;
        else next = Paso1;

        end

        Paso2: begin

        if (Cl2==Cont2) next = Paso3;
        else if (Cl2 != Cont2) next =  Err;
        else next= Paso2;

        end

        Paso3: begin

        if(Cl3==Cont3) next = Paso4;
        else if(Cl3!=Cont3) next = Err;
        else next= Paso3;

        end

        Paso4: begin

        if (Cl4==Cont4)next = Conf;
        else if (Cl4!=Cont4) next = Err;
        else next=Paso4;

        end

        Err: begin    
            Error = 1;
            Paso = 0;
            setCont=0;
            next = start;
        end

        Conf: begin
        if(Entrada==0 & Set==1 & Abrir==0) begin
        setCont=1;
        Error = 0;
        Paso = 0;
        next=start;
        end
        else if(Entrada == 0 & Abrir ==1 & Set==0)begin
        Paso=1;
        Error = 0;
        setCont=0;
        next = start;
        end
        else next = Conf;
        end

        default: begin
        Error = 0;
        Paso = 0;
        setCont=0;
        next = start;
        end

    endcase

end

always@(clk) begin
actual=next;
end

endmodule

SIMULACIÓN

PASO

thump_9489165simcontrol-paso.jpg

BLOQUEO

thump_9489161simcontrol-bloqueo.jpg

ERROR

thump_9489162simcontrol-error.jpg

Contraseña

El módulo de contraseña, guarda como claves o contraseñas la entrada que reciba del teclado externo, dependiendo del pulso que reciba, ya sea de entrada o de permiso. Estas salidas van directamente conectadas al módulo de control.

MAQUINA DE ESTADOS

L.png

CODIGO

module Asignacion(Ingresar,Permiso,clk,En1,En2,En3,En4,Cont1,Cont2,Cont3,Cont4,Cl1,Cl2,Cl3,Cl4 
    );

input Ingresar;
input Permiso;
input clk;

input [0:3] En1;
input [0:3] En2;
input [0:3] En3;
input [0:3] En4;

output reg [0:3] Cl1=0;
output reg [0:3] Cl2=0;
output reg [0:3] Cl3=0;
output reg [0:3] Cl4=0;

output reg [0:3] Cont1=0;
output reg [0:3] Cont2=0;
output reg [0:3] Cont3=0;
output reg [0:3] Cont4=0;

reg [3:0] actual;
reg [3:0] next;

parameter start=0,ent=1,espera=2,cont=3;

    always @(posedge clk) begin

        case (actual) 

            start: begin
                if(Ingresar == 1 && Permiso == 0) next = ent;
                else if (Permiso == 1) next = cont;
                else next = start;
            end

            ent: begin
                Cl1= En1;
                Cl2= En2;
                Cl3= En3;
                Cl4= En4;
                next = start;        
            end

            espera: begin
                if (Ingresar==1) next = cont;
                else next=espera;
            end

            cont : begin

                Cont1=En1;
                Cont2=En2;
                Cont3=En3;
                Cont4=En4;
                next = start;
            end

            default: begin
            next = start;
            end
        endcase
    end

    always@(posedge clk) begin
    actual=next;
    end

endmodule

SIMULACIÓN

thump_9489164simassign.jpg

Conteo

El módulo de conteo, se encarga de recibir los pulsos de error del módulo de control y va enviando pulso temporizados a medida que los recibe, si recibe tres pulsos de error seguidos enviara un pulso mucha más largo y enviara un pulso de bloqueo al módulo de control

MAQUINAS DE ESTADO

L.png

CODIGO

module error1(input clk, input error, output reg AlarmaL=0, output reg AlarmaS=0, input Tlong, input Tshort, output reg bloqueo=0
    );

reg [0:1] cont=0;
reg [0:2] next=0;
reg [0:2] actual=0;

parameter start=0, conteo=1, espera=2, TimeL=3, TimeS=4;

    always @ (clk) begin

        case(actual)

            start: begin
                 if (error==1) next=conteo;
                 else next=espera;
            end

            conteo: begin
//                cont= cont+1;
                if (cont<2)begin 
                    AlarmaS=1;
                    cont=cont+1;
                end
                else if(cont>=2) begin
                    AlarmaL=1;
                    bloqueo=1;
                    cont=0;
                end
                next=start;
            end

            espera: begin
                if (Tshort==1 & Tlong==0)begin
                    AlarmaS=0;
                    next=start;
                end
                else if(Tlong==1 & Tshort==0) begin
                    AlarmaL=0;
                    bloqueo=0;
                    next=start;
                end
                else next=start;
            end

            default : begin
                AlarmaL=AlarmaL;
                AlarmaS=AlarmaS;
                bloqueo=bloqueo;
                next=start;
            end

        endcase
    end

    always @(clk)begin
        actual = next;
    end

endmodule

SIMULACIÓN

thump_9489163simerror.jpg

Entradas

Este módulo de entrada recibe los registros del teclado externo y los ordena a medida que van entrando, asignando cada uno a un registro diferente.

MAQUINA DE ESTADOS

L.png

CODIGO

module Entradas(clk,Entrada,Pulso, Entrada0,Entrada1,Entrada2,Entrada3
    );

input Pulso,clk;
input [0:3] Entrada;

output reg[0:3] Entrada0=0;
output reg[0:3] Entrada1=0;
output reg[0:3] Entrada2=0;
output reg[0:3] Entrada3=0;

reg [0:2] next=0;
reg [0:2] actual=0;

    always @(negedge Pulso)begin

        case(actual)

            0: begin
                Entrada0=Entrada;
                next=1;
            end

            1: begin
                Entrada1=Entrada;
                next=2;
            end

            2: begin
                Entrada2=Entrada;
                next=3;
            end

            3: begin
                Entrada3=Entrada;
                next=0;
            end

        endcase

    end

    always @(clk) begin
        actual=next;
    end

endmodule
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License