Aquí, algo que he querido publicar hace tiempo… y por eso lo verán instalado ya en mi coche… ya lleva algún tiempo de pruebas y ha salido victorioso.
Siempre me preguntaba porque un Mercedes CLK puede tener un arranque con código y yo en mi Korando no??? J Por eso me puse manos a la obra y he realizado este proyecto.
Básicamente funciona así: si uno no introduce el código correcto no cierra el circuito y no alimenta al circuito de arranque… algo como un corte de arranque pero en forma de código…
Con un cable muy largo e instalado separadamente el PINGÜINO y el teclado, y así poder tener el teclado en una posición disimulada, por sobre el parasol, entonces si no se baja el parasol es imposible ver la modificación… también he incluido un procedimiento para modificar el código para poder cambiarlo por ejemplo cuando lo dejamos en el taller de reparaciones o cuando lo dejamos en los lava coches. Y así no descubren nuestro verdadero código.
El código funciona utilizando la memoria EEPROM del PINGÜINO para poder grabar de forma permanente el número secreto, y que este no se modifique o se pierda con una falta de energía. Por tal motivo podremos conectarlo en la conexión de contacto de nuestro coche… y así alimentarlo solo mientras se necesite.
El circuito de pruebas fue algo muy básico con dos leds, uno para testigo de cuando presionábamos las teclas y otro led para reemplazar el rele.
El código es algo complicado porque actualmente no poseemos librerías para teclado, pero me las he ingeniado para hacer un ROUNDROBIN para detectar las pulsaciones, quizás no es tan sensible como quisiera, pero manteniendo el botón presionado por medio segundo y verificando que el LED enciende, estamos seguros que detecto la acción.
El código por defecto y luego de restaurar es «1234», para restaurar un código olvidado o erróneo tenemos la opción de «RESTAURAR» en este punto colocando el valor a 1 limpiaremos la memoria, podremos poner un botón secreto para esto, o el puerto USB accesible y escribir el código nuevo vía USB.(creo que esta es la mejor forma… por eso lo tengo así)
En este caso, cuando presionamos el código y la tecla «E», estamos intentando «cerrar el rele», si lo tipeamos mal no nos dejará y por puerto serie aparecerá el mensaje de «error en el código»
Para el caso de cambiar la clave deberemos estar primero ingresados, «con el rele cerrado», habiendo puesto el código correcto. Luego de esto hay que ingresar el nuevo código y presionar «F» para grabarlo.
Para el caso que no estuviésemos ya registrados con el código correcto e intentemos modificarlo, en el puerto serie obtendremos un mensaje de error.
El código es este:
[sourcecode language=»py»]
// KEY LOCK
// Walii 2011
/*teclado conectado al puerto RB, pines pinguino 0 al 7
del 0-3 producen nivel alto en las columnas
del 4-7 hacen el control de activacion de las filas
por ejemplo si tenemos el nivel 3 alto, y detectamos un nivel alto
en el teminal 5, estaremos viendo un nuevo 7 del teclado
para cada caso es diferente.
NOTA: recordemos que aunque el PINGUINO se quede sin energia
guarda en su memoria el codigo. Ya que es guardado en la EEPROM
Todos los PRINT son para debug, pueden quitarse.
*/
//esto es una aplicacion completa y la tengo funcionando en mi auto.
#include <eepromlib.c>
#define PIC18F4550
unsigned char i=0;
unsigned char x=1;
unsigned char c=0;
unsigned char val,result,suma;
unsigned int key[4]={1,2,3,4};//valor de ejemplo
unsigned char verificado=0;//valor de autenticado
unsigned char restaurar=0;//valor para restaurar la config
void setup()
{
for (i=0;i<4;i++)
{
pinMode(i,OUTPUT);
digitalWrite(i,LOW);
}
pinMode(28,OUTPUT);//rele de apertura de puerta, o en mi caso de arranque del auto.
digitalWrite(28,LOW);
pinMode(27,OUTPUT);//Buzzer para testificar las acciones
Serial.begin(115200);
}
void loop()
{
if (restaurar==1) limpiar();//limpiamos la memoria si restaurar esta en 1
//comenzamos el trabajo
//aqui hacemos rotar el valor X para poder
//realizar ROUNDROBIN en las columnas del teclado.
digitalWrite(x,HIGH);
//delay(200);
if (digitalRead(x)==1)
{
//escuchamos las filas para cada columna activada
if (digitalRead(7)) key[c]=3-x+1,c=c+1,ping();
if (digitalRead(6)) key[c]=6-x+1,c=c+1,ping();
if (digitalRead(5)) key[c]=9-x+1,c=c+1,ping();
//en este ultimo caso es especial, porque tenemos las teclas F/0/E
//y queremos usar F para grabar el codigo y E para entrar el codigo
if (digitalRead(4))
{
result=12-x+1;
if (result==10) formatear();
if (result==11) key[c]=0,c=c+1,ping();
if (result==12) entrar();
}
delay(100);
}
digitalWrite(x,LOW);
x=x+1;
if (x==4) x=1;
if (c==4) c=0;
//Imprimimos el valor del array de clave (key)
//esta es la clave predeterminada pero NO la guardada en memoria
Serial.print("\n\rLa clave es");
Serial.print("\n\r");
Serial.print("\n\r");
Serial.print(key[0],DEC);
Serial.print(key[1],DEC);
Serial.print(key[2],DEC);
Serial.print(key[3],DEC);
//delay(500);
}
//Aqui tenemos el modulo para grabar una nueva clave…
//deberia estar autenticado para poder modificarla
void formatear()
{
if (verificado==1)
{
for (i = 0; i < 4; i++){
val=key[i];
ee_write(i, val);
delay(100);
if (i==3) Serial.print("grabado…\n\r");
}
}
else
{
Serial.print("NO puede cambiar la clave");
}
}
//este es el modulo de entrada, verifica que el array sea identico
//a los datos grabados en la EEPROM
void entrar()
{
suma=0;
for (i = 0; i < 4; i++){
if (ee_read(i)==key[i]) suma++;//verifica con una suma, que todos los valores esten bien.
//delay(100);
}
if (suma==4)
{
Serial.print("Codigo correcto — puedes entrar…\n\r");
digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW);
verificado=1;//modifica el valor de verificado, permitiendo modificar la clave
activaRele();//si es correcto cambia el valor de verificado y activa el rele.
c=0;//vuelve a cero el contador de array
}
else
{
Serial.print("error en el codigo…\n\r");
digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW);
digitalWrite(28,LOW);
verificado=0;//quita la marca a verificado
c=0;//vuelve a cero el contador de array
}
}
//Activa el rele, subiendo el estado del pin 28
//no me interesa bajar el estado, ya que solo
//se desconectará cuando pierda energia, de la alimentacion el auto
//cuando quite la llave.
void activaRele()
{
beep();
digitalWrite(28,HIGH);
}
//esto restaura los valores a 1,2,3,4 solo si se compila con
//el valor restaurar en 1 (por seguridad lo dejo fuera del acceso del teclado)
//pero se puede poner un boton secreto en algun lado…
void limpiar()
{
for (i = 0; i < 4; i++){
ee_write(i, i+1);
delay(100);
if (i==3) Serial.print("restaurado…\n\r");
}
restaurar=0;
}
//parpadeo de un ciclo, mejor que sea un LED.
void ping()
{
digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW);
}
//parpadeo de 3 ciclos, puede ser un LED o un BUZZER
void beep()
{
digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW),delay(100);
digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW),delay(100);
digitalWrite(27,HIGH),delay(100),digitalWrite(27,LOW);
}
[/sourcecode]
Nota: estoy muy contento con mi proyecto y sé que puede usarse para infinidad de distintos y nuevos proyectos.
Espero que os agrade.
Muy buen artículo, lo único malo es que en cada coche el sistema de arranque varía bastante, así como la localización de las conexiones concretas. Para colmo los coches nuevos llevan controles más complejos y electrónicos 😛
No creas que es para tanto… ya que la gran mayoría tiene un corta corriente en el pedal del Embrague y si no se presiona el embrague al arrancar.. entonces no ofrece energía al motor… eso tiene el mío… y cualquiera puede probarlo, pero creo que en la gran mayoría es así… y realizando un corte en serie a este switch… puedes tenerlo instalado en un ratillo…
saludos.