{"id":485,"date":"2011-03-05T10:53:03","date_gmt":"2011-03-05T09:53:03","guid":{"rendered":"http:\/\/pinguino.walii.es\/?p=485"},"modified":"2011-03-05T11:13:24","modified_gmt":"2011-03-05T10:13:24","slug":"digital-code-lock","status":"publish","type":"post","link":"https:\/\/pinguino.walii.es\/?p=485","title":{"rendered":"DIGITAL CODE LOCK"},"content":{"rendered":"

Aqu\u00ed, algo que he querido publicar hace tiempo\u2026 y por eso lo ver\u00e1n instalado ya en mi coche\u2026 ya lleva alg\u00fan tiempo de pruebas y ha salido victorioso.<\/p>\n

Siempre me preguntaba porque un Mercedes CLK puede tener un arranque con c\u00f3digo y yo en mi Korando no??? J<\/span> Por eso me puse manos a la obra y he realizado este proyecto.<\/p>\n

B\u00e1sicamente funciona as\u00ed: si uno no introduce el c\u00f3digo correcto no cierra el circuito y no alimenta al circuito de arranque\u2026 algo como un corte de arranque pero en forma de c\u00f3digo\u2026<\/p>\n

Con un cable muy largo e instalado separadamente el PING\u00dcINO y el teclado, y as\u00ed poder tener el teclado en una posici\u00f3n disimulada, por sobre el parasol, entonces si no se baja el parasol es imposible ver la modificaci\u00f3n\u2026 tambi\u00e9n he incluido un procedimiento para modificar el c\u00f3digo para poder cambiarlo por ejemplo cuando lo dejamos en el taller de reparaciones o cuando lo dejamos en los lava coches. Y as\u00ed no descubren nuestro verdadero c\u00f3digo.<\/p>\n

El c\u00f3digo funciona utilizando la memoria EEPROM del PING\u00dcINO para poder grabar de forma permanente el n\u00famero secreto, y que este no se modifique o se pierda con una falta de energ\u00eda. Por tal motivo podremos conectarlo en la conexi\u00f3n de contacto de nuestro coche\u2026 y as\u00ed alimentarlo solo mientras se necesite.<\/p>\n

\"\"\"\"<\/p>\n

\"\"\"\"<\/p>\n

<\/p>\n

El circuito de pruebas fue algo muy b\u00e1sico con dos leds, uno para testigo de cuando presion\u00e1bamos las teclas y otro led para reemplazar el rele.<\/p>\n

\"\"<\/p>\n

El c\u00f3digo es algo complicado porque actualmente no poseemos librer\u00edas para teclado, pero me las he ingeniado para hacer un ROUNDROBIN para detectar las pulsaciones, quiz\u00e1s no es tan sensible como quisiera, pero manteniendo el bot\u00f3n presionado por medio segundo y verificando que el LED enciende, estamos seguros que detecto la acci\u00f3n.<\/p>\n

El c\u00f3digo por defecto y luego de restaurar es \u00ab1234\u00bb, para restaurar un c\u00f3digo olvidado o err\u00f3neo tenemos la opci\u00f3n de \u00abRESTAURAR\u00bb en este punto colocando el valor a 1 limpiaremos la memoria, podremos poner un bot\u00f3n secreto para esto, o el puerto USB accesible y escribir el c\u00f3digo nuevo v\u00eda USB.(creo que esta es la mejor forma\u2026 por eso lo tengo as\u00ed)<\/p>\n

En este caso, cuando presionamos el c\u00f3digo y la tecla \u00abE\u00bb, estamos intentando \u00abcerrar el rele\u00bb, si lo tipeamos mal no nos dejar\u00e1 y por puerto serie aparecer\u00e1 el mensaje de \u00aberror en el c\u00f3digo\u00bb<\/p>\n

Para el caso de cambiar la clave deberemos estar primero ingresados, \u00abcon el rele cerrado\u00bb, habiendo puesto el c\u00f3digo correcto. Luego de esto hay que ingresar el nuevo c\u00f3digo y presionar \u00abF\u00bb para grabarlo.<\/p>\n

Para el caso que no estuvi\u00e9semos ya registrados con el c\u00f3digo correcto e intentemos modificarlo, en el puerto serie obtendremos un mensaje de error.<\/p>\n

El c\u00f3digo es este:<\/p>\n

[sourcecode language=\u00bbpy\u00bb]<\/p>\n

\/\/ KEY LOCK<\/p>\n

\/\/ Walii 2011<\/p>\n

\/*teclado conectado al puerto RB, pines pinguino 0 al 7<\/p>\n

del 0-3 producen nivel alto en las columnas<\/p>\n

del 4-7 hacen el control de activacion de las filas<\/p>\n

por ejemplo si tenemos el nivel 3 alto, y detectamos un nivel alto<\/p>\n

en el teminal 5, estaremos viendo un nuevo 7 del teclado<\/p>\n

para cada caso es diferente.<\/p>\n

NOTA: recordemos que aunque el PINGUINO se quede sin energia<\/p>\n

guarda en su memoria el codigo. Ya que es guardado en la EEPROM<\/p>\n

Todos los PRINT son para debug, pueden quitarse.<\/p>\n

*\/<\/p>\n

\/\/esto es una aplicacion completa y la tengo funcionando en mi auto.<\/p>\n

#include <eepromlib.c><\/p>\n

#define PIC18F4550<\/p>\n

unsigned char i=0;<\/p>\n

unsigned char x=1;<\/p>\n

unsigned char c=0;<\/p>\n

unsigned char val,result,suma;<\/p>\n

unsigned int key[4]={1,2,3,4};\/\/valor de ejemplo<\/p>\n

unsigned char verificado=0;\/\/valor de autenticado<\/p>\n

unsigned char restaurar=0;\/\/valor para restaurar la config<\/p>\n

void setup()<\/p>\n

{<\/p>\n

for (i=0;i<4;i++)<\/p>\n

{<\/p>\n

pinMode(i,OUTPUT);<\/p>\n

digitalWrite(i,LOW);<\/p>\n

}<\/p>\n

pinMode(28,OUTPUT);\/\/rele de apertura de puerta, o en mi caso de arranque del auto.<\/p>\n

digitalWrite(28,LOW);<\/p>\n

pinMode(27,OUTPUT);\/\/Buzzer para testificar las acciones<\/p>\n

Serial.begin(115200);<\/p>\n

}<\/p>\n

void loop()<\/p>\n

{<\/p>\n

if (restaurar==1) limpiar();\/\/limpiamos la memoria si restaurar esta en 1<\/p>\n

\/\/comenzamos el trabajo<\/p>\n

\/\/aqui hacemos rotar el valor X para poder<\/p>\n

\/\/realizar ROUNDROBIN en las columnas del teclado.<\/p>\n

digitalWrite(x,HIGH);<\/p>\n

\/\/delay(200);<\/p>\n

if (digitalRead(x)==1)<\/p>\n

{<\/p>\n

\/\/escuchamos las filas para cada columna activada<\/p>\n

if (digitalRead(7)) key[c]=3-x+1,c=c+1,ping();<\/p>\n

if (digitalRead(6)) key[c]=6-x+1,c=c+1,ping();<\/p>\n

if (digitalRead(5)) key[c]=9-x+1,c=c+1,ping();<\/p>\n

\/\/en este ultimo caso es especial, porque tenemos las teclas F\/0\/E<\/p>\n

\/\/y queremos usar F para grabar el codigo y E para entrar el codigo<\/p>\n

if (digitalRead(4))<\/p>\n

{<\/p>\n

result=12-x+1;<\/p>\n

if (result==10) formatear();<\/p>\n

if (result==11) key[c]=0,c=c+1,ping();<\/p>\n

if (result==12) entrar();<\/p>\n

}<\/p>\n

delay(100);<\/p>\n

}<\/p>\n

digitalWrite(x,LOW);<\/p>\n

x=x+1;<\/p>\n

if (x==4) x=1;<\/p>\n

if (c==4) c=0;<\/p>\n

\/\/Imprimimos el valor del array de clave (key)<\/p>\n

\/\/esta es la clave predeterminada pero NO la guardada en memoria<\/p>\n

Serial.print("\\n\\rLa clave es");<\/p>\n

Serial.print("\\n\\r");<\/p>\n

Serial.print("\\n\\r");<\/p>\n

Serial.print(key[0],DEC);<\/p>\n

Serial.print(key[1],DEC);<\/p>\n

Serial.print(key[2],DEC);<\/p>\n

Serial.print(key[3],DEC);<\/p>\n

\/\/delay(500);<\/p>\n

}<\/p>\n

\/\/Aqui tenemos el modulo para grabar una nueva clave…<\/p>\n

\/\/deberia estar autenticado para poder modificarla<\/p>\n

void formatear()<\/p>\n

{<\/p>\n

if (verificado==1)<\/p>\n

{<\/p>\n

for (i = 0; i < 4; i++){<\/p>\n

val=key[i];<\/p>\n

ee_write(i, val);<\/p>\n

delay(100);<\/p>\n

if (i==3) Serial.print("grabado…\\n\\r");<\/p>\n

}<\/p>\n

}<\/p>\n

else<\/p>\n

{<\/p>\n

Serial.print("NO puede cambiar la clave");<\/p>\n

}<\/p>\n

}<\/p>\n

\/\/este es el modulo de entrada, verifica que el array sea identico<\/p>\n

\/\/a los datos grabados en la EEPROM<\/p>\n

void entrar()<\/p>\n

{<\/p>\n

suma=0;<\/p>\n

for (i = 0; i < 4; i++){<\/p>\n

if (ee_read(i)==key[i]) suma++;\/\/verifica con una suma, que todos los valores esten bien.<\/p>\n

\/\/delay(100);<\/p>\n

}<\/p>\n

if (suma==4)<\/p>\n

{<\/p>\n

Serial.print("Codigo correcto — puedes entrar…\\n\\r");<\/p>\n

digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW);<\/p>\n

verificado=1;\/\/modifica el valor de verificado, permitiendo modificar la clave<\/p>\n

activaRele();\/\/si es correcto cambia el valor de verificado y activa el rele.<\/p>\n

c=0;\/\/vuelve a cero el contador de array<\/p>\n

}<\/p>\n

else<\/p>\n

{<\/p>\n

Serial.print("error en el codigo…\\n\\r");<\/p>\n

digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW);<\/p>\n

digitalWrite(28,LOW);<\/p>\n

verificado=0;\/\/quita la marca a verificado<\/p>\n

c=0;\/\/vuelve a cero el contador de array<\/p>\n

}<\/p>\n

}<\/p>\n

\/\/Activa el rele, subiendo el estado del pin 28<\/p>\n

\/\/no me interesa bajar el estado, ya que solo<\/p>\n

\/\/se desconectar\u00e1 cuando pierda energia, de la alimentacion el auto<\/p>\n

\/\/cuando quite la llave.<\/p>\n

void activaRele()<\/p>\n

{<\/p>\n

beep();<\/p>\n

digitalWrite(28,HIGH);<\/p>\n

}<\/p>\n

\/\/esto restaura los valores a 1,2,3,4 solo si se compila con<\/p>\n

\/\/el valor restaurar en 1 (por seguridad lo dejo fuera del acceso del teclado)<\/p>\n

\/\/pero se puede poner un boton secreto en algun lado…<\/p>\n

void limpiar()<\/p>\n

{<\/p>\n

for (i = 0; i < 4; i++){<\/p>\n

ee_write(i, i+1);<\/p>\n

delay(100);<\/p>\n

if (i==3) Serial.print("restaurado…\\n\\r");<\/p>\n

}<\/p>\n

restaurar=0;<\/p>\n

}<\/p>\n

\/\/parpadeo de un ciclo, mejor que sea un LED.<\/p>\n

void ping()<\/p>\n

{<\/p>\n

digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW);<\/p>\n

}<\/p>\n

\/\/parpadeo de 3 ciclos, puede ser un LED o un BUZZER<\/p>\n

void beep()<\/p>\n

{<\/p>\n

digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW),delay(100);<\/p>\n

digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW),delay(100);<\/p>\n

digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW);<\/p>\n

}<\/p>\n

[\/sourcecode]<\/p>\n

Nota: estoy muy contento con mi proyecto y s\u00e9 que puede usarse para infinidad de distintos y nuevos proyectos.<\/p>\n

Espero que os agrade.<\/p>\n","protected":false},"excerpt":{"rendered":"

Aqu\u00ed, algo que he querido publicar hace tiempo\u2026 y por eso lo ver\u00e1n instalado ya en mi coche\u2026 ya lleva alg\u00fan tiempo de pruebas y…<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/pinguino.walii.es\/index.php?rest_route=\/wp\/v2\/posts\/485"}],"collection":[{"href":"https:\/\/pinguino.walii.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pinguino.walii.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pinguino.walii.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/pinguino.walii.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=485"}],"version-history":[{"count":3,"href":"https:\/\/pinguino.walii.es\/index.php?rest_route=\/wp\/v2\/posts\/485\/revisions"}],"predecessor-version":[{"id":506,"href":"https:\/\/pinguino.walii.es\/index.php?rest_route=\/wp\/v2\/posts\/485\/revisions\/506"}],"wp:attachment":[{"href":"https:\/\/pinguino.walii.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=485"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pinguino.walii.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=485"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pinguino.walii.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}