Control de aire acondicionado (Automóvil)

Hola a todos.

Mi proyecto se trata de remplazar el " Amplificador del aire acondicionado" de un Toyota Corolla 2005 G9, y posteriormente añadirle mas funciones, para lo cual pretendo utilizar:

  • 1 Arduino Mega (Control de servos, sensores de temperatura y luz, y activación de diferentes relay mediante transistores)
  • 1 Arduino Uno + Can-Bus Shield (Lectura de temperatura de motor, revoluciones por minuto, velocidad etc).
  • 1 Intel NUC ( Cerebro).
  • 1 Pantalla de 10.1 táctil (Interfaz de usuario).

Ahora para empezar este proyecto tengo los diagramas de conexiones del automóvil como son los del Enfriamiento del motor que en el caso de este automóvil utiliza un solo ventilador tanto para el sistema de aire acondicionado como para enfriamiento del motor el cual por ahora tengo con un puente para que pase todo un tiempo prendido:

Los de la ECU encargada de aumentar las revoluciones del motor al encender el aire acondicionado y también encargada de cortar el aire acondicionado en caso de algún fallo o en el caso del motor necesite, además esta envía señales digitales de temperatura del motor, revoluciones tanto al tablero de instrumentos y al aire acondicionado

El amplificador de aire acondicionado el cual controla reveladores, servos, y sensores

Codigo

Bonito el proyecto, yo el tema del aire acondicionado en vehículos no lo domino, ademas dependerá del modelo. Si te digo que suele activarse mediante un electroiman que conecta la polea del compresor al motor, por lo que no creo que arduino tenga muchos problemas para activarlo, también deberás acceder al ventilador del evaporador para regular la potencia del aire, hasta aquí fácil, mas complicado es regular las rejillas zona por la que sale el aire, recirculacion o renovación de aire etc.
En otras palabras deberás investigar como es tu instalación de aire acondicionado, y definir hasta donde quieres llegar, la parte que le toca a arduino creo que es la mas simple y donde mas se te podrá ayudar, para acceder a los elementos de la instalación de aire si deberás tener conocimientos del automóvil.

Si de echo tienes razón tiene un relay que activa un embrague magnético del A/C, lo que es la instalación del auto la tengo claro y es lo que mejor conozco lo único que necesito que me ayuden es por donde empezar con la programación del arduino. Ya tengo identificado todo los servomotores que controlan la re circulación del aire y 4 sensores que tiene, por el momento estoy diseñando un circuito que que me permita controlar la velocidad del ventilador del evaporador con 1 transistor mosfet irf730 y un transistor npn 2n2222 para que el mediante las salidas pwn del arduino regule la velocidad, el codigo que tengo por el momento me activa y desactiva mediante un comando el motor completo a su velocidad máxima no se como hacerle variar para que poco a poco vaya subiendo o disminuyendo seguiré investigando, en cuanto lo funcione subo algunas fotos gracias por comentar

Estas en proyectos, entonces si no compartes información no podemos ayudarte mas que a grandes rasgos.
Solo dices que quieres controlar un aire acondicionado.

Como no has leído las normas del foro, no prestaste atención a como presentar la información.

Entonces.. que auto tienes, donde estan los esquemas del sistema electrico del aire acondicionado de tu auto.
Postealos. Usa las etiquetas además.

Y entonces.. si podremos hablar un poco a tu nivel. Si no, es un monólogo y solo diremos cosas superficiales.

El auto al que le voy a intentar adapta es un Toyora Corolla 2005 serie 1zze122 la imagen siguiente es el esquema eléctrico solo del aire acondicionado,

lo que pretendo es remplazar el A/C amplifier con el arduino y que este sea gobernado mediante una pc lo que primero tengo en mente es hacer que el arduino mega controle lo que es la velocidad del motor (blower motor) esta es la foma como pretendo conectarlo

y el codigo que estoy utilizando

int motor=3;
void setup() {
  Serial.begin(9600); 
}
void loop() {
   if (Serial.available()){
        char a = Serial.read();    
    if (a>='0' && a<='9'){ 
      int velocidad = map(a,'0','9',0,255);
      analogWrite(motor,velocidad);       
      } 
  }
}

Eso es lo que e avanzado del proyecto.

Porque le envias 0 a 9?
Es solo para probar la variabilidad?

Si exactamente.

Coloca un diodo en antiparalelo con el ventilador a controlar o tendras problemas con el MOSFET a corto o mediano plazo.
Un IN4002 será suficiente. Cátodo a +12V y ándoo al otro extremo y el DRain del MOSFET.

Que harás con los sensores?
Vas a usar los existentes o pondrás propios?

Pues tenia pensado usar los que tiene, ya que el el sensor de temperatura del evaporador esta medio complicado remplazarlo me tocaría desarmar medio tablero, en caso que no funcione pues pondría propios, adjunto imagen del sensor de temperatura ambiental en la parte de abajo y el fotodiodo en la parte superior.

Bueno vas a tener que trabajar entonces encontrando equivalencias de lo que miden.
Seguramente son NTC o PTC para los sensores de temperatura.

Bueno actualizo el proyecto ya que no e tenido tiempo por seguirlo realizando monte en una protoboar el control de velocidad y ademas añadí un relay para encender el ventilador y poder probar que todo este funcionando, el cual funciono perfectamente como esperaba pero el código que estoy utilizando tengo que estar mandando del 0 al 5 para que varia la velocidad,

int ventilador=2;
int relay=3;
void setup() {
  Serial.begin(115200); 
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
}
void loop() {
  if (Serial.available()){
  char a = Serial.read();    
  if (a>='0'&&a<='5'){ 
  int velocidad = map(a,'0','5',0,255);
  analogWrite(ventilador,velocidad); 
  Serial.println(a);
} 
  if (a=='q'){
  digitalWrite(relay, HIGH);
  Serial.println("Encendido" );
}
  else
{
  if (a=='w'){
  digitalWrite(relay, LOW);
  Serial.println("Apagado");
}
}
}
}

e intentado para que mediante 2 teclas me funcione como por ejemplo 'a' y 'b' que mandándola un cierto numero de veces vaya aumentando y disminuyendo pero no lo e logrado, si alguien me puede ayudar en esta parte o algún texto acerca de esto ya que en la mayoría de ejemplos que hay en Internet lo hacen mediante botones pero no mediante comunicación serial.
Los termoresistor que tiene son NTC ya lo comprobe con un multimetro ahora al intentar leer valores me salen valores absurdos, seguiré trabajando en eso para identificar la resistencias.
Ademas el foto-diodo según encontré información conduce en sentido contrario una pequeña cantidad de corriente no se si esto afectar al arduino o podria llegar a dañarlo, estaba pensando en en hacerlo un fototransistor para evitar estos riesgos, estas son las paginas de donde saque la información:Fotodiodo: Definición, características y tipos - IngenieríaElectrónica ,Fotodiodo - Wikipedia, la enciclopedia libre y esta es la forma en que pienso hacerlo foto transistor

adjunto algunas imágenes del motón de cables que tengo que comprobar y el hueco que pienso tapar con una pantalla táctil

como tengo montado en la protoboard

Buenas a todos sigo avanzando poco a poco el proyecto, hice funcionar todo lo del aire acondiciona por separado y ahora estoy uniendo todo en uno solo y me surgió un problema para algunas protecciones del sistema de aire acondicionado como refrigeración del motor no estoy seguro si el código esta mal planteado en el sentido de que debo utilizar los if else o los swicht case o hay otra forma de hacerlo que me recomiendan ustedes, adjunto el esquema del ventilador del radiador

Lo que necesito hacer es que el arduino mega me encienda el (FAN NO.1 Relay) al momento que yo encienda el compresor del aire acondicionado, con esta parte del código lo logre

    case 'o':
      digitalWrite(clutchmagrelay, HIGH);
      digitalWrite(fanno1, HIGH);
      Serial.println("Encendido A/C" );
      comando = ' ';
      break;

    case 'p':
      digitalWrite(clutchmagrelay, LOW);
      digitalWrite(fanno1, LOW);
      Serial.println("Apagado A/C" );
      comando = ' ';
      break;

y ahora también necesito que de forma automática me encienda el (FAN NO.1 Relay) a lo que la ECU del automóvil manda un negativo ya que esta enciende otro relay que es (FAN NO.2 Relay) ya que esta mandando un negativo y con el fin de aislar el arduino de los 12v del automóvil estoy utilizando optoacopladores para que envié una seña de 0 y 5v al arduino, esta es la conexión que estoy utilizando

y este es el código que utilizo para que haga esa parte

switch (fan2) {
    case 0:
      digitalWrite(fanno1, HIGH);
      break;
    case 1:
      digitalWrite(fanno1, LOW);
      break;
  }

mi problema es que al activar el compresor del aire acondicionado mediante el monitor serial ya no se activa sino solo a lo que se activa el octoacoplador, este es todo el código que estoy utilizando

#include <Servo.h>
#define pinServo1 10
#define pinServo2 9
Servo servomixcontrol;
Servo servoventmode;
const int blower = 2; //Blower motor
const int heaterrelay = 53; //Heater relay
const int defrelay = 52; //defrost relay
const int rec = 51; //Air recirculation
const int fre = 50; //Air Fresh
const int clutchmagrelay = 49; //Clutch relay a/c
const int fanno1 = 48; //Relay Fan No 1
const int fanno2 = 38; // Relay Fan No 2
char comando;
int posicion;
int in = 0;
int au = 51;
int cue = 0;
int cuen = 1;
int fan2 = 0;
void setup() {
  Serial.begin(9600);
  servomixcontrol.attach(pinServo1);
  servoventmode.attach(pinServo2);
  pinMode(blower, OUTPUT);
  pinMode(heaterrelay, OUTPUT);
  pinMode(defrelay, OUTPUT);
  pinMode(rec, OUTPUT);
  pinMode(fre, OUTPUT);
  pinMode(clutchmagrelay, OUTPUT);
  pinMode(fanno1, OUTPUT);
  pinMode(fanno2, INPUT);
}

void loop() {
  fan2 = digitalRead(fanno2);
  if (Serial.available() > 0) {
    comando = Serial.read();
    posicion = Serial.parseInt();
  }
  switch (fan2) {
    case 0:
      digitalWrite(fanno1, HIGH);
      break;
    case 1:
      digitalWrite(fanno1, LOW);
      break;
  }
  switch (comando) {

    case 'q':
      in = in + au;
      if (in > 255) {
        in = 255;
      }
      cue = cue + cuen;
      if (cue == 5);
      if (cue > 5) {
        cue = 5;
      }
      analogWrite(blower, in);
      Serial.println(cue);
      comando = ' ';
      break;

    case 'w':
      in = in - au;
      if (in > 255) {
        in = 255;
      }
      cue = cue - cuen;
      if (cue == 5);
      if (cue < 0) {
        cue = 0;
      }
      analogWrite(blower, in);
      Serial.println(cue);
      comando = ' ';
      break;

    case 'e':
      digitalWrite(heaterrelay, HIGH);
      Serial.println("Encendido" );
      comando = ' ';
      break;

    case 'r':
      digitalWrite(heaterrelay, LOW);
      Serial.println("Apagado");
      comando = ' ';
      break;

    case 't':
      digitalWrite(defrelay, HIGH);
      Serial.println("Desempaña Parabrisa Trasero Encendido" );
      comando = ' ';
      break;

    case 'y':
      digitalWrite(defrelay, LOW);
      Serial.println("Desempaña Parabrisa Trasero Apagado");
      comando = ' ';
      break;

    case 'u':
      digitalWrite(rec, HIGH);
      digitalWrite(fre, LOW);
      Serial.println("Air recirculation" );
      comando = ' ';
      break;

    case 'i':
      digitalWrite(rec, LOW);
      digitalWrite(fre, HIGH);
      Serial.println("Air Fresh" );
      comando = ' ';
      break;

    case 'o':
      digitalWrite(clutchmagrelay, HIGH);
      digitalWrite(fanno1, HIGH);
      Serial.println("Encendido A/C" );
      comando = ' ';
      break;

    case 'p':
      digitalWrite(clutchmagrelay, LOW);
      digitalWrite(fanno1, LOW);
      Serial.println("Apagado A/C" );
      comando = ' ';
      break;

    case'a':
      servomixcontrol.write(posicion);
      Serial.println(posicion);
      comando = ' ';
      break;

    case's':
      servoventmode.write(posicion);
      Serial.println(posicion);
      comando = ' ';
      break;
  }
}

También adjunto todas las conexiones para su simulación en proteus , en el archivo de proteus no estoy utilizando ningún diodo de protección ya que los relay y el motor que están integrados en el automóvil ya los tienen integrados por ende a mi parecer ya no son necesario ponerlos.

https://drive.google.com/drive/folders/0B1ZIep4iFN2ydjk2ODNCdWtTSHc?usp=sharing

No entiendo porque quieres aislar arduino del automóvil. Seria mas sencillo que ambos usaran la misma gnd pues al final vas a alimentar a arduino directo desde un positivo después de contacto por tanto necesitarás estar en el mismo potencial del vehículo.

Luego una pregunta si quitas la centralita de ac no te da fallo la ECU del vehículo? Lo pregunto porque en el Córdoba se daño el tablero y cada vez que metía diagnosis aparecía un fallo.

podría ser otra opción el engañar a la centralita para que haga lo que arduino manda y por can bus o lo que use tollota leer la información de la propia centralita y arduino que active los "botones" por medio de relés

A todo esto que vas a hacer en esa parte de salpicadero para meterte en tremendo engorro.

A mi me va a tocar bailar con algo parecido en un futuro así que estaré atento

y ahora también necesito que de forma automática me encienda el (FAN NO.1 Relay) a lo que la ECU del automóvil manda un negativo ya que esta enciende otro relay que es (FAN NO.2 Relay) ya que esta mandando un negativo y con el fin de aislar el arduino de los 12v del automóvil estoy utilizando optoacopladores para que envié una seña de 0 y 5v al arduino, esta es la conexión que estoy utilizando

debo entender que tu auto trabaja con POSITIVO a chasis?

En respuesta de juand91:
1)La alimentación no es lo que quiero aislar ya que eso si compartiría el mismo gnd sino mas bien quiero aislar las protecciones del aire acondicionado ya que estas funcionan a 12v el cual en caso de exceder le presión se desconecta un interruptor que se encuentra en la cañerías del aire acondicionado por lo cual deja de pasar los 12v y en este caso el arduino desconecte el compresor del aire acondicionado.
2)En mi caso no me da ningún fallo e revistado varias veces ya que esta no se comunica con la ECU con la cual pueda informar de algún fallo del aire acondicionado, lo que si en esta le llegan señales digitales de revoluciones por minuto, velocidad, temperatura del refrigerante, en el modelo mas nuevo si e visto que cuando falla algo en el aire acondicionado salta el errores.
3)En mi caso el no podría utilizar la centralita ya que mis mecánicos realizando mantenimiento me la estropearon no tengo ni idea como, por lo que esto me quedo descartado desde un principio, pero si tengo pensado utilizarla para leer otra información del vehículo.
4)Lo que primero tenia en mente era taparlo con una pantalla de 7 pulgadas y una raspberry pi para que controle el A/C y como centro de entretenimiento, pero me emocione un poco y compre una de 10 pulgadas y una Intel Nuc.
En respuesta de surbyte:
No mi auto no trabaja con positivo a chasis

hola si entendí bien fanno1 tiene que funcionar cuando lo mandes por serial o cuando fan2 este en uno

para solucionarlo rapido he eliminado es swith del fan2 pues arduino segun va leyendo segun va haciendo. entonces solo le ponerlo a 1 el ciclo en el que le llega la letra correspondiente. luego en la siguiente lectura lee fan2= o pues fanno1 tambien a 0 de hay el problema. cree una variable fan1 que memoriza como esta el AC asi la salida es una or entre la ECU y el AC

espero que funcione pues estoy sin forma de simular el codigo

#include <Servo.h>
#define pinServo1 10
#define pinServo2 9
Servo servomixcontrol;
Servo servoventmode;
const int blower = 2; //Blower motor
const int heaterrelay = 53; //Heater relay
const int defrelay = 52; //defrost relay
const int rec = 51; //Air recirculation
const int fre = 50; //Air Fresh
const int clutchmagrelay = 49; //Clutch relay a/c
const int fanno1 = 48; //Relay Fan No 1
const int fanno2 = 38; // Relay Fan No 2
char comando;
int posicion;
int in = 0;
int au = 51;
int cue = 0;
int cuen = 1;
int fan2 = 0;
int fan1 = 0;


void setup() {
  Serial.begin(9600);
  servomixcontrol.attach(pinServo1);
  servoventmode.attach(pinServo2);
  pinMode(blower, OUTPUT);
  pinMode(heaterrelay, OUTPUT);
  pinMode(defrelay, OUTPUT);
  pinMode(rec, OUTPUT);
  pinMode(fre, OUTPUT);
  pinMode(clutchmagrelay, OUTPUT);
  pinMode(fanno1, OUTPUT);
  pinMode(fanno2, INPUT);
}

void loop() {
  fan2 = digitalRead(fanno2);
  digitalWrite(fanno1, (fan2 || fan1));

  if (Serial.available() > 0) {
    comando = Serial.read();
    posicion = Serial.parseInt();
  }
  

  switch (comando) {

    case 'q':
      in = in + au;
      if (in > 255) {
        in = 255;
      }
      cue = cue + cuen;
      if (cue == 5);
      if (cue > 5) {
        cue = 5;
      }
      analogWrite(blower, in);
      Serial.println(cue);
      comando = ' ';
      break;

    case 'w':
      in = in - au;
      if (in > 255) {
        in = 255;
      }
      cue = cue - cuen;
      if (cue == 5);
      if (cue < 0) {
        cue = 0;
      }
      analogWrite(blower, in);
      Serial.println(cue);
      comando = ' ';
      break;

    case 'e':
      digitalWrite(heaterrelay, HIGH);
      Serial.println("Encendido" );
      comando = ' ';
      break;

    case 'r':
      digitalWrite(heaterrelay, LOW);
      Serial.println("Apagado");
      comando = ' ';
      break;

    case 't':
      digitalWrite(defrelay, HIGH);
      Serial.println("Desempaña Parabrisa Trasero Encendido" );
      comando = ' ';
      break;

    case 'y':
      digitalWrite(defrelay, LOW);
      Serial.println("Desempaña Parabrisa Trasero Apagado");
      comando = ' ';
      break;

    case 'u':
      digitalWrite(rec, HIGH);
      digitalWrite(fre, LOW);
      Serial.println("Air recirculation" );
      comando = ' ';
      break;

    case 'i':
      digitalWrite(rec, LOW);
      digitalWrite(fre, HIGH);
      Serial.println("Air Fresh" );
      comando = ' ';
      break;

    case 'o':
      digitalWrite(clutchmagrelay, HIGH);
      fan1=1;
      Serial.println("Encendido A/C" );
      comando = ' ';
      break;

    case 'p':
      digitalWrite(clutchmagrelay, LOW);
      fan1 = 0;
      Serial.println("Apagado A/C" );
      comando = ' ';
      break;

    case'a':
      servomixcontrol.write(posicion);
      Serial.println(posicion);
      comando = ' ';
      break;

    case's':
      servoventmode.write(posicion);
      Serial.println(posicion);
      comando = ' ';
      break;
  }
}

Pues si funciona de maravilla en la simulación no hay ningún problema, muchas gracias por tu ayuda juan91

que onda mira fijate para acivar el aire acondicionado es algo simple podes simplemente utilisar un un relay para que esta exite el relay del cloutch del compresor pero ademas de eso tenes que activar el ventilador del motor para que este no se sobre caliente y tenes que colocarle un siclo a modo que cuando ta este frio a una temperatura deseada este desactive el compresor y el ventilador.

y para ahorrarte problemas con el blower simplemnte dejalo activado y actibalo con positivo

Pollo_98 Proque un relay para activar otro relay, no seria mejor utilizar un transistor o octoaclopador para activar el relay del embrague magnético , ahora es cierto lo que dices que debe accionar el ventilador al encenderse el aire acondicionado, y ademas debe indicarle a la ECU que suba las revoluciones del motor (ralentí) lo cual ya tengo implementado, ahora el problema que tengo es que mi unidad del aire acondicionado controlaba el ventilador del motor el cual se encendía a cierta temperatura lo cual ahora tengo en puente para que siempre pase prendido, esto pienso lo cual pienso solucionar con la shield can-bus y este le indique al arduino que del aire acondicionado que debe encender la refrigerancion del motor (ventilador)

Bueno después de un tiempo tengo casi todo funcionando a excepción de un sensor DHT22 que aun no me llega, ya que para los servos que tiene incluido el sistema me toco hacer la parte de control les adjunto los diagramas y pagina con los componentes y un vídeo por si se quieren hacer su propios servos


[Servos - HomoFaciens](http://www.homofaciens.de/technics-base-circuits-
servos_en.htm)
Servos - working principle and homemade types - YouTube

Mi primer prototipo con el cual tengo funcionando todo

No es lo mas adecuado, pero funciona, próximamente lo are mas pequeño y todo en una sola placa