Go Down

Topic: Alarma de seguridad para Automovil (Read 1 time) previous topic - next topic

Swift

Nov 30, 2017, 08:04 pm Last Edit: Dec 11, 2017, 01:42 am by Swift
Buenas a todos la idea de este proyecto es la realización de una alarma basada en arduino con fines de aprendizaje y a la vez un que se adapte a las diferentes necesidades que tenga, porque debido a que las que hay en el mercado se encuentran a un precio muy accesible y cumplen con las funciones básicas. Ahora  para la realización de este proyecto utilizare:
* Arduino uno.
* Módulo de Radiofrecuencia.
* Módulo Bluetooth.
* Sensor de Impacto (o volumétrico).
* Componentes varios (para la creación de la Shield para la alarma).
Ahora para la realización de este proyecto hay que tener muy encuenta la batería del automóvil por ello lo más aconsejable según mi parecer sería utilizar solo Atmega o sino utilizar la placa del arduino eliminado el regulador interno y utilizar un externo como lo es un buck converter además eliminar los del de la placa etc. Aparte de esto poner a dormir al Arduino después de un tiempo que se haya armado la alarma y despertarlo mediante el puerto serie o una interrupción  por el módulo de radiofrecuencia o la apertura forzada de alguna puerta para que active la alarma o para que abra los seguros del vehiculo , no estoy muy seguro si se pueda hacer esto con el arduino en modo sueño.
Ahora para empezar la realización del proyecto debemos tener en cuenta el funcionamiento básico de una alarma (Funcionamiento de una alarma ) una vez que tenemos esto en cuenta mi idea es empezar por lo básico es abrir, cerrar puertas, activar la iluminación del vehiculo o alerta sirena, detectar el encendido del automóvil además de la apertura de las puertas etc. Aquí un diagrama de una alarma común para tener en cuenta todo lo que tiene e implementar todo esto a la pretendo realizar.



Carpeta con documentación, diagramas, codigo, vídeos funcionamiento etc.

Carpeta del Proyecto

RIG

Hace tiempo que traigo ese proyecto en mente,  pero he estado trabajando en otras cosas y no se ha llegado la hora,   hace algunos años me dedique a vender e instalar alarmas como ingreso extra por lo que entiendo bien como trabajan esa parte no es problema.

mi idea es empezar por lo básico es abrir, cerrar puertas, activar la iluminación del vehículo o alerta sirena, detectar el encendido del automóvil además de la apertura de las puertas etc.
Esto que mencionas es sencillo, si solo piensas hacer eso, es mas simple que compres una y la pongas, ahora que si tienes la idea de algo mas complejo vamos sumando ideas.
Esto es lo que traigo en mente :  Ademas de lo básico que tiene cualquier alarma común, tenga:  arranque remoto, cierre de vidrios, seguros y quemacoco(sunroof), apertura de puerta por medio de bluetooth ademas de detectar presencia (buscar la forma mas adecuada) y en base a eso desbloquear los seguros y permitir o bloquear el arranque (que seria con botón como los vehículos recientes) incluir un teclado para desahabilitar el sistema por medio de una contraseña y demás cosas que se puedan agregar.   Todo lo que puse no creo que presente mayor problema , lo único que se me complica es la forma de detectar la presencia.

La parte que comentas sobre la batería y dormir el arduino no te preocupes,  eso no es necesario ya que cuando la alarma esté armada el microcontrolador solo consume unos cuantos miliamperios porque solo  estaría ejecutando el loop en espera de alguna señal de entrada.
Que te parece si colaboramos con ideas para ver si sale algo bueno.
El día de mañana tratare de hacer un diagrama de como quedarían todas las conexiones y como funcionaria cada sistema, creo que basta y sobra con los puertos GPIO del atmega328,  después comenzar a desarrollar el código

 SALU2

Swift

Para lo que es cierre de vidrios automáticos habría que tener en cuenta que si es un sistema original al apagar el automóvil estos se quedan sin alimentación, por lo que habría que solucionar eso, aparte un sistema de seguridad para evitar que te aplaste la mano cuando se estén cerrando los vidrios por a o b  motivo algún niño mete la mano, no hay ningún problema cuando se lo alza manualmente, pero en este caso habría que de alguna forma de proteger para este caso.
Ahora el sunroof no tengo ni idea de cómo funciona exactamente o si tiene finales de carrera o algo por el estilo.
Para bloquear el arranque lo más común que se utiliza es un relay normalmente conectado, que al intentar encender el vehiculo desconecta la alimentacion de las bobinas que dan la chispa al motor.
Para el encendido remoto en mi caso no podría  realizarlo debido a que mi vehiculo tiene un transponder en la llave que si no está puesto en el switch imposible prenderlo, según el manual del vehiculo tienes los pines tx, rx que se dirigen a la ECU, habría que intentar leer el código que tiene la llave y este mismo transmitirlo de alguna forma a la ECU por supuesto desactivando la comunicación con el transponder esto sería a grandes rasgos habría que investigar más a fondo el funcionamiento.
Para la eliminación de la llave y encendido por boton no creo que se muy dificil hacer por su puesto la parte de encendido bobinas relay y todo eso, ahora otra cosa es que deje de dar arranque una vez que el motor haya encendido, o que el vehiculo no enciende si no se inserta algun codigo o huella digital o algo asi por el estilo eso ya es otra cosa, para poder encender el carro de forma remota al ser manual habría que  poner un sensor en el embrague para encenderlo, y el encendido remoto no me gusta mucho la idea ya que por a o b motivo dejas el carro en cambio y no en neutral puede ocurrir algún accidente.
Por ahora me parece la mejor opción que haga lo básico para tener unas buenas bases y según eso ir añadiendo más cosas aparte de las que mencionas como gps.
Este es el codigo que tengo para abrir, cerrar, puertas como el baúl me falta la sirena para que emita dos sonidos al abrir y uno al cerrar
Code: [Select]
/*Librerias*/
#include <Arduino.h>
#include <RCSwitch.h> //Libreria para control remoto.
#include <LowPower.h>
/*Definiciones Entradas y Salidas */
const int sirena = 13,
          abrirBaul = 12,
          luzCortecia = 11,
          alertaIluminacion = 10,
          cerrarSeguros = 9,
          abrirSeguros = 8,
          ignicion = 7,
          velocidad = 6,
          botonValet = 5,
          pulsadorCapo = 4,
          pulsadorPuertas = 3,
          controlRadio = 2,
          subirVentanas = A4,
          bajarVentanas = A5;
RCSwitch mySwitch = RCSwitch();
/*Variables y Constantes*/
bool estadoIgnicion = 0,
     estadobotonValed = 0,
     estadopulsadorCapo = 0,
     flagSeguros = 0,
     armadoAutomatico = 0,
     armadoAlarma = 0;
char comandos;
long estadoControl = 0;
int estadopulsadorPuertas = 0; // 0(Abierto)/ 1(Cerrado)
int estadoVelocidad = 0;

/* Temporizador (Millis) */

/*Millis cerrado automatico*/
long tiempoFuncion1 = 10000; // Cierre a los 30 segundos
unsigned long TiempoInicial1;
/*Millis Apertura y cierrre de seguros y abul*/
long tiempoFuncion2 = 700; // Cierre a los 30 segundos
unsigned long TiempoInicial2;
/*Millis Alerta iluminacion */
long tiempoFuncion3 = 1200;
unsigned long TiempoInicial3;
/*Millis Tiempo Activacion alarma */
long tiempoFuncion4 = 30000;
unsigned long TiempoInicial4;

void setup()
{
  Serial.begin(9600);
  pinMode(sirena, OUTPUT);
  pinMode(abrirBaul, OUTPUT);
  pinMode(luzCortecia, OUTPUT);
  pinMode(alertaIluminacion, OUTPUT);
  pinMode(cerrarSeguros, OUTPUT);
  pinMode(abrirSeguros, OUTPUT);
  pinMode(subirVentanas, OUTPUT);
  pinMode(bajarVentanas, OUTPUT);
  pinMode(ignicion, INPUT);
  pinMode(velocidad, INPUT);
  pinMode(botonValet, INPUT); // Posiblemente NO
  pinMode(pulsadorCapo, INPUT);
  pinMode(pulsadorPuertas, INPUT);
  pinMode(controlRadio, INPUT);
  mySwitch.enableReceive(0); // pin 2 para control
  TiempoInicial1 = millis(); // inicia la variable al momento actual para temporizador 1
  TiempoInicial2 = millis(); // inicia la variable al momento actual para temporizador 2
  TiempoInicial3 = millis(); // inicia la variable al momento actual para temporizador 3
  TiempoInicial4 = millis(); // inicia la variable al momento actual para temporizador 3
}

void lecturaDatos()
{
  if (Serial.available() > 0)
  {
    comandos = Serial.read();
  }
  if (mySwitch.available())
  {
    estadoControl = mySwitch.getReceivedValue();
    if (estadoControl == 0)
    {
      Serial.println("error de codigo");
    }
    else
    {
      Serial.print("codigo Recibido");
      Serial.println(estadoControl);
    }
    mySwitch.resetAvailable();
  }
}

void asignacionPulsadores()
{
  estadoIgnicion = digitalRead(ignicion);
  estadoVelocidad = digitalRead(velocidad);
  estadobotonValed = digitalRead(botonValet);
  estadopulsadorCapo = digitalRead(pulsadorCapo);
  estadopulsadorPuertas = digitalRead(pulsadorPuertas);
}

void loop()
{
  asignacionPulsadores();
  lecturaDatos();
 
// Abrir puertas control y telefono
  if ((flagSeguros == 0) && ((estadoControl == 11227985) || (comandos == 'a')))
  {
    digitalWrite(abrirSeguros, HIGH);
    digitalWrite(alertaIluminacion, HIGH);
    armadoAutomatico = 0;
    armadoAlarma = 0;
    flagSeguros = 1;
    TiempoInicial1 = millis();
    TiempoInicial2 = millis();
    TiempoInicial3 = millis();
  }
// Cerrar puertas control y telefono
 
  if ((flagSeguros == 0) && ((estadoControl == 11227986) || (comandos == 'c')))
  {
    digitalWrite(alertaIluminacion, HIGH);
    digitalWrite(cerrarSeguros, HIGH);
    armadoAutomatico = 0;
    armadoAlarma = 1;
    flagSeguros = 1;
    TiempoInicial1 = millis();
    TiempoInicial2 = millis();
    TiempoInicial3 = millis();
  }

// Abrir baul contro y telefono
  if ((flagSeguros == 0) && ((estadoControl == 11227988) || (comandos == 'b')))
  {
    digitalWrite(abrirBaul, HIGH);
    digitalWrite(alertaIluminacion, HIGH);
    armadoAutomatico = 0;
    flagSeguros = 1;
    TiempoInicial1 = millis();
    TiempoInicial2 = millis();
    TiempoInicial3 = millis();
  }

//Millis descativar
  if (millis() >= (TiempoInicial2 + tiempoFuncion2))
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    flagSeguros = 0;
  }
  if (millis() >= (TiempoInicial3 + tiempoFuncion3))
  {
    digitalWrite(alertaIluminacion, LOW);
  }
  if (millis() >= (TiempoInicial4 + tiempoFuncion4))
  {
    digitalWrite(sirena, LOW);
  }
  comandos = ' ';
  estadoControl = 0;
}

Aquí las conexiones(los leds son para simulación):

RIG

Muy bien, veo que llevas  avanzado el tema por lo que tratare de ayudarte en lo que pueda. Como te dije antes a eso me dedique mucho tiempo, en uno de mis vehículos instale una alarma con la cual cierra seguros ademas de una  interfase que cierra los vidrios, otra para el arranque remoto.
tratare de aclarar tus inquietudes

Quote
Para lo que es cierre de vidrios automáticos habría que tener en cuenta que si es un sistema original al apagar el automóvil estos se quedan sin alimentación, por lo que habría que solucionar eso
No hay problema se hace un by.pass con relevadores alimentados independientemente del sistema original

Quote
aparte un sistema de seguridad para evitar que te aplaste la mano cuando se estén cerrando los vidrios por a o b  motivo algún niño mete la mano
Esta parte ya la habia pensado incluso ya se usa en muchos vehiculos con sistema original y se me ocurre por el momento : 1.- utilizar sensores de corriente como el ACS712 o similar para detectar el momento que sube el consumo de corriente, asi en caso de que alguien meta la mano el vidrio se detiene y regresa  un poco, algo mas sencillo es poner un reed-switch cerca del cable de alimentacion del motor (este enrollado para que genere un campo magnetico al subir la corriente y active el reed), para esto hay que usar un puente H para invertir el giro del motor.  El final de carrera se puede detectar con un sensor de efecto hall

Quote
Para bloquear el arranque lo más común que se utiliza es un relay normalmente conectado, que al intentar encender el vehiculo desconecta la alimentacion de las bobinas que dan la chispa al motor.
Exactamente como lo indicas... esto no tiene mayor problema

Quote
Para el encendido remoto en mi caso no podría  realizarlo debido a que mi vehiculo tiene un transponder en la llave que si no está puesto en el switch imposible prenderlo,
Esto tambien tiene una solucion mas sencilla de lo que te imaginas, pero tiene el inconveniente  que le quita la seguridad que te brinda el transponder (el sistema de cierto modo ya no funcionaria)

Quote
ahora otra cosa es que deje de dar arranque una vez que el motor haya encendido,
Esto que dices se puede hacer de 2 maneras: 1.- al presionar el boton de arranque se activa la ignicion y el motor de arranque solo funciona mientras tengas oprimido el boton. 2.- al presionar el boton activas la ignicion y el motor de arranque trabaja un tiempo establecido(ejemplo 30 seg.), si antes de ese tiempo el motor enciende el arranque corta. Para saber cuando el motor encendio se pueden usar la señal del alternador, o se pueden medir las revoluciones, esta señal se puede tomar del distribuidor, de la bobina de  ignicion, del sensor de cigüeñal (CKP) o del sensor de posicion de arbol (CMP) según sea el caso 

Quote
para poder encender el carro de forma remota al ser manual habría que  poner un sensor en el embrague para encenderlo, y el encendido remoto no me gusta mucho la idea ya que por a o b motivo dejas el carro en cambio y no en neutral puede ocurrir algún accidente.
Aquí tienes razon por eso es mas recomendable usarlo solo en vehículos automáticos, eso no quiere decir que no se pueda hacer un sistema seguro, solo es cuestión de hacer un sistema que detecte la posición de la palanca en neutro y ademas validar que este bien puesto el freno de estacionamiento

Otra cosa, veo que usas transistores para los interruptores de puertas y baul, creo que salen sobrando, solo es cuestión de conectarlos en modo pull-up ya que la mayoría de los vehículos trabajan con negativo.

Tengo que decirte que tengo un taller mecánico, por lo que se refiere a cualquier sistema del vehículo no tengo problema y por la información técnica o diagramas  no vamos a sufrir, tengo bastante, asi que lo que se pueda ofrecer no dudes en preguntar.
Bueno me despido porque ya se hizo algo largo el post
Salu2
 

Swift

Cual seria la forma de anular el transponder ya que según tengo entendido en el caso que se pierda la llave se tiene que desmontar la computadora y borrar la llave e introducir una nueva,ahora  según los diagramas de mi veichulo tiene un pin Tx y Rx que comunica al transponder y la ECU, ya que como idea tenia intentar conectar este al arduino y poder ver si se puede leer el código de la llave y una ves esto mandar el codigo desde el arduino hasta la ECU que es la que maneja esto solo es una idea no se si podra realizar esto para no tener que implementar otro sistema de seguridad

RIG

En este caso no anularíamos el sistema, solo seria un tipo de "engaño" o by-pass ya que solo necesitamos desactivar el sistema cuando se acciona el arranque remoto o si se hace el encendido con un boton, el sistema de inmovilizador segura funcionando y es totalmente reversible
Quote
según tengo entendido en el caso que se pierda la llave se tiene que desmontar la computadora y borrar la llave e introducir una nueva
Esto no es correcto ya que la ecu no es la que se programa si no el sistema inmovilizador, y si bien hay algunos vehículos que se tiene que desmontar la memoria del inmo y reprogramarla (porque es mas barato que usar un equipo mucho mas caro como es el caso de algunos BMW),  todos se pueden re-programar por el puerto OBD2, primeramente tendria que saber que vehículo tienes para saber en donde estamos pisando.

Eso de leer el código de la llave por medio de las lineas Tx y Rx con el arduino no me atrevería a decir que es imposible pero, lo que si creo es que va a ser muy difícil "atrapar"  las señales y decodificarlas para después usarlas.

Para hacer el baypass del inmo solo necesitas un tramo de cable calibre 22AWG y un relevador, vas a dar entre 8 y 9 vueltas alrededor de la antena del inmo, y con los otros extremos vas a envolver la llave (donde esta el chip) y también le das algunas vueltas, digamos que estas haciendo un tipo de extensión de la antena para que puedas llevar la llave fuera del switch en un lugar escondido debajo del tablero, así cuando se active la ignición el inmo detecte la llave,  el relevador es para desconectar el sistema cuando la alarma este armada. Te comentaba que el sistema es algo vulnerable porque tendrias una llave dentro del vehiculo, pero pensando que se eliminaria el switch de ignicion y todo el control del sistema seria por el arduino esto le da la seguridad necesaria. Bueno soy muy malo dibujando, tratare de hacerte un plano y lo pongo para que quede mas claro lo que trate de explicarte, igual en algún lugar debo tener un plano hecho,  por ahora me voy a dormir, aquí son las 23:50 y tengo sueño
seguimos en contacto Salu2

Swift

Buenas a todos una pequeña actualización, ya que no e tenido mucho tiempo para invertir en el proyecto solo e modificado el código en la parte de millis por el motivo de paso por 0 a los 50 días aproximadamente según en varios post recomendaban restar para evitar esto no se si sera la forma correcta o si estoy equivocado o entendi mal. 
Antes
Code: [Select]
if (millis() >= (TiempoInicial2 + tiempoFuncion2))
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    flagSeguros = 0;
  }

Ahora
Code: [Select]
if (millis() - tiempoInicial1 >= tiempoFuncional1) // Desactivacion pines de seguros
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    tiempoInicial1 = 0;
    flagSeguros = 0;
  }

Codigo completo
Code: [Select]
/*Librerias*/
#include <Arduino.h>
#include <RCSwitch.h> //Libreria para control remoto.

/*Definiciones Entradas y Salidas */
const int sirena = 13,
          abrirBaul = 12,
          luzCortecia = 11,
          alertaIluminacion = 10,
          cerrarSeguros = 9,
          abrirSeguros = 8,
          ignicion = 7,
          velocidad = 6,
          botonValet = 5,
          pulsadorCapo = 4,
          pulsadorPuertas = 3,
          controlRadio = 2,
          subirVentanas = A4,
          bajarVentanas = A5;
RCSwitch mySwitch = RCSwitch();
/*Variables y Constantes*/
char comandos;
bool estadoIgnicion = 0,
     estadobotonValed = 0,
     estadopulsadorCapo = 0,   // 0(Abierto)/ 1(Cerrado)
    estadopulsadorPuertas = 0, // 0(Abierto)/ 1(Cerrado)
    flagSeguros = 0,
     armadoAutomatico = 0,
     armadoAlarma = 0;

long estadoControl = 0;
int estadoVelocidad = 0,
    contSirena = 0,
    flagSirena = 0,
    estadoSirena = LOW;

/* Temporizador (Millis) */

unsigned long tiempoInicial1;      // Tiempo Seguros
const long tiempoFuncional1 = 500; // Tiempo Seguros

unsigned long tiempoInicial2;       // Tiempo Alerta iluminacion
const long tiempoFuncional2 = 1200; // Tiempo Alerta iluminacion

unsigned long tiempoInicial3;      // Tiempo Sirena
const long tiempoFuncional3 = 100; // Tiempo Sirena

unsigned long tiempoInicial4;       // Armado Automatico Alarma
const long tiempoFuncional4 = 5000; // Armado Automatico alarma

void setup()
{
  Serial.begin(115200);
  pinMode(sirena, OUTPUT);
  pinMode(abrirBaul, OUTPUT);
  pinMode(luzCortecia, OUTPUT);
  pinMode(alertaIluminacion, OUTPUT);
  pinMode(cerrarSeguros, OUTPUT);
  pinMode(abrirSeguros, OUTPUT);
  pinMode(subirVentanas, OUTPUT);
  pinMode(bajarVentanas, OUTPUT);
  pinMode(ignicion, INPUT);
  pinMode(velocidad, INPUT);                      // Comprobar si es posible incluirlo
  pinMode(botonValet, INPUT);                     // Posiblemente NO
  pinMode(pulsadorCapo, INPUT);
  pinMode(pulsadorPuertas, INPUT);
  pinMode(controlRadio, INPUT);
  mySwitch.enableReceive(0);                       // pin 2 para control
}

void lecturaDatos()
{
  if (Serial.available() > 0)
  {
    comandos = Serial.read();
  }
  if (mySwitch.available())
  {
    estadoControl = mySwitch.getReceivedValue();
    if (estadoControl == 0)
    {
      Serial.println("error de codigo");
    }
    /*    else
    {
      Serial.print("codigo Recibido ");
      Serial.println(estadoControl);
    }   */
    mySwitch.resetAvailable();
  }
}
void asignacionPulsadores()
{
  estadoIgnicion = digitalRead(ignicion);
  estadoVelocidad = digitalRead(velocidad);
  estadobotonValed = digitalRead(botonValet);
  estadopulsadorCapo = digitalRead(pulsadorCapo);
  estadopulsadorPuertas = digitalRead(pulsadorPuertas);
}
void estadoSeguros(int estadoPuertas)
{
  digitalWrite(estadoPuertas, HIGH);
  digitalWrite(alertaIluminacion, HIGH); // En caso de utilizar señal negativa para encender relay como alternativa utilizar un blink
  tiempoInicial1 = millis();
  tiempoInicial2 = millis();
  flagSeguros = 1;
}
void loop()
{

  lecturaDatos();
  /*Control Automatico*/
 

  /*Control Manual */
  // Radio control y comando bluetooth

  if (((estadoControl == 11227985) || comandos == 'a') && (flagSeguros == 0)) // Comando y codigo para abir puertas
  {
    estadoSeguros(abrirSeguros);
    flagSirena = 3;
    contSirena = 0;
  }

  if (((estadoControl == 11227986) || comandos == 'c') && (flagSeguros == 0)) // Comando y codigo para cerrar puertas
  {
    estadoSeguros(cerrarSeguros);
    flagSirena = 2;
    contSirena = 0;
  }

  if (((estadoControl == 11227988) || comandos == 'b') && (flagSeguros == 0)) // Comando y codigo para abir el baul
  {
    estadoSeguros(abrirBaul);
    flagSirena = 4;
    contSirena = 0;
  }

  // Apagado de pines millis
  if (millis() - tiempoInicial1 >= tiempoFuncional1) // Desactivacion pines de seguros
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    tiempoInicial1 = 0;
    flagSeguros = 0;
  }

  if (millis() - tiempoInicial2 >= tiempoFuncional2) // Desactivacion pines de alerta iluminacion
  {
    digitalWrite(alertaIluminacion, LOW);
    tiempoInicial2 = 0;
  }
  if (contSirena < flagSirena) // Blink Sirena (Optimizar si se puede)
  {
    if (millis() - tiempoInicial3 >= tiempoFuncional3)
    {
      tiempoInicial3 = millis();

      if (estadoSirena == LOW)
      {
        estadoSirena = HIGH;
      }
      else
      {
        estadoSirena = LOW;
        contSirena++;
      }
    }
  }

  digitalWrite(sirena, estadoSirena);

  // Limpieza de variables
  estadoControl = 0;
  comandos = ' ';
}


Adjuntare todos los archivos que tenga al inicio del proyecto, también adjunto 2 videos funcionando tanto por rf como por bluetooth solo en modo manual, ahora intentaré añadir un modo para que me cierre las puertas después de un tiempo como una alarma común luego seguire implementando las sugerencias de RIG empezando por los vidrios automaticos.

Videos.

Funcionamiento contro RF
Funcionamiento por bluetooth


Swift

Buenas a todos actualizo el proyecto, e añadido el armado automático a un cierto tiempo además si está armada la alarma y se abre una puerta o capó se activa la sirena por un cierto tiempo en esta parte se puede añadir un relay que corte la alimentación de las bobinas para que no lo puedan encender el vehiculo, en mi caso no le pondré ya que se necesita la llave para poder encenderlo. Me falta añadir lo que es la luz de cortesía.

Ahora para lo que es los vidrios automáticos no se si sea mejor utilizar otro microcontrolador para controlar de forma individual  cada ventana y añadir las protecciones para lo cual se utilizará 1 puente h para cada ventana o dos l298n para las 4 y que cada puente h lleve un sensor para medir el consumo como el ACS712 o ustedes que me recomiendan.

Adjunto el codigo que tengo hasta el momento:

Code: [Select]
/*Librerias*/
#include <Arduino.h>
#include <RCSwitch.h> //Libreria para control remoto.
/*Definiciones Entradas y Salidas */
const int sirena = 13,
          abrirBaul = 12,
          luzCortecia = 11,
          alertaIluminacion = 10,
          cerrarSeguros = 9,
          abrirSeguros = 8,
          ignicion = 7,
          velocidad = 6,
          botonValet = 5,
          pulsadorCapo = 4,
          pulsadorPuertas = 3,
          controlRadio = 2,
          subirVentanas = A4,
          bajarVentanas = A5;
RCSwitch mySwitch = RCSwitch();
/*Variables y Constantes*/
char comandos;
bool estadoIgnicion = 0,            // 0(Apagado) / 1(Prendido)
    estadobotonValed = 0,
    estadopulsadorCapo = 0,         // 0(Abierto) / 1(Cerrado)
    estadopulsadorPuertas = 0,      // 0(Abierto) / 1(Cerrado)
    armadoAutomatico = 0,
    armadoAlarma = 0,
    flagAlarma = 0,
    flagIluminacion = 0,
    flagSirena = 0,
    flagSeguros = 0,
    flagArmado = 0,
    estadoSirena = LOW;
long estadoControl = 0;
int estadoVelocidad = 0,
    contSirena = 0,
    blinkSirena = 0;
/* Temporizador (Millis) */
unsigned long tiempoInicial1;                         //Tiempo desactivacion de seguros
const unsigned long tiempoFuncional1 = 700;           //Tiempo desactivacion de seguros
unsigned long tiempoInicial2;                         // Tiempo Alerta iluminacion
const unsigned long tiempoFuncional2 = 1200;          // Tiempo Alerta iluminacion
unsigned long tiempoInicial3;                         // Tiempo Sirena
const unsigned long tiempoFuncional3 = 100;           // Tiempo Sirena
unsigned long tiempoInicial4;                         // Armado Automatico Alarma
const unsigned long tiempoFuncional4 = 10000;         // Armado Automatico alarma
unsigned long tiempoInicial5;                         // Activacion de Sirena y luces
const unsigned long tiempoFuncional5 = 10000;         // Activacion de Sirena y luces
void setup()
{
  Serial.begin(115200);
  pinMode(sirena, OUTPUT);
  pinMode(abrirBaul, OUTPUT);
  pinMode(luzCortecia, OUTPUT);
  pinMode(alertaIluminacion, OUTPUT);
  pinMode(cerrarSeguros, OUTPUT);
  pinMode(abrirSeguros, OUTPUT);
  pinMode(subirVentanas, OUTPUT);
  pinMode(bajarVentanas, OUTPUT);
  pinMode(ignicion, INPUT);
  pinMode(velocidad, INPUT);                        // Comprobar si es posible incluirlo
  pinMode(botonValet, INPUT);                       // Posiblemente NO
  pinMode(pulsadorCapo, INPUT);
  pinMode(pulsadorPuertas, INPUT);
  pinMode(controlRadio, INPUT);
  mySwitch.enableReceive(0);                        // pin 2 para control
}
void lecturaDatos()
{
  if (Serial.available() > 0)
  {
    comandos = Serial.read();
  }
  if (mySwitch.available())
  {
    estadoControl = mySwitch.getReceivedValue();
    if (estadoControl == 0)
    {
      Serial.println("error de codigo");
    }
    {
      Serial.print("codigo Recibido ");
      Serial.println(estadoControl);
    }
    mySwitch.resetAvailable();
  }
}
void pulsadores()
{
  estadoIgnicion = digitalRead(ignicion);
  estadoVelocidad = digitalRead(velocidad);
  estadobotonValed = digitalRead(botonValet);
  estadopulsadorCapo = digitalRead(pulsadorCapo);
  estadopulsadorPuertas = digitalRead(pulsadorPuertas);
}
void estadoSeguros(int estadoPuertas)
{
  digitalWrite(estadoPuertas, HIGH);

  tiempoInicial1 = millis();
  tiempoInicial2 = millis();
  flagSeguros = 1;
  if (estadoIgnicion == 0)
  {
    digitalWrite(alertaIluminacion, HIGH); // En caso de utilizar señal negativa para encender relay como alternativa utilizar un blink
    flagIluminacion = 1;
    flagSirena = 1;
  }
}
void loop()
{
  lecturaDatos();
  pulsadores();

  /*Control Automatico*/
  /*Armado Automatico 30 segundo */
  if ((estadoIgnicion == 0) && (estadoIgnicion == 0) && (armadoAutomatico == 0) && (estadopulsadorPuertas == 1) && (estadopulsadorCapo == 1))
  {
    if (millis() - tiempoInicial4 >= tiempoFuncional4)
    {
      estadoSeguros(cerrarSeguros);
      armadoAutomatico = 1; // Para evitar que se vuelva armar la alrma cada cierto tiempo.
      flagSirena = 3;       // Sonidos Armado de la Alarma.
      contSirena = 0;
    }
  }
  if ((estadopulsadorPuertas == 0) || (estadopulsadorCapo == 0) || (estadoIgnicion == 1)) // Mientras las puertas esten abiertas o el vehiculo encendido
  {
    tiempoInicial4 = millis();
  }
  if ((armadoAutomatico == 1) && ((estadopulsadorPuertas == 0) || (estadopulsadorCapo == 0)||(estadoIgnicion == 1))) // Alarma por apertura de puertas o capo
  {
    digitalWrite(sirena, HIGH);
    digitalWrite(alertaIluminacion, HIGH);
    flagAlarma = 1;
    tiempoInicial5 = millis();
  }
  /*Control Manual */
  // Radio control y comando bluetooth
  if (((estadoControl == 11227985) || comandos == 'a') && (flagSeguros == 0)) // Comando y codigo para abir puertas
  {
    estadoSeguros(abrirSeguros);
    if (estadoIgnicion == 0)
    {
      armadoAutomatico = 0;
      blinkSirena = 3;
      contSirena = 0;
      tiempoInicial4 = millis();
    }
  }
  if (((estadoControl == 11227986) || comandos == 'c') && (flagSeguros == 0)) // Comando y codigo para cerrar puertas
  {
    estadoSeguros(cerrarSeguros);
    if (estadoIgnicion == 0)
    {
      blinkSirena = 2;
      contSirena = 0;
      armadoAutomatico = 1;
    }
  }
  if (((estadoControl == 11227988) || comandos == 'b') && (flagSeguros == 0)) // Comando y codigo para abir el baul
  {
    estadoSeguros(abrirBaul);
    if (estadoIgnicion == 0)
    {
      blinkSirena = 4;
      contSirena = 0;
    }
  }
  if ((flagSeguros == 1) && (millis() - tiempoInicial1 >= tiempoFuncional1)) // Desactivacion pines de seguros
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    flagSeguros = 0;
  }
  if ((flagIluminacion == 1) && (millis() - tiempoInicial2 >= tiempoFuncional2)) // Desactivacion pines de alerta iluminacion
  {
    digitalWrite(alertaIluminacion, LOW);
    flagIluminacion = 0;
  }
  if ((flagSirena == 1) && (contSirena < blinkSirena)) // Blink Sirena (Optimizar si se puede)
  {
    if (millis() - tiempoInicial3 >= tiempoFuncional3)
    {
      tiempoInicial3 = millis();

      if (estadoSirena == LOW)
      {
        estadoSirena = HIGH;
      }
      else
      {
        estadoSirena = LOW;
        contSirena++;
      }
    }
    digitalWrite(sirena, estadoSirena);
  }
  if ((flagAlarma == 1) && (millis() - tiempoInicial5 >= tiempoFuncional5))
  {
    digitalWrite(sirena, LOW);
    digitalWrite(alertaIluminacion, LOW);
    flagAlarma = 0;
  }
  estadoControl = 0; // Limpieza de variables
  comandos = ' ';    // Limpieza de variables
}

Swift

#8
Jan 29, 2018, 10:08 pm Last Edit: Jan 29, 2018, 10:17 pm by Swift
Buenas a todos otra pequeña actualización, he añadido la luz de cortesía con un efecto fade-out sin la utilización de un ciclo for gracias  a la explicación de  IgnoranteAbsoluto  les dejo el enlace por si alguien le interesa https://forum.arduino.cc/index.php?topic=516069.0, ahora revisando las instalaciones me tope con que por donde detecta si alguna puerta está abierta que es una señal a gnd también la utiliza para encender la luz de cortesía y aqui es donde me perdi, RIG has visto alguna vez esto ya que las alarmas que e instalado tiene conexiones separadas tanto para detectar las puertas como para encender la luz de cortesía.También tenia la idea de llevar una señal de cada puerta, capo, baul, todo esto a la alarma e implementar una red Can-Bus con diferentes módulos o asu vez que muestre toda esta información en una pantalla algo parecido a esto DeLorean o Nissan 200sx S13.
Adjunto el código por si a alguien le interesa.

RIG

Disculpa el retraso, he andado muy ocupado y no me sobra tiempo ni para encender la pc...
Quote
por donde detecta si alguna puerta está abierta que es una señal a gnd también la utiliza para encender la luz de cortesía
Asi se utiliza cuando no cuentan indicador individual de puerta abierta, es decir solo indican que hay una puerta abierta pero no te dice cual, es un sistema sencillo que manda gnd a la luz de cortesia y al mismo tiempo al testigo de puerta como es tu caso. En el caso  de la mayoría de los vehiculos modernos el sistema es un poco mas complejo: aqui todos los interruptores de puerta, capo y baul van conectados al BCM y este se encarga de encender y apagar la luz interior, hacer el fade out y mostrar si esta abierta alguna puerta o capo o baul ademas de indicar cual.
Como ves lo mas sencillo es unificar todos los interruptores de puerta y cualquier puerta que se abra enciende la luz interior y activa la alarma, si quieres mostrar en pantalla todas las puertas de forma individual tendras que conectar cada interruptor al arduino, pero ten en cuenta que ocuparas 6 puertos, de otro modo solo utilizas 2   

Swift

Pues si utilizo todos las conexiones de la alarma original creo que ya me faltan pines del arduino uno en total seria 12:
Azul Amarillo = 12v
Blanco Negro = GND
Rosado verde = Sirena (+)
Rojo blanco = Detector de puertas y luz de cortecia
Morado amarillo = Pulsador de capo (-)
Azul rojo = Abre seguros (-)
Verde amarillo = Cierra seguros (-)
Amarillo verde = Señal de parada (-)
Negro amarillo = Ignición (+)
Verde rojo = Horn (-)
Rojo blanco = Luz de cortecia baúl (-)
Azul negro = Detector de llave (-)
Violeta blanco Velocidad ECU (+)
Con esto me faltaría el sensor de golpe, la comunicación por SPI para la comunicación con la red CAN pues creo que al utilizar un arduino mega los pines a ocupar no seria un problema.

Swift

#11
Apr 21, 2018, 12:06 am Last Edit: Apr 21, 2018, 12:19 am by Swift
Continuando con el proyecto tengo funcionando:
  • Armado automático cuando puertas, capo y baul se encuentran cerradas después de un cierto tiempo, se podría añadir para que excluya alguna puerta y a la vez emita una alerta.
  • La luz de cortesía realiza el efecto fade cuando el vehiculo se encuentra encendido y se abre alguna puerta, ademas de cuando se enciende el vehiculo.
  • Cierre de seguros segun la velocidad del vehiculo en la que se encuentre esta se la puede definir a una mayor velocidad sea el caso, para esto utilice el código de Nick Gammon específicamente el que utiliza el input capture pin 49 y cambien algunas partes para utilizar el timer 4 del arduino mega, con este código se puede leer frecuencias de hasta 200kHz.
  • Cuando se ordena mediante el control abrir alguna puerta o cerrarla, abrir baul utiliza la sirena como advertencia y cuando la alarma se encuentra armada y se abre alguna puerta empieza a sonar el claxon como advertencia, si se activa después de un determinado tiempo se apaga mientras se hayan cerrado las puertas o desactivado con el control.


Adjunto el código y el hardware como estoy probando, creo que se puede mejorar algunas cosas.  



Go Up